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

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

Към профила на Иван Стоилов

Резултати

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

Код

class Integer
def prime?
return false if self <= 1
root_self = Math.sqrt(self).floor
(2..root_self).each do |i|
return false if self % i == 0
end
true
end
end
class RationalSequence
include Enumerable
def initialize(size = 0)
@size = size
end
def each
numerator = denominator = limit_denominator = i = j = 1
size_counter = 0
limit_nominator = 2
while size_counter < @size
if (numerator.gcd denominator) == 1
yield Rational(numerator, denominator)
size_counter += 1
end
if numerator == limit_nominator
i = -i
limit_nominator += 2
end
if denominator == limit_denominator
j = -j
limit_denominator += 2
end
(numerator == 1 and i < 0) ? i = -i : numerator += i
(denominator == 1 and j < 0) ? j = -j : denominator += j
end
end
end
class PrimeSequence
include Enumerable
def initialize(size = 0)
@size = size
end
def each
current = 2
size_counter = 0
while size_counter < @size
if current.prime?
yield current
size_counter += 1
end
current += 1
end
end
end
class FibonacciSequence
include Enumerable
def initialize(size = 0, first: 1, second: 1)
@size = size
@first = first
@second = second
end
def each
(1..@size).each do
yield @first
@first, @second = @second, @first + @second
end
end
end
module DrunkenMathematician
module_function
def meaningless(n)
rationals = RationalSequence.new(n)
group_one, group_two = rationals.partition { |x| x.numerator.prime? or x.denominator.prime?}
group_one = [1] if group_one.length == 0
group_two = [1] if group_two.length == 0
group_one.reduce(:*) / group_two.reduce(:*)
end
def aimless(n)
primes = PrimeSequence.new(n).to_a
return 1.to_r if primes.length == 0
primes += [1] if n % 2 == 1
primes.each_slice(2).flat_map { |x| Rational(x[0], x[1])}.reduce(:+)
end
def worthless(n)
return [] if n == 0
nth_fib = FibonacciSequence.new(n).to_a[-1]
cut_length = (1..Float::INFINITY).detect { |i| RationalSequence.new(i).reduce(:+) > nth_fib} - 1
RationalSequence.new(cut_length).to_a
end
end

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

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

Finished in 0.09067 seconds
20 examples, 0 failures

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

Иван обнови решението на 25.10.2015 20:08 (преди над 9 години)

+class Integer
+
+ def prime?
+ return false if self <= 1
+
+ root_self = Math.sqrt(self).floor
+ (2..root_self).each do |i|
+ return false if self % i == 0
+ end
+ true
+ end
+end
+
+class RationalSequence
+
+ include Enumerable
+
+ def initialize(size = 0)
+ @size = size
+ end
+
+ def each
+ numerator = denominator = limit_denominator = i = j = 1
+ size_counter = 0
+ limit_nominator = 2
+
+ while size_counter < @size
+ if (numerator.gcd denominator) == 1
+ yield Rational(numerator, denominator)
+ size_counter += 1
+ end
+
+ if numerator == limit_nominator
+ i = -i
+ limit_nominator += 2
+ end
+
+ if denominator == limit_denominator
+ j = -j
+ limit_denominator += 2
+ end
+
+ (numerator == 1 and i < 0) ? i = -i : numerator += i
+
+ (denominator == 1 and j < 0) ? j = -j : denominator += j
+ end
+ end
+end
+
+class PrimeSequence
+
+ include Enumerable
+
+ def initialize(size = 0)
+ @size = size
+ end
+
+ def each
+ current = 2
+ size_counter = 0
+
+ while size_counter < @size
+ if current.prime?
+ yield current
+ size_counter += 1
+ end
+
+ current += 1
+ end
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(size = 0, first: 1, second: 1)
+ @size = size
+ @first = first
+ @second = second
+ end
+
+ def each
+ (1..@size).each do
+ yield @first
+ @first, @second = @second, @first + @second
+ end
+ end
+end
+
+module DrunkenMathematician
+
+ module_function
+
+ def meaningless(n)
+ rationals = RationalSequence.new(n)
+ group_one, group_two = rationals.partition { |x| x.numerator.prime? or x.denominator.prime?}
+
+ group_one = [1] if group_one.length == 0
+ group_two = [1] if group_two.length == 0
+
+ group_one.reduce(:*) / group_two.reduce(:*)
+ end
+
+ def aimless(n)
+ primes = PrimeSequence.new(n).to_a
+
+ return 1.to_r if primes.length == 0
+ primes += [1] if n % 2 == 1
+
+ primes.each_slice(2).flat_map { |x| Rational(x[0], x[1])}.reduce(:+)
+ end
+
+ def worthless(n)
+ return [] if n == 0
+ nth_fib = FibonacciSequence.new(n).to_a[-1]
+
+ cut_length = (1..Float::INFINITY).detect { |i| RationalSequence.new(i).reduce(:+) > nth_fib} - 1
+
+ RationalSequence.new(cut_length).to_a
+ end
+end

Не оставяй нов ред в началото на дефиницията на клас/модул.

На места имаш проблеми със спазването на конвенциите, направи справка с ръководството за стил - основно whitespace. Не са достатъчно сериозни, за да ти отнема точка, но внимавай повече в бъдещи задачи.