Ивайло обнови решението на 26.10.2015 03:29 (преди над 9 години)
+class RationalSequence
+ include Enumerable
+ def initialize(size)
+ @size = size
+ end
+
+ def each
+ sum, used, a, b, add = 2, Array.new, 1, 1, 1
+ while used.length < @size
+ if !(used.include? Rational(a,b)) then
+ yield Rational(a,b)
+ used.push Rational(a,b)
+ end
+ a = a + add
+ b = sum - a
+ if a == sum then
+ b, add, sum = 1, -1, sum + 1
+ elsif a == 0 then
+ a, add, sum = 1, 1, sum + 1
+ end
+ end
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(size)
+ @size = size
+ end
+ def each
+ added, number = 0, 2
+ while added < @size
+ if prime? number
+ yield number
+ added = added + 1
+ end
+ number = number + 1
+ end
+ end
+
+ def prime?(n)
+ n == 1? false : 2.upto(n-1).all? { |a| n.remainder(a).nonzero? }
+ end
+
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(size, first: 1, second: 1)
+ @size = size
+ @first = first
+ @second = second
+ end
+
+ def each
+ first, second = @first, @second
+ (1..@size).each do
+ yield first
+ first, second = second, first + second
+ end
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(count)
+ numbers = RationalSequence.new(count).to_a
+ first_group = numbers.select { |r| prime?(r.numerator) or prime?(r.denominator)}
+ second_group = numbers - first_group
+ first_group << 1
+ second_group << 1
+ first_group.inject(:*) / second_group.inject(:*)
+ end
+
+ def aimless(count)
+ return 0 if count == 0
+ numbers = PrimeSequence.new(count).to_a
+ numbers << 1 if count.odd?
+ numbers.each_slice(2).to_a.map { |a| Rational a[0], a[1] }.inject(:+)
+ end
+
+ def worthless(n)
+ fibonacci_number = FibonacciSequence.new(n+1).to_a.last
+ rational_numbers = []
+ count = 1
+ while true
+ new_rational_sequence = RationalSequence.new(count).to_a
+ sum = new_rational_sequence.inject(:+)
+ if sum <= fibonacci_number then
+ rational_numbers = new_rational_sequence
+ else
+ return rational_numbers
+ end
+ count = count + 1
+ end
+ end
+
+ def prime?(n)
+ n == 1? false : 2.upto(n-1).all? { |a| n.remainder(a).nonzero? }
+ end
+end