Борис обнови решението на 25.10.2015 21:10 (преди над 9 години)
+class Integer
+ def prime?
+ return false if self == 1
+ n = 2
+ while self%n!=0
+ n += 1
+ end
+ self == n
+ end
+end
+
+
+class RationalSequence
+ include Enumerable
+
+ def initialize(amount)
+ @amount = amount
+ end
+
+ def get_rationals_even(diagonal)
+ result = []
+ helper = 1
+ while (diagonal-helper+1)>0 and @amount > 0
+ if (diagonal-helper+1).gcd(helper) == 1
+ result << (diagonal-helper+1)/helper.to_r
+ @amount -= 1
+ end
+ helper += 1
+ end
+ result
+ end
+
+ def get_rationals_odd(diagonal)
+ result = []
+ helper = 1
+ while (diagonal-helper+1)>0 and @amount > 0
+ if helper.gcd(diagonal-helper+1) == 1
+ result << helper/(diagonal-helper+1).to_r
+ @amount -= 1
+ end
+ helper += 1
+ end
+ result
+ end
+
+ def each
+ result = []
+ diagonal = 1
+ while @amount > 0
+ if diagonal.even?
+ result = get_rationals_even(diagonal)
+ else
+ result = get_rationals_odd(diagonal)
+ end
+ result.each { |n| yield n }
+ diagonal += 1
+ end
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(count)
+ @count = count
+ end
+
+ def each
+ counter, number = 0, 1
+ while counter < @count
+ if number.prime?
+ yield number
+ counter += 1
+ end
+ number += 1
+ end
+ end
+end
+
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(count, first: 1, second: 1)
+ @count = count
+ @first = first
+ @second = second
+ end
+
+ def each
+ counter = 0
+ while counter < @count
+ yield @first
+ @second, @first = @second + @first, @second
+ counter += 1
+ end
+ end
+end
+
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ return 1/1.to_r if n == 1 or n == 0
+ sequence_array = RationalSequence.new(n).to_a
+ group_one = sequence_array.select do |x|
+ x.numerator.prime? or x.denominator.prime?
+ end
+ group_two = sequence_array - group_one
+ numerator = group_one.reduce { |a, b| a * b }
+ denominator = group_two.reduce { |a, b| a * b }
+ numerator/denominator.to_r
+ end
+
+ module_function
+ def aimless(n)
+ return 0 if n == 0
+ sequence_array = PrimeSequence.new(n).to_a
+ if n.odd?
+ n += 1
+ sequence_array << 1
+ end
+ counter = 0
+ result = []
+ while counter<n
+ result << sequence_array[counter]/sequence_array[counter + 1].to_r
+ counter += 2
+ end
+ result.reduce { |a, b| a + b }
+ end
+
+
+ module_function
+ def worthless(n)
+ return [] if n == 0
+ number = FibonacciSequence.new(n).to_a.last
+ result = [1]
+ counter = 2
+ while result.reduce { |a, b| a + b } <= number
+ result = RationalSequence.new(counter).to_a
+ counter += 1
+ end
+ result.pop
+ result
+ end
+end