Решение на Трета задача от Милена Дренска

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

Към профила на Милена Дренска

Резултати

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

Код

class Integer
def is_prime?
return false if self <= 1
2.upto(Math.sqrt(self).to_i).each do |n|
return false if self % n == 0
end
true
end
end
class RationalSequence
include Enumerable
def initialize(length = nil)
@length = length
end
def each
length, n = 0, 1
while length < @length
number = get_rational(n)
if number != nil
yield number
length += 1
end
n += 1
end
end
private
def has_common_divisor?(a, b)
a.gcd(b) != 1
end
def get_rational(n)
diagonals_to_skip = ((-1 + Math.sqrt(1 + 8 * n)) / 2).floor
step = n - diagonals_to_skip * (diagonals_to_skip + 1) / 2 #2
first = step <= 1 ? diagonals_to_skip + step : diagonals_to_skip + 2 - step
second = step <= 1 ? 1 : step
number = diagonals_to_skip % 2 == 0 ? Rational(second, first) : Rational(first, second)
has_common_divisor?(first, second) ? nil : number
end
end
class PrimeSequence
include Enumerable
def initialize(length)
@length = length
end
def each
counter, number = 0, 2
while counter < @length
if number.is_prime?
yield number
counter += 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
first, second, counter = @first, @second, 0
while counter < @limit
yield first
second, first = second + first, second
counter += 1
end
end
end
module DrunkenMathematician
module_function
def meaningless(n)
sequence = RationalSequence.new(n)
primes_product, non_primes_product = 1, 1
sequence.each do |n|
has_prime = (n.numerator.is_prime? or n.denominator.is_prime?)
if has_prime
primes_product *= n
else
non_primes_product *= n
end
end
primes_product / non_primes_product
end
def aimless(n)
sequence, sum = PrimeSequence.new(n), 0
sequence.each_slice(2) do |slice|
numerator, denominator = slice[0], slice[1] || 1
sum += Rational(numerator, denominator)
end
sum
end
def worthless(n)
sum_limit, current_sum, numbers = FibonacciSequence.new(n).to_a.last, 0, []
seq = n > 0 ? RationalSequence.new(Float::INFINITY).lazy : []
seq.each do |x|
current_sum += x
return numbers if current_sum > sum_limit
numbers << x
end
end
end

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

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

Finished in 0.01358 seconds
20 examples, 0 failures

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

Милена обнови решението на 24.10.2015 17:45 (преди над 8 години)

+class Integer
+ def is_prime?
+ return false if self <= 1
+
+ 2.upto(Math.sqrt(self).to_i).each do |n|
+ return false if self % n == 0
+ end
+
+ true
+ end
+end
+
+class RationalSequence
+ include Enumerable
+
+ def initialize(length = nil)
+ @length = length
+ end
+
+ def each
+ number_components, length = {increasing: 1, decreasing:1, is_increasing: true}, @length
+
+ while length > 0
+ if number_components[:is_increasing]
+ yield Rational(number_components[:increasing], number_components[:decreasing])
+ else
+ yield Rational(number_components[:decreasing], number_components[:increasing])
+ end
+
+ number_components = get_next(number_components)
+ length -= 1
+ end
+ end
+
+ def to_a
+ enum_for(:each).to_a
+ end
+
+ private
+
+ def has_common_divisor?(a, b)
+ a.gcd(b) != 1
+ end
+
+ def get_next(number)
+ if number[:decreasing] == 1
+ number[:increasing] +=1
+ number[:increasing], number[:decreasing] = number[:decreasing], number[:increasing]
+ number[:is_increasing] = !number[:is_increasing]
+ else
+ number[:increasing] += 1
+ number[:decreasing] -= 1
+ end
+
+ has_common_divisor?(number[:increasing], number[:decreasing]) ? get_next(number) : number
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(length)
+ @length = length
+ end
+
+ def each
+ counter, number = 0, 2
+ while counter < @length
+ if number.is_prime?
+ yield number
+ counter += 1
+ end
+
+ number += 1
+ end
+ end
+
+ def to_a
+ enum_for(:each).to_a
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(limit, first: 1, second: 1)
+ @limit = limit
+ @first = first
+ @second = second
+ end
+
+ def each
+ first, second, counter = @first, @second, 0
+
+ while counter < @limit
+ yield first
+ second, first = second + first, second
+ counter += 1
+ end
+ end
+
+ def to_a
+ enum_for(:each).to_a
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ sequence = RationalSequence.new(n)
+ primes_product, non_primes_product = 1, 1
+
+ sequence.each do |n|
+ has_prime = (n.numerator.is_prime? or n.denominator.is_prime?)
+ if has_prime
+ primes_product *= n
+ else
+ non_primes_product *= n
+ end
+ end
+
+ primes_product / non_primes_product
+ end
+
+ def aimless(n)
+ sequence, sum = PrimeSequence.new(n), 0
+ sequence.each_slice(2) do |slice|
+ numerator, denominator = slice[0], slice[1] || 1
+ sum += Rational(numerator, denominator)
+ end
+ sum
+ end
+
+ def worthless(n)
+ sum_limit, current_sum, numbers = FibonacciSequence.new(n).to_a.last, 0, []
+ seq = n > 0 ? RationalSequence.new(Float::INFINITY).to_enum(:each).lazy : []
+ seq.each do |n|
+ current_sum += n
+ return numbers if current_sum > sum_limit
+ numbers << n
+ end
+ end
+end

Милена обнови решението на 24.10.2015 19:47 (преди над 8 години)

class Integer
def is_prime?
return false if self <= 1
2.upto(Math.sqrt(self).to_i).each do |n|
return false if self % n == 0
end
true
end
end
class RationalSequence
include Enumerable
def initialize(length = nil)
@length = length
end
def each
- number_components, length = {increasing: 1, decreasing:1, is_increasing: true}, @length
+ length, n = 0, 1
- while length > 0
- if number_components[:is_increasing]
- yield Rational(number_components[:increasing], number_components[:decreasing])
- else
- yield Rational(number_components[:decreasing], number_components[:increasing])
+ while length < @length
+ number = get_rational(n)
+ if number != nil
+ yield number
+ length += 1
end
- number_components = get_next(number_components)
- length -= 1
+ n += 1
end
end
def to_a
enum_for(:each).to_a
end
private
def has_common_divisor?(a, b)
a.gcd(b) != 1
end
- def get_next(number)
- if number[:decreasing] == 1
- number[:increasing] +=1
- number[:increasing], number[:decreasing] = number[:decreasing], number[:increasing]
- number[:is_increasing] = !number[:is_increasing]
- else
- number[:increasing] += 1
- number[:decreasing] -= 1
- end
+ def get_rational(n)
+ diagonals_to_skip = ((-1 + Math.sqrt(1 + 8 * n)) / 2).floor
+ step = n - diagonals_to_skip * (diagonals_to_skip + 1) / 2 #2
+ first = step <= 1 ? diagonals_to_skip + step : diagonals_to_skip + 2 - step
+ second = step <= 1 ? 1 : step
- has_common_divisor?(number[:increasing], number[:decreasing]) ? get_next(number) : number
+ number = diagonals_to_skip % 2 == 0 ? Rational(second, first) : Rational(first, second)
+ has_common_divisor?(first, second) ? nil : number
end
end
class PrimeSequence
include Enumerable
def initialize(length)
@length = length
end
def each
counter, number = 0, 2
while counter < @length
if number.is_prime?
yield number
counter += 1
end
number += 1
end
end
def to_a
enum_for(:each).to_a
end
end
class FibonacciSequence
include Enumerable
def initialize(limit, first: 1, second: 1)
@limit = limit
@first = first
@second = second
end
def each
first, second, counter = @first, @second, 0
while counter < @limit
yield first
second, first = second + first, second
counter += 1
end
end
def to_a
enum_for(:each).to_a
end
end
module DrunkenMathematician
module_function
def meaningless(n)
sequence = RationalSequence.new(n)
primes_product, non_primes_product = 1, 1
sequence.each do |n|
has_prime = (n.numerator.is_prime? or n.denominator.is_prime?)
if has_prime
primes_product *= n
else
non_primes_product *= n
end
end
primes_product / non_primes_product
end
def aimless(n)
sequence, sum = PrimeSequence.new(n), 0
sequence.each_slice(2) do |slice|
numerator, denominator = slice[0], slice[1] || 1
sum += Rational(numerator, denominator)
end
sum
end
def worthless(n)
sum_limit, current_sum, numbers = FibonacciSequence.new(n).to_a.last, 0, []
seq = n > 0 ? RationalSequence.new(Float::INFINITY).to_enum(:each).lazy : []
seq.each do |n|
current_sum += n
return numbers if current_sum > sum_limit
numbers << n
end
end
-end
+end

Милена обнови решението на 24.10.2015 19:55 (преди над 8 години)

class Integer
def is_prime?
return false if self <= 1
2.upto(Math.sqrt(self).to_i).each do |n|
return false if self % n == 0
end
true
end
end
class RationalSequence
include Enumerable
def initialize(length = nil)
@length = length
end
def each
length, n = 0, 1
while length < @length
number = get_rational(n)
if number != nil
yield number
length += 1
end
n += 1
end
end
- def to_a
- enum_for(:each).to_a
- end
-
private
def has_common_divisor?(a, b)
a.gcd(b) != 1
end
def get_rational(n)
diagonals_to_skip = ((-1 + Math.sqrt(1 + 8 * n)) / 2).floor
step = n - diagonals_to_skip * (diagonals_to_skip + 1) / 2 #2
first = step <= 1 ? diagonals_to_skip + step : diagonals_to_skip + 2 - step
second = step <= 1 ? 1 : step
number = diagonals_to_skip % 2 == 0 ? Rational(second, first) : Rational(first, second)
has_common_divisor?(first, second) ? nil : number
end
end
class PrimeSequence
include Enumerable
def initialize(length)
@length = length
end
def each
counter, number = 0, 2
while counter < @length
if number.is_prime?
yield number
counter += 1
end
number += 1
end
end
-
- def to_a
- enum_for(:each).to_a
- end
end
class FibonacciSequence
include Enumerable
def initialize(limit, first: 1, second: 1)
@limit = limit
@first = first
@second = second
end
def each
first, second, counter = @first, @second, 0
while counter < @limit
yield first
second, first = second + first, second
counter += 1
end
end
-
- def to_a
- enum_for(:each).to_a
- end
end
module DrunkenMathematician
module_function
def meaningless(n)
sequence = RationalSequence.new(n)
primes_product, non_primes_product = 1, 1
sequence.each do |n|
has_prime = (n.numerator.is_prime? or n.denominator.is_prime?)
if has_prime
primes_product *= n
else
non_primes_product *= n
end
end
primes_product / non_primes_product
end
def aimless(n)
sequence, sum = PrimeSequence.new(n), 0
sequence.each_slice(2) do |slice|
numerator, denominator = slice[0], slice[1] || 1
sum += Rational(numerator, denominator)
end
sum
end
def worthless(n)
sum_limit, current_sum, numbers = FibonacciSequence.new(n).to_a.last, 0, []
- seq = n > 0 ? RationalSequence.new(Float::INFINITY).to_enum(:each).lazy : []
- seq.each do |n|
- current_sum += n
+ seq = n > 0 ? RationalSequence.new(Float::INFINITY).lazy : []
+ seq.each do |x|
+ current_sum += x
return numbers if current_sum > sum_limit
- numbers << n
+ numbers << x
end
end
-end
+end