Решение на Трета задача от Георги Стефанов

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

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

Резултати

  • 5 точки от тестове
  • 1 отнета точка
  • 4 точки общо
  • 15 успешни тест(а)
  • 5 неуспешни тест(а)

Код

def prime?(number)
divisors = 0
2.upto(number-1).each {|x| divisors += 1 if number % x == 0 }
case number
when 0 then false
when 1 then false
else number == 2 or divisors == 0
end
end
def prime?(number)
divisors = 0
2.upto(number-1).each {|x| divisors += 1 if number % x == 0 }
case number
when 0 then false
when 1 then false
else number == 2 or divisors == 0
end
end
def increasing_numerator(numerator, denominator)
numerator += 1
denominator -= 1 unless denominator == 1
return numerator, denominator if numerator.gcd(denominator) == 1
return increasing_numerator(numerator, denominator) if numerator.gcd(denominator) > 1
end
def decreasing_numerator(numerator, denominator)
numerator -= 1 unless numerator == 1
denominator += 1
return numerator, denominator if numerator.gcd(denominator) == 1
return decreasing_numerator(numerator, denominator) if numerator.gcd(denominator) > 1
end
def rational_generator(n)
return Rational(1,1) if n == 1
denominator = rational_generator(n-1).denominator
numerator = rational_generator(n-1).numerator
if (numerator + denominator) % 2 == 0
numerator_incremented = increasing_numerator(numerator, denominator)[0]
denominator_incremented = increasing_numerator(numerator, denominator)[1]
else
numerator_incremented = decreasing_numerator(numerator, denominator)[0]
denominator_incremented = decreasing_numerator(numerator, denominator)[1]
end
Rational(numerator_incremented, denominator_incremented)
end
def nth_fibonacci(place, first: 1, second: 1)
case place
when 0 then 0
when 1 then first
when 2 then second
else
fibonacci_first_predecessor = nth_fibonacci(place - 1, first: first, second: second)
fibonacci_second_predecessor = nth_fibonacci(place - 2, first: first, second: second)
fibonacci_first_predecessor + fibonacci_second_predecessor
end
end
class PrimeSequence
include Enumerable
def initialize(number)
infinity = 1.0/0
@sequence = (1..infinity).lazy.select{|n| prime?(n)}.take(number)
end
def each(&block)
@sequence.each(&block)
end
end
class FibonacciSequence
include Enumerable
def initialize(number, first: 1, second: 1)
@sequence = 1.upto(number).map {|n| nth_fibonacci(n, first: first, second: second )}
end
def each(&block)
@sequence.each(&block)
end
end
class RationalSequence
include Enumerable
def initialize(number)
@sequence = 1.upto(number).map {|n| rational_generator(n)}
end
def each(&block)
@sequence.each(&block)
end
def sum
@sequence.to_a.reduce(0, :+)
end
end
module DrunkenMathematician
module_function
def meaningless(n)
n_rationals = RationalSequence.new(n)
group_1 = n_rationals.select {|x| prime?(x.numerator) or prime?(x.denominator)}
group_2 = n_rationals.select {|x| not (prime?(x.numerator) or prime?(x.denominator))}
group_1.reduce(1, :*) / group_2.reduce(1, :*)
end
def aimless(n)
n_primes = PrimeSequence.new(n).to_a
n_primes.push(1) if n_primes.count % 2 == 1
n_primes.each_slice(2).map {|first, second| Rational(first, second)}.reduce(0, :+)
end
def worthless(n)
number = 0
number +=1 until RationalSequence.new(number).sum > nth_fibonacci(n)
RationalSequence.new(number-1).to_a
end
end

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

..FF..F......F.....F

Failures:

  1) Fifth task RationalSequence can calculate the first 28 rational numbers
     Failure/Error: expect(RationalSequence.new(28).to_a).to eq %w(
     Timeout::Error:
       execution expired
     # /tmp/d20151111-27349-g91bae/solution.rb:26:in `increasing_numerator'
     # /tmp/d20151111-27349-g91bae/solution.rb:47:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `block in initialize'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `upto'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `each'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `map'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `initialize'
     # /tmp/d20151111-27349-g91bae/spec.rb:12:in `new'
     # /tmp/d20151111-27349-g91bae/spec.rb:12:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) Fifth task RationalSequence is properly enumerable
     Failure/Error: ones = RationalSequence.new(28).select { |r| r.numerator == 1 }
     Timeout::Error:
       execution expired
     # /tmp/d20151111-27349-g91bae/solution.rb:54:in `convert'
     # /tmp/d20151111-27349-g91bae/solution.rb:54:in `Rational'
     # /tmp/d20151111-27349-g91bae/solution.rb:54:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `block in initialize'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `upto'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `each'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `map'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `initialize'
     # /tmp/d20151111-27349-g91bae/spec.rb:19:in `new'
     # /tmp/d20151111-27349-g91bae/spec.rb:19:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  3) Fifth task FibonacciSequence can be used to calculate the Lucas numbers
     Failure/Error: expect(FibonacciSequence.new(31, first: 2, second: 1).to_a).to eq [
     Timeout::Error:
       execution expired
     # /tmp/d20151111-27349-g91bae/solution.rb:66:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:65:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:65:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:65:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:65:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:65:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:65:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:64:in `nth_fibonacci'
     # /tmp/d20151111-27349-g91bae/solution.rb:89:in `block in initialize'
     # /tmp/d20151111-27349-g91bae/solution.rb:89:in `upto'
     # /tmp/d20151111-27349-g91bae/solution.rb:89:in `each'
     # /tmp/d20151111-27349-g91bae/solution.rb:89:in `map'
     # /tmp/d20151111-27349-g91bae/solution.rb:89:in `initialize'
     # /tmp/d20151111-27349-g91bae/spec.rb:37:in `new'
     # /tmp/d20151111-27349-g91bae/spec.rb:37:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  4) Fifth task DrunkenMathematician #meaningless can calculate for 42
     Failure/Error: expect(DrunkenMathematician.meaningless(42)).to eq Rational(1, 11)
     Timeout::Error:
       execution expired
     # /tmp/d20151111-27349-g91bae/solution.rb:54:in `Rational'
     # /tmp/d20151111-27349-g91bae/solution.rb:54:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `block in initialize'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `upto'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `each'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `map'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `initialize'
     # /tmp/d20151111-27349-g91bae/solution.rb:121:in `new'
     # /tmp/d20151111-27349-g91bae/solution.rb:121:in `meaningless'
     # /tmp/d20151111-27349-g91bae/spec.rb:82:in `block (4 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  5) Fifth task DrunkenMathematician #worthless can calculate for 15
     Failure/Error: expect(DrunkenMathematician.worthless(15)).to eq %w(
     Timeout::Error:
       execution expired
     # /tmp/d20151111-27349-g91bae/solution.rb:36:in `decreasing_numerator'
     # /tmp/d20151111-27349-g91bae/solution.rb:50:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:44:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:43:in `rational_generator'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `block in initialize'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `upto'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `each'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `map'
     # /tmp/d20151111-27349-g91bae/solution.rb:103:in `initialize'
     # /tmp/d20151111-27349-g91bae/solution.rb:137:in `new'
     # /tmp/d20151111-27349-g91bae/solution.rb:137:in `worthless'
     # /tmp/d20151111-27349-g91bae/spec.rb:112:in `block (4 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 5.5 seconds
20 examples, 5 failures

Failed examples:

rspec /tmp/d20151111-27349-g91bae/spec.rb:11 # Fifth task RationalSequence can calculate the first 28 rational numbers
rspec /tmp/d20151111-27349-g91bae/spec.rb:18 # Fifth task RationalSequence is properly enumerable
rspec /tmp/d20151111-27349-g91bae/spec.rb:36 # Fifth task FibonacciSequence can be used to calculate the Lucas numbers
rspec /tmp/d20151111-27349-g91bae/spec.rb:81 # Fifth task DrunkenMathematician #meaningless can calculate for 42
rspec /tmp/d20151111-27349-g91bae/spec.rb:111 # Fifth task DrunkenMathematician #worthless can calculate for 15

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

Георги обнови решението на 25.10.2015 00:13 (преди над 8 години)

+def prime?(number)
+ divisors = 0
+
+ 2.upto(number-1).each {|x| divisors += 1 if number % x == 0 }
+
+ case number
+ when 0 then false
+ when 1 then false
+ else number == 2 or divisors == 0
+ end
+end
+
+def increasing_numerator(numerator, denominator)
+ numerator += 1
+ denominator -= 1 unless denominator == 1
+
+ return numerator, denominator if numerator.gcd(denominator) == 1
+ return increasing_numerator(numerator, denominator) if numerator.gcd(denominator) > 1
+ end
+
+def decreasing_numerator(numerator, denominator)
+ numerator -= 1 unless numerator == 1
+ denominator += 1
+
+ return numerator, denominator if numerator.gcd(denominator) == 1
+ return decreasing_numerator(numerator, denominator) if numerator.gcd(denominator) > 1
+end
+
+def rational_generator(n)
+ return Rational(1,1) if n == 1
+
+ denominator = rational_generator(n-1).denominator
+ numerator = rational_generator(n-1).numerator
+
+ if (numerator + denominator) % 2 == 0
+ numerator_incremented = increasing_numerator(numerator, denominator)[0]
+ denominator_incremented = increasing_numerator(numerator, denominator)[1]
+ else
+ numerator_incremented = decreasing_numerator(numerator, denominator)[0]
+ denominator_incremented = decreasing_numerator(numerator, denominator)[1]
+ end
+
+ Rational(numerator_incremented, denominator_incremented)
+end
+
+def nth_fibonacci(place, first: 1, second: 1)
+ case place
+ when 0 then 0
+ when 1 then first
+ when 2 then second
+ else
+ fibonacci_first_predecessor = nth_fibonacci(place - 1, first: first, second: second)
+ fibonacci_second_predecessor = nth_fibonacci(place - 2, first: first, second: second)
+ fibonacci_first_predecessor + fibonacci_second_predecessor
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(number)
+ infinity = 1.0/0
+ @sequence = (1..infinity).lazy.select{|n| prime?(n)}.take(number)
+ end
+
+ def each(&block)
+ @sequence.each(&block)
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(number, first: 1, second: 1)
+ @sequence = 1.upto(number).map {|n| nth_fibonacci(n, first: first, second: second )}
+ end
+
+ def each(&block)
+ @sequence.each(&block)
+ end
+
+end
+
+class RationalSequence
+ include Enumerable
+
+ def initialize(number)
+ @sequence = 1.upto(number).map {|n| rational_generator(n)}
+ end
+
+ def each(&block)
+ @sequence.each(&block)
+ end
+
+ def sum
+ @sequence.to_a.reduce(0, :+)
+ end
+
+ end
+
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ n_rationals = RationalSequence.new(n)
+ group_1 = n_rationals.select {|x| prime?(x.numerator) or prime?(x.denominator)}
+ group_2 = n_rationals.select {|x| not (prime?(x.numerator) or prime?(x.denominator))}
+
+ group_1.reduce(1, :*) / group_2.reduce(1, :*)
+ end
+
+ def aimless(n)
+ n_primes = PrimeSequence.new(n).to_a
+ n_primes.push(1) if n_primes.count % 2 == 1
+
+ n_primes.each_slice(2).map {|first, second| Rational(first, second)}.reduce(0, :+)
+ end
+
+ def worthless(n)
+ number = 0
+ number +=1 until RationalSequence.new(number).sum > nth_fibonacci(n)
+
+ RationalSequence.new(number-1).to_a
+ end
+end
+

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

def prime?(number)
divisors = 0
2.upto(number-1).each {|x| divisors += 1 if number % x == 0 }
case number
when 0 then false
when 1 then false
else number == 2 or divisors == 0
end
end
def increasing_numerator(numerator, denominator)
numerator += 1
denominator -= 1 unless denominator == 1
return numerator, denominator if numerator.gcd(denominator) == 1
return increasing_numerator(numerator, denominator) if numerator.gcd(denominator) > 1
end
def decreasing_numerator(numerator, denominator)
numerator -= 1 unless numerator == 1
denominator += 1
return numerator, denominator if numerator.gcd(denominator) == 1
return decreasing_numerator(numerator, denominator) if numerator.gcd(denominator) > 1
end
def rational_generator(n)
return Rational(1,1) if n == 1
denominator = rational_generator(n-1).denominator
numerator = rational_generator(n-1).numerator
if (numerator + denominator) % 2 == 0
numerator_incremented = increasing_numerator(numerator, denominator)[0]
denominator_incremented = increasing_numerator(numerator, denominator)[1]
else
numerator_incremented = decreasing_numerator(numerator, denominator)[0]
denominator_incremented = decreasing_numerator(numerator, denominator)[1]
end
Rational(numerator_incremented, denominator_incremented)
end
def nth_fibonacci(place, first: 1, second: 1)
case place
when 0 then 0
when 1 then first
when 2 then second
else
fibonacci_first_predecessor = nth_fibonacci(place - 1, first: first, second: second)
fibonacci_second_predecessor = nth_fibonacci(place - 2, first: first, second: second)
fibonacci_first_predecessor + fibonacci_second_predecessor
end
end
+
class PrimeSequence
include Enumerable
def initialize(number)
infinity = 1.0/0
@sequence = (1..infinity).lazy.select{|n| prime?(n)}.take(number)
end
def each(&block)
@sequence.each(&block)
end
end
+
class FibonacciSequence
include Enumerable
def initialize(number, first: 1, second: 1)
@sequence = 1.upto(number).map {|n| nth_fibonacci(n, first: first, second: second )}
end
def each(&block)
@sequence.each(&block)
end
end
+
class RationalSequence
include Enumerable
def initialize(number)
@sequence = 1.upto(number).map {|n| rational_generator(n)}
end
def each(&block)
@sequence.each(&block)
end
def sum
@sequence.to_a.reduce(0, :+)
end
end
module DrunkenMathematician
module_function
def meaningless(n)
n_rationals = RationalSequence.new(n)
group_1 = n_rationals.select {|x| prime?(x.numerator) or prime?(x.denominator)}
group_2 = n_rationals.select {|x| not (prime?(x.numerator) or prime?(x.denominator))}
group_1.reduce(1, :*) / group_2.reduce(1, :*)
end
def aimless(n)
n_primes = PrimeSequence.new(n).to_a
n_primes.push(1) if n_primes.count % 2 == 1
n_primes.each_slice(2).map {|first, second| Rational(first, second)}.reduce(0, :+)
end
def worthless(n)
number = 0
number +=1 until RationalSequence.new(number).sum > nth_fibonacci(n)
RationalSequence.new(number-1).to_a
end
end

Георги обнови решението на 26.10.2015 10:23 (преди над 8 години)

def prime?(number)
divisors = 0
2.upto(number-1).each {|x| divisors += 1 if number % x == 0 }
case number
- when 0 then false
- when 1 then false
- else number == 2 or divisors == 0
+ when 0 then false
+ when 1 then false
+ else number == 2 or divisors == 0
end
end
+def prime?(number)
+ divisors = 0
+ 2.upto(number-1).each {|x| divisors += 1 if number % x == 0 }
+
+ case number
+ when 0 then false
+ when 1 then false
+ else number == 2 or divisors == 0
+ end
+end
+
def increasing_numerator(numerator, denominator)
numerator += 1
denominator -= 1 unless denominator == 1
return numerator, denominator if numerator.gcd(denominator) == 1
return increasing_numerator(numerator, denominator) if numerator.gcd(denominator) > 1
end
def decreasing_numerator(numerator, denominator)
numerator -= 1 unless numerator == 1
denominator += 1
return numerator, denominator if numerator.gcd(denominator) == 1
return decreasing_numerator(numerator, denominator) if numerator.gcd(denominator) > 1
end
def rational_generator(n)
return Rational(1,1) if n == 1
denominator = rational_generator(n-1).denominator
numerator = rational_generator(n-1).numerator
if (numerator + denominator) % 2 == 0
numerator_incremented = increasing_numerator(numerator, denominator)[0]
denominator_incremented = increasing_numerator(numerator, denominator)[1]
else
numerator_incremented = decreasing_numerator(numerator, denominator)[0]
denominator_incremented = decreasing_numerator(numerator, denominator)[1]
end
Rational(numerator_incremented, denominator_incremented)
end
def nth_fibonacci(place, first: 1, second: 1)
case place
- when 0 then 0
- when 1 then first
- when 2 then second
- else
+ when 0 then 0
+ when 1 then first
+ when 2 then second
+
+ else
fibonacci_first_predecessor = nth_fibonacci(place - 1, first: first, second: second)
fibonacci_second_predecessor = nth_fibonacci(place - 2, first: first, second: second)
fibonacci_first_predecessor + fibonacci_second_predecessor
end
end
class PrimeSequence
include Enumerable
def initialize(number)
infinity = 1.0/0
@sequence = (1..infinity).lazy.select{|n| prime?(n)}.take(number)
end
def each(&block)
@sequence.each(&block)
end
end
class FibonacciSequence
include Enumerable
def initialize(number, first: 1, second: 1)
@sequence = 1.upto(number).map {|n| nth_fibonacci(n, first: first, second: second )}
end
def each(&block)
@sequence.each(&block)
end
end
class RationalSequence
include Enumerable
def initialize(number)
@sequence = 1.upto(number).map {|n| rational_generator(n)}
end
def each(&block)
@sequence.each(&block)
end
def sum
@sequence.to_a.reduce(0, :+)
end
end
module DrunkenMathematician
module_function
def meaningless(n)
n_rationals = RationalSequence.new(n)
group_1 = n_rationals.select {|x| prime?(x.numerator) or prime?(x.denominator)}
group_2 = n_rationals.select {|x| not (prime?(x.numerator) or prime?(x.denominator))}
group_1.reduce(1, :*) / group_2.reduce(1, :*)
end
def aimless(n)
n_primes = PrimeSequence.new(n).to_a
n_primes.push(1) if n_primes.count % 2 == 1
n_primes.each_slice(2).map {|first, second| Rational(first, second)}.reduce(0, :+)
end
def worthless(n)
number = 0
number +=1 until RationalSequence.new(number).sum > nth_fibonacci(n)
RationalSequence.new(number-1).to_a
end
end
-