Станимира обнови решението на 21.10.2015 23:39 (преди над 9 години)
+class Integer
+ def prime?
+ is_prime = true
+
+ (2..self/2).each do |i|
+ if self % i == 0
+ is_prime = false
+ break
+ end
+ end
+
+ is_prime and self > 1
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(count, first_two_members = {first: 1, second: 1})
+ @count = count
+ @first = first_two_members[:first]
+ @second = first_two_members[:second]
+ end
+
+ def each
+ previous = @first
+ current = @second
+ counter = 0
+
+ while counter < @count
+ yield previous
+ current, previous = current + previous, current
+ counter += 1
+ end
+ end
+end
+
+class RationalSequence
+ include Enumerable
+
+ def initialize(count = Float::INFINITY)
+ @count = count
+ end
+
+ def generate_next_number(n, d)
+ if n%2 == d%2
+ n+= 1
+ d-= 1 unless d == 1
+ else
+ d+= 1
+ n-= 1 unless n == 1
+ end
+
+ number = Rational(n, d)
+
+ # if the numerator divides the denominator evenly
+ # or if they are equal
+ # then the rational number was already generated earlier
+ if n%d != 2 and n != d
+ number
+ else
+ generate_next_number(n, d)
+ end
+ end
+
+ def each
+ n = 1
+ d = 1
+ counter = 0
+
+ if @count > 0
+ yield Rational(n, d)
+ counter += 1
+ end
+
+ while counter < @count
+ number = generate_next_number(n, d)
+ yield number
+
+ n = number.numerator
+ d = number.denominator
+ counter += 1
+ end
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(count)
+ @count = count
+ end
+
+ def each
+ number = 2 # two is the first prime number
+ counter = 0
+
+ while counter < @count
+ if number.prime?
+ yield number
+ counter += 1
+ end
+ number += 1
+ end
+ end
+
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ first_group_product = RationalSequence.new(n).
+ select { |number| number.numerator.prime? or number.denominator.prime? }.
+ reduce(1, :*)
+
+ second_group_product = RationalSequence.new(n).
+ select { |number| not number.numerator.prime? and not number.denominator.prime? }.
+ reduce(1, :*)
+
+ first_group_product/second_group_product
+ end
+
+ def aimless(n)
+ sequence = PrimeSequence.new(n)
+
+ rational_numbers = []
+ sequence.each_slice(2) do |pair|
+ pair << 1 if pair.length<2
+
+ rational_numbers << Rational(pair[0], pair[1])
+ end
+
+ rational_numbers.reduce(0, :+)
+ end
+
+ def worthless(n)
+ nth_fibonacci_number = FibonacciSequence.new(n).to_a[n-1]
+ rational_numbers = RationalSequence.new
+ sum = 0
+
+ rational_numbers.
+ lazy.
+ take_while do |i|
+ sum += i
+ sum <= nth_fibonacci_number
+ end.
+ force
+ end
+end
- Напиши си малко тестове, че някои неща не работят правилно
it 'can calculate the first 11 rational numbers' do
expect(RationalSequence.new(11).to_a).to eq %w(1/1 2/1 1/2 1/3 3/1 4/1 3/2 2/3 1/4 1/5 5/1).map(&:to_r)
end
- Прегледай пак Enumerable, например може да се справиш по-добре в
meaningless
.
Също не ти трябва lazy
, force
в worthless
. Както и масивите имат #last
, което е същото като array[-1]
, което е като това, което ти си написала.