Ивайло обнови решението на 26.10.2015 17:21 (преди над 9 години)
+class Integer
+ def prime?
+ return false if self == 1
+ (2..(self / 2)).none? { |i| self % i == 0 }
+ end
+end
+
+class RationalSequence
+ include Enumerable
+
+ def initialize(size = nil)
+ @size = size
+ @counter = 0
+ end
+
+ def each
+ while @counter < @size
+ rationals { |number| yield number }
+ end
+ end
+
+ private
+
+ def rationals
+ (1..@size).each do |number|
+ sum = number * 2
+ moving_numerator(sum) { |x| yield x }
+ moving_denominator(sum + 1) { |x| yield x }
+ end
+ end
+
+ def moving_denominator(sum)
+ (1..(sum - 1)).each do |index|
+ if index.gcd(sum - index) == 1 && @counter < @size
+ @counter += 1
+ yield Rational(sum - index, index)
+ end
+ end
+ end
+
+ def moving_numerator(sum)
+ 1.upto(sum - 1).each do |index|
+ if index.gcd(sum - index) == 1 && @counter < @size
+ @counter += 1
+ yield Rational(index, sum - index)
+ end
+ end
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(limit)
+ @limit = limit
+ end
+
+ def each
+ generated = 0
+ number = 1
+
+ while generated < @limit
+ if number.prime?
+ yield number
+ generated += 1
+ end
+ number += 1
+ end
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(limit, first: 1, second: 1)
+ @limit = limit
+ @first = first
+ @second = second
+ end
+
+ def each
+ previous = @first
+ current = @second
+ counter = 0
+ while counter < @limit
+ yield previous
+ current, previous, counter = current + previous, current, counter + 1
+ end
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ rationals = RationalSequence.new(n).to_a
+ group_one = rationals.select { |rational| self.prime_number? rational }
+ group_two = rationals.select { |rational| !self.prime_number? rational }
+ group_one.reduce(1, :*) / group_two.reduce(1, :*)
+ end
+
+ def aimless(n)
+ sequence = PrimeSequence.new(n).to_a
+ sequence.push(1) if n.odd?
+ sequence.each_slice(2).map { |x| Rational(x[0], x[1]) }.reduce :+
+ end
+
+ def worthless(n)
+ fib_number = FibonacciSequence.new(n).to_a.last
+ rationals = RationalSequence.new(Float::INFINITY).to_enum
+ sum = 0
+ rationals.take_while do |rational|
+ sum += rational
+ fib_number > sum
+ end
+ end
+
+ def prime_number?(rational)
+ rational.numerator.prime? || rational.denominator.prime?
+ end
+
+ def next_sum(sum, couple)
+ sum + Rational(couple.fetch(0), couple.fetch(1, 1))
+ end
+end