Skip to content

Instantly share code, notes, and snippets.

@shirts
Last active November 27, 2019 18:15
Show Gist options
  • Save shirts/7628d04bad73548565433ab71995ae55 to your computer and use it in GitHub Desktop.
Save shirts/7628d04bad73548565433ab71995ae55 to your computer and use it in GitHub Desktop.
Lucky Numbers
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
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