Рали обнови решението на 26.10.2015 12:15 (преди над 9 години)
+class Integer
+ def prime?
+ return false if self == 1
+ (2..Math.sqrt(self)).each do |divisor|
+ return false if self % divisor == 0
+ end
+ true
+ end
+end
+
+class RationalSequence
+ include Enumerable
+
+ def initialize(limit)
+ @limit = limit
+ end
+
+ def each
+ numerator, denominator, current = 1, 1, 0
+ while current < @limit
+ if numerator.gcd(denominator) == 1
+ yield Rational(numerator, denominator)
+ current += 1
+ end
+
+ flag_1 = 0
+ flag_2 = 0
+ if numerator & 1 == denominator & 1
+ numerator += 1
+ flag_1 = 1
+ else
+ denominator += 1
+ flag_2 = 1
+ end
+ denominator -= 1 if denominator > 1 && flag_1 > 0
+ numerator -= 1 if numerator > 1 && flag_2 > 0
+ end
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(limit)
+ @limit = limit
+ end
+
+ def each
+ current = 0
+ number = 2
+ while current < @limit
+ if number.prime?
+ yield number
+ current += 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
+ current = 0
+ while current < @limit
+ yield @first
+ @first, @second = @second, @first + @second
+ current += 1
+ end
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ sequence = RationalSequence.new(n).to_a
+ group_one = sequence.select { |x| x.numerator.prime? || x.denominator.prime? }
+ group_two = sequence.select { |x| !x.numerator.prime? && !x.denominator.prime? }
+ group_one.reduce(1, :*)
+ group_two.reduce(1, :*)
+ (group_one.reduce(1, :*) / group_two.reduce(1, :*))
+ end
+
+ def aimless(n)
+ return 0 if n == 0
+ sequence = PrimeSequence.new(n)
+ paired_sequence = sequence.each_slice(2).to_a
+ paired_sequence.last << 1 if paired_sequence.last.size == 1
+ paired_sequence
+ rationalized_paired_sequence = paired_sequence.map { |x| Rational(x[0], x[1]) }
+ rationalized_paired_sequence.reduce(:+)
+ end
+
+ def worthless(n)
+ return [] if n == 0
+ fibonacci_sequence = FibonacciSequence.new(n).to_a
+ index = 1
+ rational_sequence = RationalSequence.new(index).to_a
+ rational_sequence_sum = rational_sequence.reduce(:+)
+ saved_sequence = rational_sequence
+ while rational_sequence_sum <= fibonacci_sequence.last
+ saved_sequence = rational_sequence
+ # puts "#{rational_sequence} -> #{rational_sequence_sum} - #{fibonacci_sequence.last}"
+ rational_sequence = RationalSequence.new(index).to_a
+ rational_sequence_sum = rational_sequence.reduce(:+)
+ index += 1
+ end
+# puts "#{rational_sequence} -> #{rational_sequence_sum} - #{fibonacci_sequence.last}"
+ saved_sequence
+ end
+end