Решение на Трета задача от Йоан Динков

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

Към профила на Йоан Динков

Резултати

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

Код

class Integer < Numeric
def prime?
return false if self <= 1
2.upto(Math.sqrt(self).to_i) do |x|
return false if self % x == 0
end
true
end
end
class RationalSequence
include Enumerable
def initialize(count)
@count = count
end
def each(&_block)
return to_enum unless block_given?
numerator = 1
denominator = 1.to_f
current_iteration = 1
while current_iteration <= @count
if numerator.gcd(denominator.to_i) == 1
yield (numerator / denominator).rationalize
current_iteration += 1
end
numerator, denominator = update_rational_parts(numerator, denominator)
end
end
def update_rational_parts(current_numerator, current_denominator)
numerator = current_numerator
denominator = current_denominator
if numerator % 2 == denominator % 2
numerator += 1
denominator -= 1 if denominator > 1
else
denominator += 1
numerator -= 1 if numerator > 1
end
[numerator, denominator]
end
end
class PrimeSequence
include Enumerable
def initialize(count)
@count = count
@first_prime = 2
end
def each(&_block)
return to_enum unless block_given?
(1..@count).each do
@first_prime += 1 until @first_prime.prime?
yield @first_prime
@first_prime += 1
end
end
end
class FibonacciSequence
include Enumerable
def initialize(count, first: 1, second: 1)
@count = count
@first = first
@second = second
end
def each(&_block)
return to_enum unless block_given?
previous = @first
current = @second
yield previous
(1...@count).each do
yield current
current, previous = current + previous, current
end
end
end
module DrunkenMathematician
module_function
def meaningless(n)
rational_sequence = RationalSequence.new(n)
parts = rational_sequence.group_by do |rational|
numerator = rational.numerator
denominator = rational.denominator
numerator.prime? || denominator.prime?
end
prime_multiplication = multiply_rationals(parts[true])
base_multiplication = multiply_rationals(parts[false])
(prime_multiplication / base_multiplication.to_f).rationalize
end
def aimless(n)
prime_sequence = PrimeSequence.new(n)
rationals = prime_sequence.each_slice(2).map do |pair|
numerator, denominator = pair
denominator ||= 1
(numerator / denominator.to_f).rationalize
end
rationals.inject(:+)
end
def worthless(n)
sum = 0
fibonacci_number = FibonacciSequence.new(n).to_a.last
rationals = RationalSequence.new(fibonacci_number).each
result = []
while sum < fibonacci_number
rational = rationals.next
sum += rational
break if sum > fibonacci_number
result.push rational
end
result
end
def multiply_rationals(rationals)
multiplication = 1
unless rationals.nil? || rationals.empty?
rationals.each { |rational| multiplication *= rational }
end
multiplication
end
end

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

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

Finished in 0.02095 seconds
20 examples, 0 failures

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

Йоан обнови решението на 22.10.2015 02:17 (преди над 9 години)

+# monkey patching for numeric
+class Integer < Numeric
+ def prime?
+ return false if self <= 1
+ 2.upto(Math.sqrt(self).to_i) do |x|
+ return false if self % x == 0
+ end
+ true
+ end
+end
+
+# RationalSequence
+class RationalSequence
+ include Enumerable
+
+ def initialize(count)
+ @count = count
+ end
+
+ def each(&_block)
+ return to_enum unless block_given?
+
+ numerator = 1
+ denominator = 2.0
+
+ yield 1.rationalize
+
+ (1...@count).each do
+ numerator, denominator = update_rationals(numerator, denominator)
+
+ yield (numerator / denominator).rationalize if numerator != denominator
+ end
+ end
+
+ def update_rationals(current_numerator, current_denominator)
+ numerator = current_numerator
+ denominator = current_denominator
+
+ if numerator % 2 == denominator % 2
+ numerator += 1
+ denominator -= 1 if denominator > 1
+ else
+ denominator += 1
+ numerator -= 1 if numerator > 1
+ end
+
+ [numerator, denominator]
+ end
+end
+# PrimeSequence
+class PrimeSequence
+ include Enumerable
+
+ def initialize(count)
+ @count = count
+ @first_prime = 2
+ end
+
+ def each(&_block)
+ return to_enum unless block_given?
+
+ (1..@count).each do
+ @first_prime += 1 until @first_prime.prime?
+
+ yield @first_prime
+
+ @first_prime += 1
+ end
+ end
+end
+# FibonacciSequence
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(count, first = 0, second = 1)
+ @count = count
+ @first = first
+ @second = second
+ end
+
+ def each(&_block)
+ return to_enum unless block_given?
+
+ previous = @first
+ current = @second
+
+ (1..@count).each do
+ yield current
+ current, previous = current + previous, current
+ end
+ end
+end
+# DrunkenMathematician
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ rational_sequence = RationalSequence.new(n)
+
+ parts = rational_sequence.group_by do |rational|
+ numerator, denominator = get_rational_parts(rational)
+
+ numerator.prime? || denominator.prime?
+ end
+
+ prime_multiplication = multiply_rationals(parts[true])
+ base_multiplication = multiply_rationals(parts[false])
+
+ prime_multiplication / base_multiplication.to_f
+ end
+
+ def aimless(n)
+ prime_sequence = PrimeSequence.new(n)
+
+ rationals = prime_sequence.each_slice(2).map do |pair|
+ numerator, denominator = pair
+ denominator ||= 1
+
+ (numerator / denominator.to_f).rationalize
+ end
+
+ rationals.inject(:+)
+ end
+
+ def worthless(n)
+ sum = 0
+ fibonacci_number = FibonacciSequence.new(n).to_a.last
+ rationals = RationalSequence.new(fibonacci_number).each
+
+ result = []
+
+ while sum < fibonacci_number
+ rational = rationals.next
+ sum += rational
+ result.push rational
+ end
+
+ result
+ end
+
+ def get_rational_parts(rational)
+ parts = rational.to_s.split('/')
+ numerator = parts.first.to_i
+ denominator = parts.last.to_i
+
+ [numerator, denominator]
+ end
+
+ def multiply_rationals(rationals)
+ multiplication = 1
+
+ unless rationals.nil? || rationals.empty?
+ rationals.each { |rational| multiplication *= rational }
+ end
+
+ multiplication
+ end
+end

Йоан обнови решението на 22.10.2015 02:35 (преди над 9 години)

# monkey patching for numeric
class Integer < Numeric
def prime?
return false if self <= 1
2.upto(Math.sqrt(self).to_i) do |x|
return false if self % x == 0
end
true
end
end
# RationalSequence
class RationalSequence
include Enumerable
def initialize(count)
@count = count
end
def each(&_block)
return to_enum unless block_given?
numerator = 1
- denominator = 2.0
+ denominator = 1.0
+ current_iteration = 1
- yield 1.rationalize
+ yield (numerator / denominator).rationalize
- (1...@count).each do
- numerator, denominator = update_rationals(numerator, denominator)
+ while current_iteration < @count
+ if numerator != denominator
+ yield (numerator / denominator).rationalize
+ current_iteration += 1
+ end
- yield (numerator / denominator).rationalize if numerator != denominator
+ numerator, denominator = update_rational_parts(numerator, denominator)
end
end
- def update_rationals(current_numerator, current_denominator)
+ def update_rational_parts(current_numerator, current_denominator)
numerator = current_numerator
denominator = current_denominator
if numerator % 2 == denominator % 2
numerator += 1
denominator -= 1 if denominator > 1
else
denominator += 1
numerator -= 1 if numerator > 1
end
[numerator, denominator]
end
end
# PrimeSequence
class PrimeSequence
include Enumerable
def initialize(count)
@count = count
@first_prime = 2
end
def each(&_block)
return to_enum unless block_given?
(1..@count).each do
@first_prime += 1 until @first_prime.prime?
yield @first_prime
@first_prime += 1
end
end
end
# FibonacciSequence
class FibonacciSequence
include Enumerable
def initialize(count, first = 0, second = 1)
@count = count
@first = first
@second = second
end
def each(&_block)
return to_enum unless block_given?
previous = @first
current = @second
(1..@count).each do
yield current
current, previous = current + previous, current
end
end
end
# DrunkenMathematician
module DrunkenMathematician
module_function
def meaningless(n)
rational_sequence = RationalSequence.new(n)
parts = rational_sequence.group_by do |rational|
numerator, denominator = get_rational_parts(rational)
numerator.prime? || denominator.prime?
end
prime_multiplication = multiply_rationals(parts[true])
base_multiplication = multiply_rationals(parts[false])
prime_multiplication / base_multiplication.to_f
end
def aimless(n)
prime_sequence = PrimeSequence.new(n)
rationals = prime_sequence.each_slice(2).map do |pair|
numerator, denominator = pair
denominator ||= 1
(numerator / denominator.to_f).rationalize
end
rationals.inject(:+)
end
def worthless(n)
sum = 0
fibonacci_number = FibonacciSequence.new(n).to_a.last
rationals = RationalSequence.new(fibonacci_number).each
result = []
while sum < fibonacci_number
rational = rationals.next
sum += rational
result.push rational
end
result
end
def get_rational_parts(rational)
parts = rational.to_s.split('/')
numerator = parts.first.to_i
denominator = parts.last.to_i
[numerator, denominator]
end
def multiply_rationals(rationals)
multiplication = 1
unless rationals.nil? || rationals.empty?
rationals.each { |rational| multiplication *= rational }
end
multiplication
end
end

Йоан обнови решението на 23.10.2015 20:43 (преди над 9 години)

# monkey patching for numeric
class Integer < Numeric
def prime?
return false if self <= 1
2.upto(Math.sqrt(self).to_i) do |x|
return false if self % x == 0
end
true
end
end
# RationalSequence
class RationalSequence
include Enumerable
def initialize(count)
@count = count
end
def each(&_block)
return to_enum unless block_given?
numerator = 1
- denominator = 1.0
+ denominator = 1.to_f
current_iteration = 1
- yield (numerator / denominator).rationalize
-
while current_iteration < @count
- if numerator != denominator
+ if numerator.gcd(denominator.to_i) == 1
yield (numerator / denominator).rationalize
current_iteration += 1
end
numerator, denominator = update_rational_parts(numerator, denominator)
end
end
def update_rational_parts(current_numerator, current_denominator)
numerator = current_numerator
denominator = current_denominator
if numerator % 2 == denominator % 2
numerator += 1
denominator -= 1 if denominator > 1
else
denominator += 1
numerator -= 1 if numerator > 1
end
[numerator, denominator]
end
end
# PrimeSequence
class PrimeSequence
include Enumerable
def initialize(count)
@count = count
@first_prime = 2
end
def each(&_block)
return to_enum unless block_given?
(1..@count).each do
@first_prime += 1 until @first_prime.prime?
yield @first_prime
@first_prime += 1
end
end
end
# FibonacciSequence
class FibonacciSequence
include Enumerable
def initialize(count, first = 0, second = 1)
@count = count
@first = first
@second = second
end
def each(&_block)
return to_enum unless block_given?
previous = @first
current = @second
(1..@count).each do
yield current
current, previous = current + previous, current
end
end
end
# DrunkenMathematician
module DrunkenMathematician
module_function
def meaningless(n)
rational_sequence = RationalSequence.new(n)
parts = rational_sequence.group_by do |rational|
numerator, denominator = get_rational_parts(rational)
numerator.prime? || denominator.prime?
end
prime_multiplication = multiply_rationals(parts[true])
base_multiplication = multiply_rationals(parts[false])
prime_multiplication / base_multiplication.to_f
end
def aimless(n)
prime_sequence = PrimeSequence.new(n)
rationals = prime_sequence.each_slice(2).map do |pair|
numerator, denominator = pair
denominator ||= 1
(numerator / denominator.to_f).rationalize
end
rationals.inject(:+)
end
def worthless(n)
sum = 0
fibonacci_number = FibonacciSequence.new(n).to_a.last
rationals = RationalSequence.new(fibonacci_number).each
result = []
while sum < fibonacci_number
rational = rationals.next
sum += rational
result.push rational
end
result
end
def get_rational_parts(rational)
parts = rational.to_s.split('/')
numerator = parts.first.to_i
denominator = parts.last.to_i
[numerator, denominator]
end
def multiply_rationals(rationals)
multiplication = 1
unless rationals.nil? || rationals.empty?
rationals.each { |rational| multiplication *= rational }
end
multiplication
end
end
+puts(RationalSequence.new(15).to_a)

Йоан обнови решението на 23.10.2015 20:44 (преди над 9 години)

# monkey patching for numeric
class Integer < Numeric
def prime?
return false if self <= 1
2.upto(Math.sqrt(self).to_i) do |x|
return false if self % x == 0
end
true
end
end
# RationalSequence
class RationalSequence
include Enumerable
def initialize(count)
@count = count
end
def each(&_block)
return to_enum unless block_given?
numerator = 1
denominator = 1.to_f
current_iteration = 1
- while current_iteration < @count
+ while current_iteration <= @count
if numerator.gcd(denominator.to_i) == 1
yield (numerator / denominator).rationalize
current_iteration += 1
end
numerator, denominator = update_rational_parts(numerator, denominator)
end
end
def update_rational_parts(current_numerator, current_denominator)
numerator = current_numerator
denominator = current_denominator
if numerator % 2 == denominator % 2
numerator += 1
denominator -= 1 if denominator > 1
else
denominator += 1
numerator -= 1 if numerator > 1
end
[numerator, denominator]
end
end
# PrimeSequence
class PrimeSequence
include Enumerable
def initialize(count)
@count = count
@first_prime = 2
end
def each(&_block)
return to_enum unless block_given?
(1..@count).each do
@first_prime += 1 until @first_prime.prime?
yield @first_prime
@first_prime += 1
end
end
end
# FibonacciSequence
class FibonacciSequence
include Enumerable
def initialize(count, first = 0, second = 1)
@count = count
@first = first
@second = second
end
def each(&_block)
return to_enum unless block_given?
previous = @first
current = @second
(1..@count).each do
yield current
current, previous = current + previous, current
end
end
end
# DrunkenMathematician
module DrunkenMathematician
module_function
def meaningless(n)
rational_sequence = RationalSequence.new(n)
parts = rational_sequence.group_by do |rational|
numerator, denominator = get_rational_parts(rational)
numerator.prime? || denominator.prime?
end
prime_multiplication = multiply_rationals(parts[true])
base_multiplication = multiply_rationals(parts[false])
prime_multiplication / base_multiplication.to_f
end
def aimless(n)
prime_sequence = PrimeSequence.new(n)
rationals = prime_sequence.each_slice(2).map do |pair|
numerator, denominator = pair
denominator ||= 1
(numerator / denominator.to_f).rationalize
end
rationals.inject(:+)
end
def worthless(n)
sum = 0
fibonacci_number = FibonacciSequence.new(n).to_a.last
rationals = RationalSequence.new(fibonacci_number).each
result = []
while sum < fibonacci_number
rational = rationals.next
sum += rational
result.push rational
end
result
end
def get_rational_parts(rational)
parts = rational.to_s.split('/')
numerator = parts.first.to_i
denominator = parts.last.to_i
[numerator, denominator]
end
def multiply_rationals(rationals)
multiplication = 1
unless rationals.nil? || rationals.empty?
rationals.each { |rational| multiplication *= rational }
end
multiplication
end
end
-puts(RationalSequence.new(15).to_a)
  • Първо махни коментарите.
  • FibonacciSequence трябва да може да работи така
sequence = FibonacciSequence.new(5, first: 0, second: 1)
sequence.to_a # => [0, 1, 1, 2, 3]
  • Виж пак документацията на Rational (това get_rational_parts не ти трябва)
  • Напиши си тестове за методчетата на DrunkenMathematician, примерно ги викай с 0, 1, 2, 3 и 4. Май добавяш един елемент повече в worthless, но тествай ;)

Йоан обнови решението на 25.10.2015 11:06 (преди над 9 години)

-# monkey patching for numeric
class Integer < Numeric
def prime?
return false if self <= 1
2.upto(Math.sqrt(self).to_i) do |x|
return false if self % x == 0
end
true
end
end
-# RationalSequence
class RationalSequence
include Enumerable
def initialize(count)
@count = count
end
def each(&_block)
return to_enum unless block_given?
numerator = 1
denominator = 1.to_f
current_iteration = 1
while current_iteration <= @count
if numerator.gcd(denominator.to_i) == 1
yield (numerator / denominator).rationalize
current_iteration += 1
end
numerator, denominator = update_rational_parts(numerator, denominator)
end
end
def update_rational_parts(current_numerator, current_denominator)
numerator = current_numerator
denominator = current_denominator
if numerator % 2 == denominator % 2
numerator += 1
denominator -= 1 if denominator > 1
else
denominator += 1
numerator -= 1 if numerator > 1
end
[numerator, denominator]
end
end
-# PrimeSequence
+
class PrimeSequence
include Enumerable
def initialize(count)
@count = count
@first_prime = 2
end
def each(&_block)
return to_enum unless block_given?
(1..@count).each do
@first_prime += 1 until @first_prime.prime?
yield @first_prime
@first_prime += 1
end
end
end
-# FibonacciSequence
+
class FibonacciSequence
include Enumerable
- def initialize(count, first = 0, second = 1)
+ def initialize(count, first: 1, second: 1)
@count = count
@first = first
@second = second
end
def each(&_block)
return to_enum unless block_given?
previous = @first
current = @second
- (1..@count).each do
+ yield previous
+
+ (1...@count).each do
yield current
current, previous = current + previous, current
end
end
end
-# DrunkenMathematician
+
module DrunkenMathematician
module_function
def meaningless(n)
rational_sequence = RationalSequence.new(n)
parts = rational_sequence.group_by do |rational|
- numerator, denominator = get_rational_parts(rational)
+ numerator = rational.numerator
+ denominator = rational.denominator
numerator.prime? || denominator.prime?
end
prime_multiplication = multiply_rationals(parts[true])
base_multiplication = multiply_rationals(parts[false])
prime_multiplication / base_multiplication.to_f
end
def aimless(n)
prime_sequence = PrimeSequence.new(n)
rationals = prime_sequence.each_slice(2).map do |pair|
numerator, denominator = pair
denominator ||= 1
(numerator / denominator.to_f).rationalize
end
rationals.inject(:+)
end
def worthless(n)
sum = 0
fibonacci_number = FibonacciSequence.new(n).to_a.last
rationals = RationalSequence.new(fibonacci_number).each
result = []
while sum < fibonacci_number
rational = rationals.next
+
sum += rational
+
+ if sum > fibonacci_number
+ break
+ end
+
result.push rational
end
result
- end
-
- def get_rational_parts(rational)
- parts = rational.to_s.split('/')
- numerator = parts.first.to_i
- denominator = parts.last.to_i
-
- [numerator, denominator]
end
def multiply_rationals(rationals)
multiplication = 1
unless rationals.nil? || rationals.empty?
rationals.each { |rational| multiplication *= rational }
end
multiplication
end
end

Йоан обнови решението на 25.10.2015 11:31 (преди над 9 години)

class Integer < Numeric
def prime?
return false if self <= 1
2.upto(Math.sqrt(self).to_i) do |x|
return false if self % x == 0
end
true
end
end
class RationalSequence
include Enumerable
def initialize(count)
@count = count
end
def each(&_block)
return to_enum unless block_given?
numerator = 1
denominator = 1.to_f
current_iteration = 1
while current_iteration <= @count
if numerator.gcd(denominator.to_i) == 1
yield (numerator / denominator).rationalize
current_iteration += 1
end
numerator, denominator = update_rational_parts(numerator, denominator)
end
end
def update_rational_parts(current_numerator, current_denominator)
numerator = current_numerator
denominator = current_denominator
if numerator % 2 == denominator % 2
numerator += 1
denominator -= 1 if denominator > 1
else
denominator += 1
numerator -= 1 if numerator > 1
end
[numerator, denominator]
end
end
class PrimeSequence
include Enumerable
def initialize(count)
@count = count
@first_prime = 2
end
def each(&_block)
return to_enum unless block_given?
(1..@count).each do
@first_prime += 1 until @first_prime.prime?
yield @first_prime
@first_prime += 1
end
end
end
class FibonacciSequence
include Enumerable
def initialize(count, first: 1, second: 1)
@count = count
@first = first
@second = second
end
def each(&_block)
return to_enum unless block_given?
previous = @first
current = @second
yield previous
(1...@count).each do
yield current
current, previous = current + previous, current
end
end
end
module DrunkenMathematician
module_function
def meaningless(n)
rational_sequence = RationalSequence.new(n)
parts = rational_sequence.group_by do |rational|
numerator = rational.numerator
denominator = rational.denominator
numerator.prime? || denominator.prime?
end
prime_multiplication = multiply_rationals(parts[true])
base_multiplication = multiply_rationals(parts[false])
- prime_multiplication / base_multiplication.to_f
+ (prime_multiplication / base_multiplication.to_f).rationalize
end
def aimless(n)
prime_sequence = PrimeSequence.new(n)
rationals = prime_sequence.each_slice(2).map do |pair|
numerator, denominator = pair
denominator ||= 1
(numerator / denominator.to_f).rationalize
end
rationals.inject(:+)
end
def worthless(n)
sum = 0
fibonacci_number = FibonacciSequence.new(n).to_a.last
rationals = RationalSequence.new(fibonacci_number).each
result = []
while sum < fibonacci_number
rational = rationals.next
sum += rational
- if sum > fibonacci_number
- break
- end
+ break if sum > fibonacci_number
result.push rational
end
result
end
def multiply_rationals(rationals)
multiplication = 1
unless rationals.nil? || rationals.empty?
rationals.each { |rational| multiplication *= rational }
end
multiplication
end
end