Мирослав обнови решението на 24.10.2015 16:43 (преди над 9 години)
+class RationalSequence
+ def initialize(number)
+ @number_of_elements = number
+ end
+
+ def to_a()
+ start = Rational(1,1)
+ [start] + (1...(1.0/0)).lazy.collect {
+ start = next_element(start.numerator, start. denominator)
+ }.take(@number_of_elements - 1).to_a
+ end
+
+ private
+
+ def next_element(numerator, denominator)
+ sum = numerator + denominator
+ sum.even? ?
+ get_even_element_step(numerator, denominator) :
+ get_odd_element_step(numerator, denominator)
+ end
+
+ def get_even_element_step(numerator, denominator)
+ if denominator == 1 then
+ Rational(numerator + 1, denominator)
+ else
+ check_relatively_prime(numerator + 1, denominator - 1) ?
+ Rational(numerator + 1, denominator - 1) :
+ get_even_element_step(numerator + 1, denominator - 1)
+ end
+ end
+
+ def get_odd_element_step(numerator, denominator)
+ if numerator == 1 then
+ Rational(numerator, denominator + 1)
+ else
+ check_relatively_prime(numerator - 1, denominator + 1) ?
+ Rational(numerator - 1, denominator + 1) :
+ get_odd_element_step(numerator - 1, denominator + 1)
+ end
+ end
+
+ def check_relatively_prime(numerator, denominator)
+ prime = Rational(numerator, denominator)
+ numerator == prime.numerator && denominator == prime.denominator
+ end
+end
+
+class Integer
+ def prime?()
+ return ('1' * self) !~ /^1?$|^(11+?)\1+$/
+ end
+end
+
+class PrimeSequence
+ def initialize(number)
+ @number_of_elements = number
+ end
+
+ def to_a()
+ (2..(1.0/0)).lazy.select{ |number|
+ number.prime?
+ }.take(@number_of_elements).to_a
+ end
+end
+
+class FibonacciSequence
+ def initialize(number, first=1, second=1)
+ @number_of_elements = number
+ @first = first
+ @second = second
+ end
+
+ def to_a()
+ [@first, @second] + (1..(1.0/0)).lazy.collect {
+ next_number = @first + @second
+ @first = @second
+ @second = next_number
+ }.take(@number_of_elements - 2).to_a
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ 1 / RationalSequence.new(n).to_a.chunk { |number|
+ number.numerator.prime? or number.denominator.prime?
+ }.collect { |condition, index|
+ index.reduce(:*)
+ }.each_slice(2).to_a.flat_map { |element|
+ element.reduce(:/)
+ }.reduce(:*)
+ end
+
+ def aimless(n)
+ PrimeSequence.new(n).to_a.each.each_slice(2).to_a.collect { |element|
+ if (!element[1]) then element.push(1) end
+ Rational(element[0], element[1])
+ }.reduce(:+)
+ end
+
+ def worthless(n)
+ RationalSequence.new((1..1.0/0).lazy.take_while { |number|
+ RationalSequence.new(number).to_a.reduce(:+) <
+ FibonacciSequence.new(n).to_a.last
+ }.to_a.last).to_a
+ end
+end
FYI: Пробна версия, решението не е готово още.