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

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

Към профила на Веселин Русинов

Резултати

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

Код

require 'matrix'
class RationalSequence
include Enumerable
def each
@sequence.each do |element|
yield element
end
end
def add_up_diagonal(x, y, limit)
while (x >= 0 && @sequence.length < limit) do
if (x >= 0 && y >= 0 && !@sequence.include?(Rational(@matrix[y, x][0], @matrix[y, x][1])))
@sequence << Rational(@matrix.element(y, x).first, @matrix.element(y, x).last)
end
if y <= 0
x += 1
break
end
y -= 1
x += 1
end
return x, y
end
def add_down_diagonal(x, y, limit)
while(y >=0 && @sequence.length < limit) do
if (y >= 0 && x >= 0 && !@sequence.include?(Rational(@matrix[y, x][0], @matrix[y, x][1])))
@sequence << Rational(@matrix.element(y, x).first, @matrix.element(y, x).last)
end
if x <= 0
y += 1
break
end
y += 1
x -= 1
end
return x, y
end
def initialize(limit)
@sequence = Array.new
@matrix = Matrix.build(limit, limit) {|x, y| [x+1, y+1]}
y = 0
x = 0
while(@sequence.length < limit) do
x, y = add_down_diagonal(x, y, limit)
x, y = add_up_diagonal(x, y, limit)
end
end
end
class Numeric
def prime?
return false if self <= 1
(2...self).all? { |divisor| self % divisor != 0 }
end
end
class PrimeSequence
include Enumerable
def each
@sequence.each do |element|
yield element
end
end
def initialize(limit)
@sequence = Array.new(0)
next_number = 2
while(@sequence.length < limit)
if (next_number.prime?)
@sequence << next_number
end
next_number+= 1
end
end
end
class FibonacciSequence
include Enumerable
def each
@sequence.each do |element|
yield element
end
end
def initialize(limit, first: 0, second: 1)
@sequence = Array.new(0)
while(@sequence.length < limit)
@sequence << first
temp = first + second
first = second
second = temp
end
end
end
module DrunkenMathematician
def self.meaningless(n)
rationals = RationalSequence.new(n).to_a.partition do |rational|
(rational.numerator.prime? || rational.denominator.prime?)
end
rationals.map { |group| (group.reduce(:*) || Rational(1, 1)) }.reduce(:/)
end
def self.aimless(n)
rationals = []
primes = PrimeSequence.new(n).to_a
primes.each_slice(2) do |numerator, denominator|
rationals << Rational(numerator, (denominator || 1))
end
rationals.reduce(:+)
end
def self.worthless(n)
fibonacci = FibonacciSequence.new(n).to_a.last
result = []
n.downto(1) do |current|
result = RationalSequence.new(current).to_a
if (result.reduce(:+).to_i <= fibonacci)
break
end
end
result
end
end

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

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

Failures:

  1) Fifth task FibonacciSequence can return the first two Fibonacci numbers
     Failure/Error: expect(FibonacciSequence.new(2).to_a).to eq [1, 1]
       
       expected: [1, 1]
            got: [0, 1]
       
       (compared using ==)
     # /tmp/d20151111-27349-yub05x/spec.rb:26: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 FibonacciSequence can return the first 20 Fibonacci numbers
     Failure/Error: expect(FibonacciSequence.new(20).to_a).to eq [
       
       expected: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
            got: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
       
       (compared using ==)
     # /tmp/d20151111-27349-yub05x/spec.rb:30: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 is properly enumerable
     Failure/Error: expect(FibonacciSequence.new(20).select { |x| x.even? }).to eq [
       
       expected: [2, 8, 34, 144, 610, 2584]
            got: [0, 2, 8, 34, 144, 610, 2584]
       
       (compared using ==)
     # /tmp/d20151111-27349-yub05x/spec.rb:45: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 #worthless can calculate for 8
     Failure/Error: expect(DrunkenMathematician.worthless(8)).to eq expected
       
       expected: [(1/1), (2/1), (1/2), (1/3), (3/1), (4/1), (3/2), (2/3), (1/4), (1/5), (5/1)]
            got: [(1/1), (2/1), (1/2), (1/3), (3/1), (4/1), (3/2), (2/3)]
       
       (compared using ==)
     # /tmp/d20151111-27349-yub05x/spec.rb:108: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(
       
       expected: [(1/1), (2/1), (1/2), (1/3), (3/1), (4/1), (3/2), (2/3), (1/4), (1/5), (5/1), (6/1), (5/2), (4/3), (3/4), (2/5), (1/6), (1/7), (3/5), (5/3), (7/1), (8/1), (7/2), (5/4), (4/5), (2/7), (1/8), (1/9), (3/7), (7/3), (9/1), (10/1), (9/2), (8/3), (7/4), (6/5), (5/6), (4/7), (3/8), (2/9), (1/10), (1/11), (5/7), (7/5), (11/1), (12/1), (11/2), (10/3), (9/4), (8/5), (7/6), (6/7), (5/8), (4/9), (3/10), (2/11), (1/12), (1/13), (3/11), (5/9), (9/5), (11/3), (13/1), (14/1), (13/2), (11/4), (8/7), (7/8), (4/11), (2/13), (1/14), (1/15), (3/13), (5/11), (7/9), (9/7), (11/5), (13/3), (15/1), (16/1), (15/2), (14/3), (13/4), (12/5), (11/6), (10/7), (9/8), (8/9), (7/10), (6/11), (5/12), (4/13), (3/14), (2/15), (1/16), (1/17), (5/13), (7/11), (11/7), (13/5), (17/1), (18/1), (17/2), (16/3), (15/4), (14/5), (13/6), (12/7), (11/8), (10/9), (9/10), (8/11), (7/12), (6/13), (5/14), (4/15), (3/16), (2/17), (1/18), (1/19), (3/17), (7/13), (9/11), (11/9), (13/7), (17/3), (19/1), (20/1), (19/2), (17/4), (16/5), (13/8), (11/10), (10/11), (8/13), (5/16), (4/17), (2/19), (1/20), (1/21), (3/19), (5/17), (7/15), (9/13), (13/9), (15/7), (17/5), (19/3), (21/1), (22/1), (21/2), (20/3), (19/4), (18/5), (17/6), (16/7), (15/8), (14/9), (13/10), (12/11), (11/12), (10/13), (9/14), (8/15), (7/16), (6/17), (5/18), (4/19), (3/20), (2/21), (1/22), (1/23), (5/19), (7/17), (11/13), (13/11), (17/7), (19/5), (23/1), (24/1), (23/2), (22/3), (21/4), (19/6), (18/7), (17/8), (16/9), (14/11), (13/12), (12/13), (11/14), (9/16), (8/17), (7/18), (6/19), (4/21), (3/22), (2/23), (1/24), (1/25), (3/23), (5/21), (7/19), (9/17), (11/15), (15/11), (17/9), (19/7), (21/5), (23/3)]
            got: [(1/1), (2/1), (1/2), (1/3), (3/1), (4/1), (3/2), (2/3), (1/4), (1/5), (5/1), (6/1), (5/2), (4/3), (3/4)]
       
       (compared using ==)
     # /tmp/d20151111-27349-yub05x/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 0.02067 seconds
20 examples, 5 failures

Failed examples:

rspec /tmp/d20151111-27349-yub05x/spec.rb:25 # Fifth task FibonacciSequence can return the first two Fibonacci numbers
rspec /tmp/d20151111-27349-yub05x/spec.rb:29 # Fifth task FibonacciSequence can return the first 20 Fibonacci numbers
rspec /tmp/d20151111-27349-yub05x/spec.rb:44 # Fifth task FibonacciSequence is properly enumerable
rspec /tmp/d20151111-27349-yub05x/spec.rb:106 # Fifth task DrunkenMathematician #worthless can calculate for 8
rspec /tmp/d20151111-27349-yub05x/spec.rb:111 # Fifth task DrunkenMathematician #worthless can calculate for 15

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

Веселин обнови решението на 25.10.2015 17:15 (преди над 8 години)

+require 'matrix'
+
+class RationalSequence
+ include Enumerable
+
+ def each
+ @sequence.each do |element|
+ yield element
+ end
+ end
+
+ def add_up_diagonal(x, y, limit)
+ while (x >= 0 && @sequence.length < limit) do
+ if (x >= 0 && y >= 0 && !@sequence.include?(Rational(@matrix[y, x][0], @matrix[y, x][1])))
+ @sequence << Rational(@matrix.element(y, x).first, @matrix.element(y, x).last)
+ end
+ if y <= 0
+ x += 1
+ break
+ end
+ y -= 1
+ x += 1
+ end
+ return x, y
+ end
+
+ def add_down_diagonal(x, y, limit)
+ while(y >=0 && @sequence.length < limit) do
+ if (y >= 0 && x >= 0 && !@sequence.include?(Rational(@matrix[y, x][0], @matrix[y, x][1])))
+ @sequence << Rational(@matrix.element(y, x).first, @matrix.element(y, x).last)
+ end
+ if x <= 0
+ y += 1
+ break
+ end
+ y += 1
+ x -= 1
+ end
+ return x, y
+ end
+
+ def initialize(limit)
+ @sequence = Array.new
+ @matrix = Matrix.build(limit, limit) {|x, y| [x+1, y+1]}
+ y = 0
+ x = 0
+ while(@sequence.length < limit) do
+ x, y = add_down_diagonal(x, y, limit)
+ x, y = add_up_diagonal(x, y, limit)
+ end
+ end
+end
+
+class Numeric
+ def prime?
+ return false if self <= 1
+ (2...self).all? { |divisor| self % divisor != 0 }
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def each
+ @sequence.each do |element|
+ yield element
+ end
+ end
+
+ def initialize(limit)
+ @sequence = Array.new(0)
+ next_number = 2
+ while(@sequence.length < limit)
+ if (next_number.prime?)
+ @sequence << next_number
+ end
+ next_number+= 1
+ end
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def each
+ @sequence.each do |element|
+ yield element
+ end
+ end
+
+ def initialize(limit, first: 0, second: 1)
+ @sequence = Array.new(0)
+
+ while(@sequence.length < limit)
+ @sequence << first
+ temp = first + second
+ first = second
+ second = temp
+ end
+ end
+end
+
+module DrunkenMathematician
+ def self.meaningless(n)
+ rationals = RationalSequence.new(n).to_a.partition do |rational|
+ (rational.numerator.prime? || rational.denominator.prime?)
+ end
+ rationals.map { |group| (group.reduce(:*) || Rational(1, 1)) }.reduce(:/)
+ end
+
+ def self.aimless(n)
+ rationals = []
+ primes = PrimeSequence.new(n).to_a
+ primes.each_slice(2) do |numerator, denominator|
+ rationals << Rational(numerator, (denominator || 1))
+ end
+ rationals.reduce(:+)
+ end
+
+ def self.worthless(n)
+ fibonacci = FibonacciSequence.new(n).to_a.last
+ result = []
+ n.downto(1) do |current|
+ result = RationalSequence.new(current).to_a
+ if (result.reduce(:+).to_i <= fibonacci)
+ break
+ end
+ end
+ result
+ end
+end