Last active
November 27, 2019 18:15
-
-
Save shirts/7628d04bad73548565433ab71995ae55 to your computer and use it in GitHub Desktop.
Lucky Numbers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class LuckyNumbers | |
attr_accessor :lucky_number | |
LUCKY_NUMBER = 7 | |
INTERVAL = 9 | |
def initialize(min = 0) | |
@lucky_number = min.to_i - 1 | |
end | |
def lucky?(number) | |
sum = number | |
loop_times(number).times { sum = sum_digits(sum) } | |
sum == LUCKY_NUMBER | |
end | |
def numbers | |
Enumerator.new do |yielder| | |
loop do | |
self.lucky_number += 1 | |
yielder.yield(lucky_number) if lucky?(lucky_number) | |
end | |
end | |
end | |
private | |
def sum_digits(number) | |
number.digits.sum | |
end | |
def loop_times(number) | |
number.digits.select { |l| !l.zero? }.length | |
end | |
end | |
lucky_numbers = LuckyNumbers.new(ARGV[0]).numbers | |
loop do | |
lucky_number = lucky_numbers.next | |
$stdout.puts lucky_number | |
break if lucky_number + (LuckyNumbers::INTERVAL - 1) > ARGV[1].to_i | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require_relative 'lucky_numbers' | |
describe LuckyNumbers do | |
let!(:min) { 100 } | |
let!(:lucky_numbers) { described_class.new(min) } | |
describe '#initialize' do | |
it 'sets lucky_number instance variable to one number less than min arg' do | |
expect(lucky_numbers.lucky_number).to eq(min - 1) | |
end | |
end | |
describe '#is_lucky?' do | |
it 'returns true when a number is lucky' do | |
num = 62_431 | |
expect(lucky_numbers.lucky?(num)).to be true | |
num2 = 2_298_193_999_999_999_999_999_999_999_999_999_999_999_999_999_998_984_398_249_328_493_829_489_238_982_394_823_948_392_489_489_384_394_894_392_893_274_923_748_923_748_937_248_973_289_473_298_479_828_329_748_937_489_735 | |
expect(lucky_numbers.lucky?(num2)).to be true | |
end | |
it 'returns false when a number is not lucky' do | |
num = 62_432 | |
expect(lucky_numbers.lucky?(num)).to be false | |
end | |
end | |
describe '#numbers' do | |
it 'returns an enumerator' do | |
expect(lucky_numbers.numbers).to be_an Enumerator | |
end | |
it 'responds to next' do | |
expect(lucky_numbers.lucky_number).to_not eq(106) | |
expect(lucky_numbers.numbers.next).to eq(106) | |
end | |
it 'updates the @lucky_number instance variable' do | |
lucky_numbers.numbers.next | |
expect(lucky_numbers.lucky_number).to eq(106) | |
lucky_numbers.numbers.next | |
expect(lucky_numbers.lucky_number).to eq(115) | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment