Решение на Трета задача от Мартин Христов

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

Към профила на Мартин Христов

Резултати

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

Код

class RationalSequence
include Enumerable
def initialize(n)
@sequence = []
@n = n
end
def each &block
@sequence.each(block)
end
def to_a
sequence_member = [1, 1]
@sequence = [Rational(1, 1)]
i = 2
while (i <= @n)
numerator = sequence_member[0]
denominator = sequence_member[1]
sequence_member = calculate_next_member(numerator, denominator)
rational_member = Rational(sequence_member[0], sequence_member[1])
if (@sequence.include? rational_member)
nil
else
@sequence << rational_member
i+=1
end
end
@n == 0 ? [] : @sequence
end
private
def calculate_next_member(numerator, denominator)
if (numerator%2 == denominator%2)
numerator+=1
if (denominator > 1)
denominator-=1
end
else
denominator+=1
if (numerator > 1)
numerator-=1
end
end
[numerator, denominator]
end
end
class Numeric
def prime?
return false if self == 1
return self == 2 if self % 2 == 0
(3..Math.sqrt(self)).step(2) do |x|
return false if self % x == 0
end
true
end
end
class PrimeSequence
include Enumerable
def initialize(n)
@sequence = []
@n = n
end
def each &block
@sequence.each(block)
end
def to_a
count = 0
number = 2
while (count < @n)
if number.prime?
@sequence << number
count+=1
end
number+=1
end
@sequence
end
end
class FibonacciSequence
include Enumerable
def initialize(n, first: 1, second: 1)
@sequence = []
@n = n
@first_member = first
@second_member = second
end
def each &block
@sequence.each(block)
end
def to_a
generate_sequence(@n, @first_member, @second_member)
end
private
def generate_sequence(n, first_member=1, second_member=1)
n > 0 ? (@sequence << @first_member) : nil
n > 1 ? (@sequence << @second_member): nil
(n-2).times do
next_member = @first_member + @second_member
@sequence << next_member
@first_member = @second_member
@second_member = next_member
end
@sequence
end
end
module DrunkenMathematician
module_function
def meaningless(n)
rational_sequence = RationalSequence.new(n)
first_sequence = rational_sequence.to_a.select { |number|
number.numerator.prime? || number.denominator.prime? }
second_sequence = rational_sequence.to_a.select { |number|
!number.numerator.prime? && !number.denominator.prime?}
first_sequence_product = first_sequence.inject(:*)
second_sequence_product = second_sequence.inject(:*)
Rational(first_sequence_product, second_sequence_product)
end
def aimless(n)
prime_sequence = PrimeSequence.new(n).to_a
prime_sequence << 1 if n.odd?
rationals_count = (prime_sequence.length() / 2).round()
rationals_sequence = []
for i in (0..rationals_count).step(2) do
rationals_sequence << Rational(prime_sequence[i], prime_sequence[i+1])
end
rationals_sequence.inject(:+)
end
def worthless(n)
nth_fibonacci_member = FibonacciSequence.new(n).to_a.last()
rational_sequence_sum = 0
index = 1
while rational_sequence_sum < nth_fibonacci_member
rational_sequence = RationalSequence.new(index).to_a
rational_sequence_sum = rational_sequence.inject(:+)
index+=1
end
rational_sequence.length > 1 ? rational_sequence.pop() : nil
rational_sequence
end
end

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

...F...F...F....F...

Failures:

  1) Fifth task RationalSequence is properly enumerable
     Failure/Error: ones = RationalSequence.new(28).select { |r| r.numerator == 1 }
     ArgumentError:
       wrong number of arguments (1 for 0)
     # /tmp/d20151111-27349-qbafr2/solution.rb:10:in `each'
     # /tmp/d20151111-27349-qbafr2/solution.rb:10:in `each'
     # /tmp/d20151111-27349-qbafr2/spec.rb:19:in `select'
     # /tmp/d20151111-27349-qbafr2/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)>'

  2) Fifth task FibonacciSequence is properly enumerable
     Failure/Error: expect(FibonacciSequence.new(20).select { |x| x.even? }).to eq [
     ArgumentError:
       wrong number of arguments (1 for 0)
     # /tmp/d20151111-27349-qbafr2/solution.rb:100:in `each'
     # /tmp/d20151111-27349-qbafr2/solution.rb:100:in `each'
     # /tmp/d20151111-27349-qbafr2/spec.rb:45:in `select'
     # /tmp/d20151111-27349-qbafr2/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)>'

  3) Fifth task DrunkenMathematician #meaningless can calculate for 0 and 1
     Failure/Error: expect(DrunkenMathematician.meaningless(0)).to eq 1
     TypeError:
       can't convert nil into Rational
     # /tmp/d20151111-27349-qbafr2/solution.rb:138:in `convert'
     # /tmp/d20151111-27349-qbafr2/solution.rb:138:in `Rational'
     # /tmp/d20151111-27349-qbafr2/solution.rb:138:in `meaningless'
     # /tmp/d20151111-27349-qbafr2/spec.rb:73: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)>'

  4) Fifth task DrunkenMathematician #aimless can calculate for 42
     Failure/Error: expect(DrunkenMathematician.aimless(42)).to eq expected
       
       expected: (126481765191558862062699751684617707800/6619489496139348390798112786167608259)
            got: (40916146489375618/4339858504793721)
       
       (compared using ==)
     # /tmp/d20151111-27349-qbafr2/spec.rb:97: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.32754 seconds
20 examples, 4 failures

Failed examples:

rspec /tmp/d20151111-27349-qbafr2/spec.rb:18 # Fifth task RationalSequence is properly enumerable
rspec /tmp/d20151111-27349-qbafr2/spec.rb:44 # Fifth task FibonacciSequence is properly enumerable
rspec /tmp/d20151111-27349-qbafr2/spec.rb:72 # Fifth task DrunkenMathematician #meaningless can calculate for 0 and 1
rspec /tmp/d20151111-27349-qbafr2/spec.rb:95 # Fifth task DrunkenMathematician #aimless can calculate for 42

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

Мартин обнови решението на 25.10.2015 20:17 (преди над 8 години)

+class RationalSequence
+ include Enumerable
+
+ def initialize(n)
+ @sequence = []
+ @n = n
+ end
+
+ def each &block
+ @sequence.each(block)
+ end
+
+ def to_a
+ sequence_member = [1, 1]
+ @sequence = [Rational(1, 1)]
+ i = 2
+ while (i <= @n)
+ numerator = sequence_member[0]
+ denominator = sequence_member[1]
+ sequence_member = calculate_next_member(numerator, denominator)
+ rational_member = Rational(sequence_member[0], sequence_member[1])
+ if (@sequence.include? rational_member)
+ nil
+ else
+ @sequence << rational_member
+ i+=1
+ end
+ end
+
+ @n == 0 ? [] : @sequence
+ end
+
+ private
+ def calculate_next_member(numerator, denominator)
+ if (numerator%2 == denominator%2)
+ numerator+=1
+ if (denominator > 1)
+ denominator-=1
+ end
+ else
+ denominator+=1
+ if (numerator > 1)
+ numerator-=1
+ end
+ end
+ [numerator, denominator]
+ end
+end
+
+class Numeric
+ def prime?
+ return false if self == 1
+ return self == 2 if self % 2 == 0
+
+ (3..Math.sqrt(self)).step(2) do |x|
+ return false if self % x == 0
+ end
+
+ true
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(n)
+ @sequence = []
+ @n = n
+ end
+
+ def each &block
+ @sequence.each(block)
+ end
+
+ def to_a
+ count = 0
+ number = 2
+ while (count < @n)
+ if number.prime?
+ @sequence << number
+ count+=1
+ end
+ number+=1
+ end
+ @sequence
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(n, first: 1, second: 1)
+ @sequence = []
+ @n = n
+ @first_member = first
+ @second_member = second
+ end
+
+ def each &block
+ @sequence.each(block)
+ end
+
+ def to_a
+ generate_sequence(@n, @first_member, @second_member)
+ end
+
+ private
+
+ def generate_sequence(n, first_member=1, second_member=1)
+ n > 0 ? (@sequence << @first_member) : nil
+ n > 1 ? (@sequence << @second_member): nil
+
+ (n-2).times do
+ next_member = @first_member + @second_member
+ @sequence << next_member
+ @first_member = @second_member
+ @second_member = next_member
+ end
+
+ @sequence
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ rational_sequence = RationalSequence.new(n)
+ first_sequence = rational_sequence.to_a.select { |number|
+ number.numerator.prime? || number.denominator.prime? }
+
+ second_sequence = rational_sequence.to_a.select { |number|
+ !number.numerator.prime? && !number.denominator.prime?}
+
+ first_sequence_product = first_sequence.inject(:*)
+ second_sequence_product = second_sequence.inject(:*)
+
+ Rational(first_sequence_product, second_sequence_product)
+ end
+
+ def aimless(n)
+ prime_sequence = PrimeSequence.new(n).to_a
+ prime_sequence << 1 if n.odd?
+ rationals_count = (prime_sequence.length() / 2).round()
+ rationals_sequence = []
+ for i in (0..rationals_count).step(2) do
+ rationals_sequence << Rational(prime_sequence[i], prime_sequence[i+1])
+ end
+
+ rationals_sequence.inject(:+)
+ end
+
+ def worthless(n)
+ nth_fibonacci_member = FibonacciSequence.new(n).to_a.last()
+ rational_sequence_sum = 0
+ index = 1
+
+ while rational_sequence_sum < nth_fibonacci_member
+ rational_sequence = RationalSequence.new(index).to_a
+ rational_sequence_sum = rational_sequence.inject(:+)
+ index+=1
+ end
+ rational_sequence.length > 1 ? rational_sequence.pop() : nil
+ rational_sequence
+ end
+end