Решение на Трета задача от Клара Кайралах

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

Към профила на Клара Кайралах

Резултати

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

Код

class PrimeSequence
include Enumerable
def initialize(x)
@x = x
end
def self.is_prime?(number)
return false if number <= 1
Math.sqrt(number).to_i.downto(2).each { |i| return false if number % i == 0 }
true
end
def each
current, current_position = 1, 0
while current_position < @x
if PrimeSequence.is_prime?(current)
yield current
current_position = current_position + 1
end
current = current + 1
end
end
end
class FibonacciSequence
include Enumerable
def initialize(x, first:1, second:0)
@x = x
@first = first
@second = second
end
def each
current, previous = @first, @second
current_iteration = 1
while current_iteration <= @x
yield current
current, previous = current + previous, current
current_iteration += 1
end
end
end
class RationalSequence
include Enumerable
def initialize(x)
@x = x
@current_iteration = 2
@numerator = 2
@denominator = 1
end
def make_rational_number()
array_of_rational_numbers = []
if @denominator % 2 == 0
@denominator, @current_iteration = @denominator + 1, @current_iteration + 1
array_of_rational_numbers.push(Rational("#{@numerator}", "#{@denominator}"))
end
while @denominator > 1 && @current_iteration < @x
@numerator, @denominator = @numerator+1, @denominator - 1 # 2/4
if (@numerator % @denominator == 0 || @denominator % @numerator == 0) && @denominator != 1
else
@current_iteration = @current_iteration + 1
array_of_rational_numbers.push(Rational("#{@numerator}", "#{@denominator}"))
end
end
array_of_rational_numbers
end
def make_more_rational_numbers()
array_of_rational_numbers = []
if @numerator % 2 != 0
@numerator, @current_iteration = @numerator + 1, @current_iteration + 1
array_of_rational_numbers.push(Rational("#{@numerator}", "#{@denominator}"))
end
while @numerator > 1 && @current_iteration < @x
@numerator, @denominator = @numerator - 1, @denominator + 1
if @numerator % @denominator == 0 && @denominator != 1
else
@current_iteration = @current_iteration + 1
array_of_rational_numbers.push(Rational("#{@numerator}", "#{@denominator}"))
end
end
array_of_rational_numbers
end
def condition()
if @numerator == 1 then make_rational_number().each{ |x| x }
elsif @denominator == 1 then make_more_rational_numbers().each{ |x| x } end
end
def each
if @x != 0 then yield Rational(1,1) end
if @x > 1 then yield Rational("#{@numerator}", "#{@denominator}") end
while @current_iteration < @x
condition().each{ |x| yield x }
end
end
end
module DrunkenMathematician
module_function
def meaningless(n)
if n == 0 then return 1 end
first_group, second_group, sequence = [], [], RationalSequence.new(n).to_a
sequence.each do |x|
if PrimeSequence.is_prime?(x.numerator) || PrimeSequence.is_prime?(x.denominator)
first_group.push(x)
end
if !PrimeSequence.is_prime?(x.numerator) && !PrimeSequence.is_prime?(x.denominator)
second_group.push(x)
end
end
if first_group == [] then first_group.push(1) end
if second_group == [] then second_group.push(1) end
Rational(first_group.inject(:*), second_group.inject(:*))
end
def aimless(n)
if n == 0 then return 0 end
sequence, first_group = PrimeSequence.new(n).to_a, [], []
sequence.each_slice(2) do |x|
if x.length < 2 then x.push(1) end
first_group.push(Rational(x.first, x.last))
end
first_group.inject(:+)
end
def worthless(n)
if n == 0 then return [] end
current_iteration = 1
while true
nth_number_of_fib = FibonacciSequence.new(n).to_a.last
sum = RationalSequence.new(current_iteration + 1).to_a.inject(:+)
if sum >= nth_number_of_fib
return RationalSequence.new(current_iteration).to_a
end
current_iteration += 1
end
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(
       
       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)]
            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), (2/5), (1/6), (1/7), (3/5), (5/3), (7/1), (8/1), (7/2), (5/4), (4/5), (1/2), (2/7), (1/8)]
       
       (compared using ==)
     # /tmp/d20151111-27349-gqsfs3/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: expect(ones).to eq %w(1/1 1/2 1/3 1/4 1/5 1/6 1/7 1/8 1/9).map(&:to_r)
       
       expected: [(1/1), (1/2), (1/3), (1/4), (1/5), (1/6), (1/7), (1/8), (1/9)]
            got: [(1/1), (1/2), (1/3), (1/4), (1/5), (1/6), (1/7), (1/2), (1/8)]
       
       (compared using ==)
     # /tmp/d20151111-27349-gqsfs3/spec.rb:20: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 [
       
       expected: [2, 1, 3, 4, 7, 11, 18, 29, 47, 76, 123, 199, 322, 521, 843, 1364, 2207, 3571, 5778, 9349, 15127, 24476, 39603, 64079, 103682, 167761, 271443, 439204, 710647, 1149851, 1860498]
            got: [2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578]
       
       (compared using ==)
     # /tmp/d20151111-27349-gqsfs3/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)
       
       expected: (1/11)
            got: (9/40)
       
       (compared using ==)
     # /tmp/d20151111-27349-gqsfs3/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(
       
       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), (2/5), (1/6), (1/7), (3/5), (5/3), (7/1), (8/1), (7/2), (5/4), (4/5), (1/2), (2/7), (1/8), (1/9), (3/7), (2/3), (3/2), (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), (2/5), (5/9), (3/4), (4/3), (9/5), (5/2), (11/3), (13/1), (14/1), (13/2), (11/4), (3/2), (8/7), (7/8), (2/3), (1/2), (4/11), (1/4), (2/13), (1/14), (1/15), (3/13), (5/11), (3/5), (7/9), (9/7), (5/3), (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), (2/7), (5/13), (7/11), (4/5), (5/4), (11/7), (13/5), (7/2), (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), (3/7), (7/13), (2/3), (9/11), (11/9), (3/2), (13/7), (7/3), (17/3), (19/1), (20/1), (19/2), (17/4), (16/5), (5/2), (13/8), (4/3), (11/10), (10/11), (3/4), (8/13), (1/2), (2/5), (5/16), (4/17), (1/6), (2/19), (1/20), (1/21), (3/19), (2/9), (5/17), (3/8), (7/15), (4/7), (9/13), (5/6), (6/5), (13/9), (7/4), (15/7), (8/3), (17/5), (9/2), (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), (3/5), (5/7), (11/13), (13/11), (7/5), (5/3), (17/7), (19/5), (23/1), (24/1), (23/2), (22/3), (21/4), (19/6)]
       
       (compared using ==)
     # /tmp/d20151111-27349-gqsfs3/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.19491 seconds
20 examples, 5 failures

Failed examples:

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

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

Клара обнови решението на 25.10.2015 13:33 (преди над 8 години)

+class PrimeSequence
+ include Enumerable
+
+ def initialize(x)
+ @x = x
+ end
+
+ def self.is_prime?(number)
+ return false if number <= 1
+ Math.sqrt(number).to_i.downto(2).each { |i| return false if number % i == 0 }
+ true
+ end
+
+ def each
+ current, current_position = 1, 0
+ while current_position < @x
+ if PrimeSequence.is_prime?(current)
+ yield current
+ current_position = current_position + 1
+ end
+ current = current + 1
+ end
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(x, first:1, second:0)
+ @x = x
+ @first = first
+ @second = second
+ end
+
+ def each
+ current, previous = @first, @second
+ current_iteration = 1
+ while current_iteration <= @x
+ yield current
+ current, previous = current + previous, current
+ current_iteration += 1
+ end
+ end
+end
+
+
+class RationalSequence
+ include Enumerable
+
+ def initialize(x)
+ @x = x
+ @current_iteration = 2
+ @numerator = 2
+ @denominator = 1
+ end
+
+ def make_rational_number()
+ array_of_rational_numbers = []
+ if @denominator % 2 == 0
+ @denominator, @current_iteration = @denominator + 1, @current_iteration + 1
+ array_of_rational_numbers.push(Rational("#{@numerator}", "#{@denominator}"))
+ end
+ while @denominator > 1 && @current_iteration < @x
+ @numerator, @denominator = @numerator+1, @denominator - 1 # 2/4
+ if (@numerator % @denominator == 0 || @denominator % @numerator == 0) && @denominator != 1
+ else
+ @current_iteration = @current_iteration + 1
+ array_of_rational_numbers.push(Rational("#{@numerator}", "#{@denominator}"))
+ end
+ end
+ array_of_rational_numbers
+ end
+
+ def make_more_rational_numbers()
+ array_of_rational_numbers = []
+ if @numerator % 2 != 0
+ @numerator, @current_iteration = @numerator + 1, @current_iteration + 1
+ array_of_rational_numbers.push(Rational("#{@numerator}", "#{@denominator}"))
+ end
+ while @numerator > 1 && @current_iteration < @x
+ @numerator, @denominator = @numerator - 1, @denominator + 1
+ if @numerator % @denominator == 0 && @denominator != 1
+ else
+ @current_iteration = @current_iteration + 1
+ array_of_rational_numbers.push(Rational("#{@numerator}", "#{@denominator}"))
+ end
+ end
+ array_of_rational_numbers
+ end
+
+ def condition()
+ if @numerator == 1 then make_rational_number().each{ |x| x }
+ elsif @denominator == 1 then make_more_rational_numbers().each{ |x| x } end
+ end
+
+ def each
+ if @x != 0 then yield Rational(1,1) end
+ if @x > 1 then yield Rational("#{@numerator}", "#{@denominator}") end
+ while @current_iteration < @x
+ condition().each{ |x| yield x }
+ end
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ if n == 0 then return 1 end
+ first_group, second_group, sequence = [], [], RationalSequence.new(n).to_a
+ sequence.each do |x|
+ if PrimeSequence.is_prime?(x.numerator) || PrimeSequence.is_prime?(x.denominator)
+ first_group.push(x)
+ end
+ if !PrimeSequence.is_prime?(x.numerator) && !PrimeSequence.is_prime?(x.denominator)
+ second_group.push(x)
+ end
+ end
+ if first_group == [] then first_group.push(1) end
+ if second_group == [] then second_group.push(1) end
+ Rational(first_group.inject(:*), second_group.inject(:*))
+ end
+
+ def aimless(n)
+ if n == 0 then return 0 end
+ sequence, first_group = PrimeSequence.new(n).to_a, [], []
+ sequence.each_slice(2) do |x|
+ if x.length < 2 then x.push(1) end
+ first_group.push(Rational(x.first, x.last))
+ end
+ first_group.inject(:+)
+ end
+
+ def worthless(n)
+ if n == 0 then return [] end
+ current_iteration = 1
+ while true
+ nth_number_of_fib = FibonacciSequence.new(n).to_a.last
+ sum = RationalSequence.new(current_iteration + 1).to_a.inject(:+)
+ if sum >= nth_number_of_fib
+ return RationalSequence.new(current_iteration).to_a
+ end
+ current_iteration += 1
+ end
+ end
+
+end