Славяна обнови решението на 26.10.2015 15:14 (преди над 9 години)
+module DrunkenMathematician
+ module_function
+
+ def sum_of_divisors(number)
+ (1..number).select { |n|number % n == 0}.count
+ end
+
+ def prime?(number)
+ sum_of_divisors(number) == 2
+ end
+
+ def meaningless(n)
+ sequence = RationalSequence.new(n).to_a
+ group_one = sequence.select { |rat| prime?(rat.numerator) or prime?(rat.denominator)}
+ group_two = sequence - group_one
+ if group_one == []
+ return group_two[0]
+ end
+
+ group_one.reduce(&:*) / group_two.reduce(&:*)
+ end
+
+ def aimless(n)
+ prime_sequence = PrimeSequence.new(n).to_a
+
+ result = Rational(0, 1)
+ prime_sequence.each_slice(2) do |slice|
+ numerator, denominator = slice
+ result += Rational(numerator, denominator)
+ end
+
+ result
+ end
+
+ def worthless(n)
+ fibonacci_number = FibonacciSequence.new(n).to_a[-1]
+ rational_sequence = RationalSequence.new(n).to_a
+ sum_of_rational_numbers = Rational(0, 1)
+
+ drop_sequence = rational_sequence.drop_while do |slice|
+ sum_of_rational_numbers += slice
+ sum_of_rational_numbers <= fibonacci_number
+ end
+
+ rational_sequence - drop_sequence
+ end
+end
+
+class RationalSequence
+ include Enumerable
+
+ def initialize(limit)
+ @limit = limit
+ end
+
+ def when_sum_is_odd(left, right)
+ if left == 1
+ left, right = left, right + 1
+ else
+ left, right = left - 1, right + 1
+ end
+ end
+
+ def when_sum_is_even(left, right)
+ if right == 1
+ left, right = left + 1, right
+ else
+ left, right = left + 1, right - 1
+ end
+ end
+
+ def each
+ counter, left, right = 1, 1, 1
+
+ while counter <= @limit
+ if left.gcd(right) == 1
+ yield Rational(left, right)
+ counter = counter + 1
+ end
+ if (left + right).odd?
+ left, right = when_sum_is_odd(left, right)
+ else
+ left, right = when_sum_is_even(left, right)
+ end
+ end
+ end
+end
+
+
+class PrimeSequence
+ include Enumerable
+ include DrunkenMathematician
+
+ def initialize(limit)
+ @limit = limit
+ end
+
+ def next_prime_number(number)
+ number = number + 1
+ if sum_of_divisors(number) == 2
+ return number
+ else
+ next_prime_number(number)
+ end
+ end
+
+ def each
+ counter, number = 1, 2
+ while counter <= @limit
+ yield number
+ counter = counter + 1
+ number = next_prime_number(number)
+ end
+ end
+end
+
+p PrimeSequence.new(8).to_a
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(limit, preferences = {first: 1, second: 1})
+ @limit = limit
+ @first = preferences[:first]
+ @second = preferences[:second]
+ end
+
+ def each
+ counter, current, previous = 1, @second, @first
+
+ while counter <= @limit
+ yield previous
+ counter = counter + 1
+ current, previous = current + previous, current
+ end
+ end
+end