Решение на Трета задача от Ивайло Бъчваров

Обратно към всички решения

Към профила на Ивайло Бъчваров

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 19 успешни тест(а)
  • 1 неуспешни тест(а)

Код

class Integer
def prime?
return false if self == 1
(2..(self / 2)).none? { |i| self % i == 0 }
end
end
class RationalSequence
include Enumerable
def initialize(size = nil)
@size = size
@counter = 0
end
def each
while @counter < @size
rationals { |number| yield number }
end
end
private
def rationals
(1..@size).each do |number|
sum = number * 2
moving_numerator(sum) { |x| yield x }
moving_denominator(sum + 1) { |x| yield x }
end
end
def moving_denominator(sum)
(1..(sum - 1)).each do |index|
if index.gcd(sum - index) == 1 && @counter < @size
@counter += 1
yield Rational(sum - index, index)
end
end
end
def moving_numerator(sum)
1.upto(sum - 1).each do |index|
if index.gcd(sum - index) == 1 && @counter < @size
@counter += 1
yield Rational(index, sum - index)
end
end
end
end
class PrimeSequence
include Enumerable
def initialize(limit)
@limit = limit
end
def each
generated = 0
number = 1
while generated < @limit
if number.prime?
yield number
generated += 1
end
number += 1
end
end
end
class FibonacciSequence
include Enumerable
def initialize(limit, first: 1, second: 1)
@limit = limit
@first = first
@second = second
end
def each
previous = @first
current = @second
counter = 0
while counter < @limit
yield previous
current, previous, counter = current + previous, current, counter + 1
end
end
end
module DrunkenMathematician
module_function
def meaningless(n)
rationals = RationalSequence.new(n).to_a
group_one = rationals.select { |rational| self.prime_number? rational }
group_two = rationals.select { |rational| !self.prime_number? rational }
group_one.reduce(1, :*) / group_two.reduce(1, :*)
end
def aimless(n)
sequence = PrimeSequence.new(n).to_a
sequence.push(1) if n.odd?
sequence.each_slice(2).map { |x| Rational(x[0], x[1]) }.reduce :+
end
def worthless(n)
fib_number = FibonacciSequence.new(n).to_a.last
rationals = RationalSequence.new(Float::INFINITY).to_enum
sum = 0
rationals.take_while do |rational|
sum += rational
fib_number > sum
end
end
def prime_number?(rational)
rational.numerator.prime? || rational.denominator.prime?
end
def next_sum(sum, couple)
sum + Rational(couple.fetch(0), couple.fetch(1, 1))
end
end

Лог от изпълнението

.................F..

Failures:

  1) Fifth task DrunkenMathematician #worthless can calculate for 2
     Failure/Error: expect(DrunkenMathematician.worthless(2)).to eq %w(1/1).map(&:to_r)
       
       expected: [(1/1)]
            got: []
       
       (compared using ==)
     # /tmp/d20151111-27349-1kkfj5d/spec.rb:103:in `block (4 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.01583 seconds
20 examples, 1 failure

Failed examples:

rspec /tmp/d20151111-27349-1kkfj5d/spec.rb:102 # Fifth task DrunkenMathematician #worthless can calculate for 2

История (1 версия и 0 коментара)

Ивайло обнови решението на 26.10.2015 17:21 (преди над 9 години)

+class Integer
+ def prime?
+ return false if self == 1
+ (2..(self / 2)).none? { |i| self % i == 0 }
+ end
+end
+
+class RationalSequence
+ include Enumerable
+
+ def initialize(size = nil)
+ @size = size
+ @counter = 0
+ end
+
+ def each
+ while @counter < @size
+ rationals { |number| yield number }
+ end
+ end
+
+ private
+
+ def rationals
+ (1..@size).each do |number|
+ sum = number * 2
+ moving_numerator(sum) { |x| yield x }
+ moving_denominator(sum + 1) { |x| yield x }
+ end
+ end
+
+ def moving_denominator(sum)
+ (1..(sum - 1)).each do |index|
+ if index.gcd(sum - index) == 1 && @counter < @size
+ @counter += 1
+ yield Rational(sum - index, index)
+ end
+ end
+ end
+
+ def moving_numerator(sum)
+ 1.upto(sum - 1).each do |index|
+ if index.gcd(sum - index) == 1 && @counter < @size
+ @counter += 1
+ yield Rational(index, sum - index)
+ end
+ end
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(limit)
+ @limit = limit
+ end
+
+ def each
+ generated = 0
+ number = 1
+
+ while generated < @limit
+ if number.prime?
+ yield number
+ generated += 1
+ end
+ number += 1
+ end
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(limit, first: 1, second: 1)
+ @limit = limit
+ @first = first
+ @second = second
+ end
+
+ def each
+ previous = @first
+ current = @second
+ counter = 0
+ while counter < @limit
+ yield previous
+ current, previous, counter = current + previous, current, counter + 1
+ end
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ rationals = RationalSequence.new(n).to_a
+ group_one = rationals.select { |rational| self.prime_number? rational }
+ group_two = rationals.select { |rational| !self.prime_number? rational }
+ group_one.reduce(1, :*) / group_two.reduce(1, :*)
+ end
+
+ def aimless(n)
+ sequence = PrimeSequence.new(n).to_a
+ sequence.push(1) if n.odd?
+ sequence.each_slice(2).map { |x| Rational(x[0], x[1]) }.reduce :+
+ end
+
+ def worthless(n)
+ fib_number = FibonacciSequence.new(n).to_a.last
+ rationals = RationalSequence.new(Float::INFINITY).to_enum
+ sum = 0
+ rationals.take_while do |rational|
+ sum += rational
+ fib_number > sum
+ end
+ end
+
+ def prime_number?(rational)
+ rational.numerator.prime? || rational.denominator.prime?
+ end
+
+ def next_sum(sum, couple)
+ sum + Rational(couple.fetch(0), couple.fetch(1, 1))
+ end
+end