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

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

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

Резултати

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

Код

class Integer
def prime?
is_prime = true
(2..self/2).each do |i|
if self % i == 0
is_prime = false
break
end
end
is_prime and self > 1
end
end
class FibonacciSequence
include Enumerable
def initialize(count, first_two_members = {first: 1, second: 1})
@count = count
@first = first_two_members[:first]
@second = first_two_members[:second]
end
def each
previous = @first
current = @second
counter = 0
while counter < @count
yield previous
current, previous = current + previous, current
counter += 1
end
end
end
class RationalSequence
include Enumerable
def initialize(count = Float::INFINITY)
@count = count
end
def generate_next_number(n, d)
if n%2 == d%2
n+= 1
d-= 1 unless d == 1
else
d+= 1
n-= 1 unless n == 1
end
number = Rational(n, d)
if number.numerator == n && number.denominator == d
number
else
generate_next_number(n, d)
end
end
def each
n = 1
d = 1
counter = 0
if @count > 0
yield Rational(n, d)
counter += 1
end
while counter < @count
number = generate_next_number(n, d)
yield number
n = number.numerator
d = number.denominator
counter += 1
end
end
end
class PrimeSequence
include Enumerable
def initialize(count)
@count = count
end
def each
number = 2 # two is the first prime number
counter = 0
while counter < @count
if number.prime?
yield number
counter += 1
end
number += 1
end
end
end
module DrunkenMathematician
module_function
def meaningless(n)
groups = RationalSequence.new(n).
partition { |number| number.numerator.prime? or number.denominator.prime? }
first_group_product = groups.first.reduce(1, :*)
second_group_product = groups.last.reduce(1, :*)
first_group_product/second_group_product
end
def aimless(n)
sequence = PrimeSequence.new(n)
rational_numbers = []
sequence.each_slice(2) do |pair|
pair << 1 if pair.length<2
rational_numbers << Rational(pair[0], pair[1])
end
rational_numbers.reduce(0, :+)
end
def worthless(n)
nth_fibonacci_number = FibonacciSequence.new(n).to_a.last
rational_numbers = RationalSequence.new
sum = 0
rational_numbers.take_while do |i|
sum += i
sum <= nth_fibonacci_number
end
end
end

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

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

Finished in 0.01241 seconds
20 examples, 0 failures

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

Станимира обнови решението на 21.10.2015 23:39 (преди над 9 години)

+class Integer
+ def prime?
+ is_prime = true
+
+ (2..self/2).each do |i|
+ if self % i == 0
+ is_prime = false
+ break
+ end
+ end
+
+ is_prime and self > 1
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(count, first_two_members = {first: 1, second: 1})
+ @count = count
+ @first = first_two_members[:first]
+ @second = first_two_members[:second]
+ end
+
+ def each
+ previous = @first
+ current = @second
+ counter = 0
+
+ while counter < @count
+ yield previous
+ current, previous = current + previous, current
+ counter += 1
+ end
+ end
+end
+
+class RationalSequence
+ include Enumerable
+
+ def initialize(count = Float::INFINITY)
+ @count = count
+ end
+
+ def generate_next_number(n, d)
+ if n%2 == d%2
+ n+= 1
+ d-= 1 unless d == 1
+ else
+ d+= 1
+ n-= 1 unless n == 1
+ end
+
+ number = Rational(n, d)
+
+ # if the numerator divides the denominator evenly
+ # or if they are equal
+ # then the rational number was already generated earlier
+ if n%d != 2 and n != d
+ number
+ else
+ generate_next_number(n, d)
+ end
+ end
+
+ def each
+ n = 1
+ d = 1
+ counter = 0
+
+ if @count > 0
+ yield Rational(n, d)
+ counter += 1
+ end
+
+ while counter < @count
+ number = generate_next_number(n, d)
+ yield number
+
+ n = number.numerator
+ d = number.denominator
+ counter += 1
+ end
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(count)
+ @count = count
+ end
+
+ def each
+ number = 2 # two is the first prime number
+ counter = 0
+
+ while counter < @count
+ if number.prime?
+ yield number
+ counter += 1
+ end
+ number += 1
+ end
+ end
+
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ first_group_product = RationalSequence.new(n).
+ select { |number| number.numerator.prime? or number.denominator.prime? }.
+ reduce(1, :*)
+
+ second_group_product = RationalSequence.new(n).
+ select { |number| not number.numerator.prime? and not number.denominator.prime? }.
+ reduce(1, :*)
+
+ first_group_product/second_group_product
+ end
+
+ def aimless(n)
+ sequence = PrimeSequence.new(n)
+
+ rational_numbers = []
+ sequence.each_slice(2) do |pair|
+ pair << 1 if pair.length<2
+
+ rational_numbers << Rational(pair[0], pair[1])
+ end
+
+ rational_numbers.reduce(0, :+)
+ end
+
+ def worthless(n)
+ nth_fibonacci_number = FibonacciSequence.new(n).to_a[n-1]
+ rational_numbers = RationalSequence.new
+ sum = 0
+
+ rational_numbers.
+ lazy.
+ take_while do |i|
+ sum += i
+ sum <= nth_fibonacci_number
+ end.
+ force
+ end
+end
  • Напиши си малко тестове, че някои неща не работят правилно
it 'can calculate the first 11 rational numbers' do
  expect(RationalSequence.new(11).to_a).to eq %w(1/1 2/1 1/2 1/3 3/1 4/1 3/2 2/3 1/4 1/5 5/1).map(&:to_r)
end
  • Прегледай пак Enumerable, например може да се справиш по-добре в meaningless.

Станимира обнови решението на 24.10.2015 13:33 (преди над 9 години)

class Integer
def prime?
is_prime = true
(2..self/2).each do |i|
if self % i == 0
is_prime = false
break
end
end
is_prime and self > 1
end
end
class FibonacciSequence
include Enumerable
def initialize(count, first_two_members = {first: 1, second: 1})
@count = count
@first = first_two_members[:first]
@second = first_two_members[:second]
end
def each
previous = @first
current = @second
counter = 0
while counter < @count
yield previous
current, previous = current + previous, current
counter += 1
end
end
end
class RationalSequence
include Enumerable
def initialize(count = Float::INFINITY)
@count = count
end
def generate_next_number(n, d)
if n%2 == d%2
n+= 1
d-= 1 unless d == 1
else
d+= 1
n-= 1 unless n == 1
end
number = Rational(n, d)
- # if the numerator divides the denominator evenly
- # or if they are equal
- # then the rational number was already generated earlier
- if n%d != 2 and n != d
+ if number.numerator == n && number.denominator == d
number
else
generate_next_number(n, d)
end
end
def each
n = 1
d = 1
counter = 0
if @count > 0
yield Rational(n, d)
counter += 1
end
while counter < @count
number = generate_next_number(n, d)
yield number
n = number.numerator
d = number.denominator
counter += 1
end
end
end
class PrimeSequence
include Enumerable
def initialize(count)
@count = count
end
def each
number = 2 # two is the first prime number
counter = 0
while counter < @count
if number.prime?
yield number
counter += 1
end
number += 1
end
end
end
module DrunkenMathematician
module_function
def meaningless(n)
- first_group_product = RationalSequence.new(n).
- select { |number| number.numerator.prime? or number.denominator.prime? }.
- reduce(1, :*)
+ groups = RationalSequence.new(n).
+ partition { |number| number.numerator.prime? or number.denominator.prime? }
- second_group_product = RationalSequence.new(n).
- select { |number| not number.numerator.prime? and not number.denominator.prime? }.
- reduce(1, :*)
+ first_group_product = groups.first.reduce(1, :*)
+ second_group_product = groups.last.reduce(1, :*)
first_group_product/second_group_product
end
def aimless(n)
sequence = PrimeSequence.new(n)
rational_numbers = []
sequence.each_slice(2) do |pair|
pair << 1 if pair.length<2
rational_numbers << Rational(pair[0], pair[1])
end
rational_numbers.reduce(0, :+)
end
def worthless(n)
- nth_fibonacci_number = FibonacciSequence.new(n).to_a[n-1]
+ nth_fibonacci_number = FibonacciSequence.new(n).to_a.last
rational_numbers = RationalSequence.new
sum = 0
- rational_numbers.
- lazy.
- take_while do |i|
- sum += i
- sum <= nth_fibonacci_number
- end.
- force
+ rational_numbers.take_while do |i|
+ sum += i
+ sum <= nth_fibonacci_number
+ end
end
end