Адриана обнови решението на 25.10.2015 23:07 (преди над 9 години)
+class RationalSequence
+ include Enumerable
+
+ def initialize(limit)
+ @limit = limit
+ end
+
+ def each
+ array = Array.new
+ while array.size < @limit
+ current = generate(array)
+ yield current
+ array << current
+ end
+ end
+
+ def generate(array)
+ Range.new(1, @limit ** 2).each { |current_limit|
+ batch = next_batch(current_limit, array)
+ return batch if batch.class == Rational
+ }
+ end
+
+ def next_batch(current_limit, array)
+ last = (( current_limit + 1 ) / 2)
+ Range.new(1, last).each { |fraction_part|
+ current = next_rational(last, fraction_part, array)
+ return current if current != nil
+ }
+ end
+
+ def next_rational(last, fraction_part, array)
+ other_fraction_part = last - fraction_part + 1
+ if last % 2 == 1
+ current = Rational(fraction_part, other_fraction_part)
+ unless array.include?(current)
+ return current
+ end
+ else
+ current = Rational(other_fraction_part, fraction_part)
+ unless array.include?(current)
+ return current
+ end
+ end
+ end
+
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(limit)
+ @limit = limit
+ end
+
+ def each
+ current = 2
+ yield current
+ count = 1
+ while count < @limit
+ if is_prime?(current)
+ yield current
+ count += 1
+ end
+ current += 1
+ end
+ end
+
+ def is_prime?(current)
+ Range.new(2, (Math.sqrt(current).ceil)).each { |prime|
+ return false if current % prime == 0
+ }
+ true
+ end
+
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(limit, first: 1, second: 1)
+ @limit = limit
+ @first = first
+ @second = second
+ end
+
+ def each
+ current, previous = @first, @second - @first
+
+ count = 0
+ while count < @limit
+ yield current
+ count += 1
+ current, previous = current + previous, current
+ end
+ end
+
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(limit)
+
+ rationals = RationalSequence.new(limit).to_a
+ primes = PrimeSequence.new(limit).to_a
+
+ groups = rationals.partition{|rational| has_prime?(primes, rational)}
+
+ groups[0] << Rational(1, 1) if groups[0].size < 1
+ groups[1] << Rational(1, 1) if groups[1].size < 1
+
+ Rational(groups[0].inject(:*), groups[1].inject(:*))
+ end
+
+ def has_prime?(primes, rational)
+ (primes.include? rational.numerator) || (primes.include? rational.denominator)
+ end
+
+ def aimless(limit)
+ sum = 0
+
+ PrimeSequence.new(limit).to_a.each_slice(2) { |numerator, denominator|
+ sum += Rational(numerator, denominator)
+ }
+
+ sum
+ end
+
+ def worthless(limit)
+ nth_fibonacci_number = FibonacciSequence.new(limit).to_a.last
+ rationals = RationalSequence.new(1)
+
+ if limit == 1
+ return rationals.to_a
+ end
+
+ count = 1
+ while rationals.inject{ |sum, rational| sum + rational } < nth_fibonacci_number
+ rationals = RationalSequence.new(count)
+ count += 1
+ end
+ rationals.to_a.tap(&:pop)
+ end
+end
На места имаш проблеми със спазването на конвенциите, направи справка с ръководството за стил.