Решение на Трета задача от Георги Киряков

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

Към профила на Георги Киряков

Резултати

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

Код

class RationalSequence
include Enumerable
def initialize(size)
@size = size
end
def get_raw_rational(position)
n, k = position, 1
while n >= k
n -= k
k += 1
end
if k.even? then [k - n, n + 1] else [n + 1, k - n] end
end
def each
current, current_size = 0, 0
while current_size < @size
numerator, denominator = get_raw_rational current
if numerator.gcd(denominator) == 1
yield Rational(numerator, denominator)
current_size += 1
end
current += 1
end
end
end
class Integer
def prime?
return false if self <= 1
2.upto(Math.sqrt(self)).each {|i| return false if self % i == 0}
true
end
end
class PrimeSequence
include Enumerable
def initialize(size)
@size = size
end
def each
current = 2
current_size = 0
while current_size < @size
if(current.prime?)
yield current
current_size += 1
end
current += 1
end
end
end
class FibonacciSequence
include Enumerable
def initialize(size, first: 1, second: 1)
@size, @first, @second = size, first, second
end
def each
current, previous = @second, @first
(0...@size).each do
yield previous
current, previous = current + previous, current
end
end
end
module DrunkenMathematician
module_function
def meaningless(n)
groups = RationalSequence.new(n).partition do |rational|
rational.numerator.prime? or rational.denominator.prime?
end
groups[0].reduce(1, :*) / groups[1].reduce(1, :*)
end
def aimless(n)
aimless_sum = 0
PrimeSequence.new(n).each_slice(2) do |prime|
aimless_sum += Rational(prime[0], prime.fetch(1, 1))
end
aimless_sum
end
def worthless(n)
limit = FibonacciSequence.new(n).to_a.fetch(-1, 0)
rationals = RationalSequence.new(Float::INFINITY).lazy
sum = 0
rationals.take_while do |rational|
sum += rational
sum <= limit
end.force
end
end

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

....................

Finished in 0.01361 seconds
20 examples, 0 failures

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

Георги обнови решението на 24.10.2015 15:48 (преди над 8 години)

+class RationalSequence
+ include Enumerable
+
+ def initialize(size)
+ @size = size
+ end
+
+ def get_raw_rational(position)
+ n, k = position, 1
+ while n >= k
+ n -= k
+ k += 1
+ end
+ if k.even? then [k - n, n + 1] else [n + 1, k - n] end
+ end
+
+ def each
+ current, current_size = 0, 0
+ while current_size < @size
+ numerator, denominator = get_raw_rational current
+
+ if numerator.gcd(denominator) == 1
+ yield Rational(numerator, denominator)
+ current_size += 1
+ end
+ current += 1
+ end
+ end
+end
+
+class Integer
+ def prime?
+ return false if self <= 1
+ 2.upto(Math.sqrt(self)).each {|i| return false if self % i == 0}
+ true
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(size)
+ @size = size
+ end
+
+ def each
+ current = 2
+ current_size = 0
+ while current_size < @size
+ if(current.prime?)
+ yield current
+ current_size += 1
+ end
+ current += 1
+ end
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(size, first: 1, second: 1)
+ @size, @first, @second = size, first, second
+ end
+
+ def each
+ current, previous = @second, @first
+ (0...@size).each do
+ yield previous
+ current, previous = current + previous, current
+ end
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ groups = RationalSequence.new(n).partition do |rational|
+ rational.numerator.prime? or rational.denominator.prime?
+ end
+ groups[0].reduce(1, :*) / groups[1].reduce(1, :*)
+ end
+
+ def aimless(n)
+ aimless_sum = 0
+ PrimeSequence.new(n).each_slice(2) do |prime|
+ aimless_sum += Rational(prime[0], prime.fetch(1, 1))
+ end
+ aimless_sum
+ end
+
+ def worthless(n)
+ limit = FibonacciSequence.new(n).to_a.fetch(-1, 0)
+ rationals = RationalSequence.new(Float::INFINITY).lazy
+
+ sum = 0
+ rationals.take_while do |rational|
+ sum += rational
+ sum <= limit
+ end.force
+ end
+end