Методи обнови решението на 26.10.2015 13:48 (преди над 9 години)
+class RationalSequence
+ include Enumerable
+
+ def initialize(elements_count)
+ @length = elements_count
+ end
+
+ def each
+ return if @length.zero?
+ n = 2
+ loop do
+ (1..n.pred).each do |number|
+ yield Rational(number, n - number)
+ end
+ n += 1
+ end
+ end
+
+ def to_a
+ rational_sequence = []
+ enum_for(:each).take_while do |rational|
+ order = (rational.numerator + rational.denominator).even?
+ rational_sequence << (order ? rational : 1/rational)
+ rational_sequence.uniq.length < @length
+ end
+ rational_sequence.uniq
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(elements_count)
+ @length = elements_count
+ end
+
+ def each
+ n = 2
+ loop do
+ if n.prime? then yield n end
+ n += 1
+ end
+ end
+
+ def to_a
+ enum_for(:each).take(@length)
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(elements_count, first: 1, second: 1)
+ @length = elements_count
+ @first = first
+ @second = second
+ end
+
+ def each
+ if @length.zero?
+ yield 0
+ return
+ end
+ previous, current = @first, @second
+ loop do
+ yield previous
+ previous, current = current, previous + current
+ end
+ end
+
+ def to_a
+ enum_for(:each).take(@length)
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ group_one = [Rational(1,1)]
+ group_two = [Rational(1,1)]
+ rationals = RationalSequence.new(n).to_a
+ rationals.each do |rational|
+ if rational.numerator.prime? and rational.denominator.prime?
+ group_one << rational
+ else
+ group_two << rational
+ end
+ end
+ group_one.reduce(&:*) / group_two.reduce(&:*)
+ end
+
+ def aimless(n)
+ primes = PrimeSequence.new(n).to_a
+ primes << 1 if n.odd?
+ prime_couples = primes.each_slice(2).map(&:to_a)
+ prime_rationals = prime_couples.map { |couple| Rational(*couple) }
+ prime_rationals.reduce(&:+)
+ end
+
+ def worthless(n)
+ nth_fibonacci = FibonacciSequence.new(n).to_a.last
+ rationals = RationalSequence.new(1)
+ rational_sequence = []
+ rationals.take_while do |rational|
+ rational_sequence << rational
+ rational_sequence.uniq.reduce(&:+) <= nth_fibonacci
+ end
+ rational_sequence.uniq[0..-2]
+ end
+end
+
+class Numeric
+
+ def prime?
+ (2..pred).all? { |number| self.remainder(number).nonzero? }
+ end
+end