Кристиан обнови решението на 26.10.2015 09:56 (преди над 9 години)
+class Integer
+ def prime?(number)
+ Math.sqrt(number).floor
+ .downto(2).each { |i| return false if number % i == 0 }
+ true
+ end
+end
+
+class RationalSequence
+ include Enumerable
+
+ def initialize(limit)
+ @limit = limit
+ @level = 0
+ @cache = []
+ @level_numbers = []
+ end
+
+ def each(&block)
+ while @limit > 0
+ yield next_rational
+ @limit -= 1
+ end
+ end
+
+ def next_rational
+ if @level_numbers.any?
+ return filter_next
+ else
+ @level += 1
+ end
+
+ if @level.even?
+ @level_numbers = @level.downto(1).zip(1..@level)
+ else
+ @level_numbers = (1..@level).zip(@level.downto(1))
+ end
+ return filter_next
+ end
+
+ def filter_next
+ next_number = @level_numbers.shift.join('/').to_r
+ unless @cache.include? next_number
+ @cache << next_number
+ return next_number
+ else
+ return next_rational
+ end
+ end
+end
+
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(limit)
+ @limit = limit
+ end
+
+ def each(&block)
+ current = 2
+
+ while @limit > 0
+ if current.prime?
+ yield current
+ @limit -= 1
+ end
+ current += 1
+ end
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(limit, first: 1, second: 1)
+ @limit = limit
+ @first = first
+ @second = second
+ end
+
+ def each(&block)
+ while @limit > 0
+ yield @first
+ @limit -= 1
+ @first, @second = @second, @first + @second
+ end
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(number)
+ rational_numbers = RationalSequence.new(number).to_a
+
+ primes_group = rational_numbers.select { |r| r.numerator.prime? || r.denominator.prime? }
+ no_primes_group = rational_numbers - primes_group.to_a
+
+ primes_group << '1/1'.to_r unless primes_group.any?
+ no_primes_group << '1/1'.to_r unless no_primes_group.any?
+
+ primes_group.reduce(:*)/no_primes_group.reduce(:*)
+ end
+
+ def aimless(number)
+ prime_sequence = PrimeSequence.new(number)
+ rational_sequence = prime_sequence.each_slice(2)
+ .map { |couple| couple.join('/').to_r }
+ sum = rational_sequence.reduce(:+)
+ end
+
+ def worthless(number)
+ rational_numbers = RationalSequence.new(number).to_a
+ fibonacci_numbers = FibonacciSequence.new(number).to_a
+
+ limit = fibonacci_numbers.last
+ sum = 0
+ rational_numbers.each_with_object([]) do |item, result|
+ if sum + item <= limit
+ sum += item
+ result << item
+ end
+ end
+ end
+end