Клара обнови решението на 25.10.2015 13:33 (преди над 9 години)
+class PrimeSequence
+ include Enumerable
+
+ def initialize(x)
+ @x = x
+ end
+
+ def self.is_prime?(number)
+ return false if number <= 1
+ Math.sqrt(number).to_i.downto(2).each { |i| return false if number % i == 0 }
+ true
+ end
+
+ def each
+ current, current_position = 1, 0
+ while current_position < @x
+ if PrimeSequence.is_prime?(current)
+ yield current
+ current_position = current_position + 1
+ end
+ current = current + 1
+ end
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(x, first:1, second:0)
+ @x = x
+ @first = first
+ @second = second
+ end
+
+ def each
+ current, previous = @first, @second
+ current_iteration = 1
+ while current_iteration <= @x
+ yield current
+ current, previous = current + previous, current
+ current_iteration += 1
+ end
+ end
+end
+
+
+class RationalSequence
+ include Enumerable
+
+ def initialize(x)
+ @x = x
+ @current_iteration = 2
+ @numerator = 2
+ @denominator = 1
+ end
+
+ def make_rational_number()
+ array_of_rational_numbers = []
+ if @denominator % 2 == 0
+ @denominator, @current_iteration = @denominator + 1, @current_iteration + 1
+ array_of_rational_numbers.push(Rational("#{@numerator}", "#{@denominator}"))
+ end
+ while @denominator > 1 && @current_iteration < @x
+ @numerator, @denominator = @numerator+1, @denominator - 1 # 2/4
+ if (@numerator % @denominator == 0 || @denominator % @numerator == 0) && @denominator != 1
+ else
+ @current_iteration = @current_iteration + 1
+ array_of_rational_numbers.push(Rational("#{@numerator}", "#{@denominator}"))
+ end
+ end
+ array_of_rational_numbers
+ end
+
+ def make_more_rational_numbers()
+ array_of_rational_numbers = []
+ if @numerator % 2 != 0
+ @numerator, @current_iteration = @numerator + 1, @current_iteration + 1
+ array_of_rational_numbers.push(Rational("#{@numerator}", "#{@denominator}"))
+ end
+ while @numerator > 1 && @current_iteration < @x
+ @numerator, @denominator = @numerator - 1, @denominator + 1
+ if @numerator % @denominator == 0 && @denominator != 1
+ else
+ @current_iteration = @current_iteration + 1
+ array_of_rational_numbers.push(Rational("#{@numerator}", "#{@denominator}"))
+ end
+ end
+ array_of_rational_numbers
+ end
+
+ def condition()
+ if @numerator == 1 then make_rational_number().each{ |x| x }
+ elsif @denominator == 1 then make_more_rational_numbers().each{ |x| x } end
+ end
+
+ def each
+ if @x != 0 then yield Rational(1,1) end
+ if @x > 1 then yield Rational("#{@numerator}", "#{@denominator}") end
+ while @current_iteration < @x
+ condition().each{ |x| yield x }
+ end
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ if n == 0 then return 1 end
+ first_group, second_group, sequence = [], [], RationalSequence.new(n).to_a
+ sequence.each do |x|
+ if PrimeSequence.is_prime?(x.numerator) || PrimeSequence.is_prime?(x.denominator)
+ first_group.push(x)
+ end
+ if !PrimeSequence.is_prime?(x.numerator) && !PrimeSequence.is_prime?(x.denominator)
+ second_group.push(x)
+ end
+ end
+ if first_group == [] then first_group.push(1) end
+ if second_group == [] then second_group.push(1) end
+ Rational(first_group.inject(:*), second_group.inject(:*))
+ end
+
+ def aimless(n)
+ if n == 0 then return 0 end
+ sequence, first_group = PrimeSequence.new(n).to_a, [], []
+ sequence.each_slice(2) do |x|
+ if x.length < 2 then x.push(1) end
+ first_group.push(Rational(x.first, x.last))
+ end
+ first_group.inject(:+)
+ end
+
+ def worthless(n)
+ if n == 0 then return [] end
+ current_iteration = 1
+ while true
+ nth_number_of_fib = FibonacciSequence.new(n).to_a.last
+ sum = RationalSequence.new(current_iteration + 1).to_a.inject(:+)
+ if sum >= nth_number_of_fib
+ return RationalSequence.new(current_iteration).to_a
+ end
+ current_iteration += 1
+ end
+ end
+
+end