Йоан обнови решението на 22.10.2015 02:17 (преди над 9 години)
+# monkey patching for numeric
+class Integer < Numeric
+ def prime?
+ return false if self <= 1
+ 2.upto(Math.sqrt(self).to_i) do |x|
+ return false if self % x == 0
+ end
+ true
+ end
+end
+
+# RationalSequence
+class RationalSequence
+ include Enumerable
+
+ def initialize(count)
+ @count = count
+ end
+
+ def each(&_block)
+ return to_enum unless block_given?
+
+ numerator = 1
+ denominator = 2.0
+
+ yield 1.rationalize
+
+ (1...@count).each do
+ numerator, denominator = update_rationals(numerator, denominator)
+
+ yield (numerator / denominator).rationalize if numerator != denominator
+ end
+ end
+
+ def update_rationals(current_numerator, current_denominator)
+ numerator = current_numerator
+ denominator = current_denominator
+
+ if numerator % 2 == denominator % 2
+ numerator += 1
+ denominator -= 1 if denominator > 1
+ else
+ denominator += 1
+ numerator -= 1 if numerator > 1
+ end
+
+ [numerator, denominator]
+ end
+end
+# PrimeSequence
+class PrimeSequence
+ include Enumerable
+
+ def initialize(count)
+ @count = count
+ @first_prime = 2
+ end
+
+ def each(&_block)
+ return to_enum unless block_given?
+
+ (1..@count).each do
+ @first_prime += 1 until @first_prime.prime?
+
+ yield @first_prime
+
+ @first_prime += 1
+ end
+ end
+end
+# FibonacciSequence
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(count, first = 0, second = 1)
+ @count = count
+ @first = first
+ @second = second
+ end
+
+ def each(&_block)
+ return to_enum unless block_given?
+
+ previous = @first
+ current = @second
+
+ (1..@count).each do
+ yield current
+ current, previous = current + previous, current
+ end
+ end
+end
+# DrunkenMathematician
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ rational_sequence = RationalSequence.new(n)
+
+ parts = rational_sequence.group_by do |rational|
+ numerator, denominator = get_rational_parts(rational)
+
+ numerator.prime? || denominator.prime?
+ end
+
+ prime_multiplication = multiply_rationals(parts[true])
+ base_multiplication = multiply_rationals(parts[false])
+
+ prime_multiplication / base_multiplication.to_f
+ end
+
+ def aimless(n)
+ prime_sequence = PrimeSequence.new(n)
+
+ rationals = prime_sequence.each_slice(2).map do |pair|
+ numerator, denominator = pair
+ denominator ||= 1
+
+ (numerator / denominator.to_f).rationalize
+ end
+
+ rationals.inject(:+)
+ end
+
+ def worthless(n)
+ sum = 0
+ fibonacci_number = FibonacciSequence.new(n).to_a.last
+ rationals = RationalSequence.new(fibonacci_number).each
+
+ result = []
+
+ while sum < fibonacci_number
+ rational = rationals.next
+ sum += rational
+ result.push rational
+ end
+
+ result
+ end
+
+ def get_rational_parts(rational)
+ parts = rational.to_s.split('/')
+ numerator = parts.first.to_i
+ denominator = parts.last.to_i
+
+ [numerator, denominator]
+ end
+
+ def multiply_rationals(rationals)
+ multiplication = 1
+
+ unless rationals.nil? || rationals.empty?
+ rationals.each { |rational| multiplication *= rational }
+ end
+
+ multiplication
+ end
+end