Мартин обнови решението на 25.10.2015 20:17 (преди над 9 години)
+class RationalSequence
+ include Enumerable
+
+ def initialize(n)
+ @sequence = []
+ @n = n
+ end
+
+ def each &block
+ @sequence.each(block)
+ end
+
+ def to_a
+ sequence_member = [1, 1]
+ @sequence = [Rational(1, 1)]
+ i = 2
+ while (i <= @n)
+ numerator = sequence_member[0]
+ denominator = sequence_member[1]
+ sequence_member = calculate_next_member(numerator, denominator)
+ rational_member = Rational(sequence_member[0], sequence_member[1])
+ if (@sequence.include? rational_member)
+ nil
+ else
+ @sequence << rational_member
+ i+=1
+ end
+ end
+
+ @n == 0 ? [] : @sequence
+ end
+
+ private
+ def calculate_next_member(numerator, denominator)
+ if (numerator%2 == denominator%2)
+ numerator+=1
+ if (denominator > 1)
+ denominator-=1
+ end
+ else
+ denominator+=1
+ if (numerator > 1)
+ numerator-=1
+ end
+ end
+ [numerator, denominator]
+ end
+end
+
+class Numeric
+ def prime?
+ return false if self == 1
+ return self == 2 if self % 2 == 0
+
+ (3..Math.sqrt(self)).step(2) do |x|
+ return false if self % x == 0
+ end
+
+ true
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(n)
+ @sequence = []
+ @n = n
+ end
+
+ def each &block
+ @sequence.each(block)
+ end
+
+ def to_a
+ count = 0
+ number = 2
+ while (count < @n)
+ if number.prime?
+ @sequence << number
+ count+=1
+ end
+ number+=1
+ end
+ @sequence
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(n, first: 1, second: 1)
+ @sequence = []
+ @n = n
+ @first_member = first
+ @second_member = second
+ end
+
+ def each &block
+ @sequence.each(block)
+ end
+
+ def to_a
+ generate_sequence(@n, @first_member, @second_member)
+ end
+
+ private
+
+ def generate_sequence(n, first_member=1, second_member=1)
+ n > 0 ? (@sequence << @first_member) : nil
+ n > 1 ? (@sequence << @second_member): nil
+
+ (n-2).times do
+ next_member = @first_member + @second_member
+ @sequence << next_member
+ @first_member = @second_member
+ @second_member = next_member
+ end
+
+ @sequence
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ rational_sequence = RationalSequence.new(n)
+ first_sequence = rational_sequence.to_a.select { |number|
+ number.numerator.prime? || number.denominator.prime? }
+
+ second_sequence = rational_sequence.to_a.select { |number|
+ !number.numerator.prime? && !number.denominator.prime?}
+
+ first_sequence_product = first_sequence.inject(:*)
+ second_sequence_product = second_sequence.inject(:*)
+
+ Rational(first_sequence_product, second_sequence_product)
+ end
+
+ def aimless(n)
+ prime_sequence = PrimeSequence.new(n).to_a
+ prime_sequence << 1 if n.odd?
+ rationals_count = (prime_sequence.length() / 2).round()
+ rationals_sequence = []
+ for i in (0..rationals_count).step(2) do
+ rationals_sequence << Rational(prime_sequence[i], prime_sequence[i+1])
+ end
+
+ rationals_sequence.inject(:+)
+ end
+
+ def worthless(n)
+ nth_fibonacci_member = FibonacciSequence.new(n).to_a.last()
+ rational_sequence_sum = 0
+ index = 1
+
+ while rational_sequence_sum < nth_fibonacci_member
+ rational_sequence = RationalSequence.new(index).to_a
+ rational_sequence_sum = rational_sequence.inject(:+)
+ index+=1
+ end
+ rational_sequence.length > 1 ? rational_sequence.pop() : nil
+ rational_sequence
+ end
+end