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

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

Към профила на Мирослав Лалев

Резултати

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

Код

class RationalSequence
def initialize(number)
@number_of_elements = number
end
def to_a()
Enumerator.new { |array|
start = Rational(1,1)
loop {
array.yield start
start = next_element(start.numerator, start.denominator)
}
}.take(@number_of_elements)
end
private
def next_element(numerator, denominator)
sum = numerator + denominator
sum.even? ?
get_even_element_step(numerator, denominator) :
get_odd_element_step(numerator, denominator)
end
def get_even_element_step(numerator, denominator)
if denominator == 1 then
Rational(numerator + 1, denominator)
else
check_relatively_prime(numerator + 1, denominator - 1) ?
Rational(numerator + 1, denominator - 1) :
get_even_element_step(numerator + 1, denominator - 1)
end
end
def get_odd_element_step(numerator, denominator)
if numerator == 1 then
Rational(numerator, denominator + 1)
else
check_relatively_prime(numerator - 1, denominator + 1) ?
Rational(numerator - 1, denominator + 1) :
get_odd_element_step(numerator - 1, denominator + 1)
end
end
def check_relatively_prime(numerator, denominator)
prime = Rational(numerator, denominator)
numerator == prime.numerator && denominator == prime.denominator
end
end
class Integer
def prime?()
#apparently not only the matematician is on steroids
return ('1' * self) !~ /^1?$|^(11+?)\1+$/
end
end
class PrimeSequence
def initialize(number)
@number_of_elements = number
end
def to_a()
(2..(1.0/0)).lazy.select{ |number|
number.prime?
}.take(@number_of_elements).to_a
end
end
class FibonacciSequence
def initialize(number, default_hash = { first: 1, second: 1})
@number_of_elements = number
@first = default_hash[:first]
@second = default_hash[:second]
end
def to_a()
Enumerator.new { |array|
i, j = @first, @second
loop {
array.yield i
i, j = j, i+j
}
}.take(@number_of_elements)
end
end
module DrunkenMathematician
module_function
def meaningless(n)
1 / RationalSequence.new(n).to_a.chunk { |number|
number.numerator.prime? or number.denominator.prime?
}.collect { |condition, index|
index.reduce(:*)
}.each_slice(2).to_a.flat_map { |element|
element.reduce(:/)
}.reduce(:*)
end
def aimless(n)
PrimeSequence.new(n).to_a.each.each_slice(2).to_a.collect { |element|
if (!element[1]) then element.push(1) end
Rational(element[0], element[1])
}.reduce(:+)
end
def worthless(n)
RationalSequence.new((1..1.0/0).lazy.take_while { |number|
RationalSequence.new(number).to_a.reduce(:+) <=
FibonacciSequence.new(n).to_a.last
}.to_a.last).to_a
end
end

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

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

Failures:

  1) Fifth task RationalSequence is properly enumerable
     Failure/Error: ones = RationalSequence.new(28).select { |r| r.numerator == 1 }
     NoMethodError:
       private method `select' called for #<RationalSequence:0x007f2ea2eca2e8 @number_of_elements=28>
     # /tmp/d20151111-27349-1f9ymrp/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 [
     NoMethodError:
       private method `select' called for #<FibonacciSequence:0x007f2ea2eae908>
     # /tmp/d20151111-27349-1f9ymrp/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:
       nil can't be coerced into Fixnum
     # /tmp/d20151111-27349-1f9ymrp/solution.rb:98:in `/'
     # /tmp/d20151111-27349-1f9ymrp/solution.rb:98:in `meaningless'
     # /tmp/d20151111-27349-1f9ymrp/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)>'

Finished in 0.17888 seconds
20 examples, 3 failures

Failed examples:

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

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

Мирослав обнови решението на 24.10.2015 16:43 (преди над 9 години)

+class RationalSequence
+ def initialize(number)
+ @number_of_elements = number
+ end
+
+ def to_a()
+ start = Rational(1,1)
+ [start] + (1...(1.0/0)).lazy.collect {
+ start = next_element(start.numerator, start. denominator)
+ }.take(@number_of_elements - 1).to_a
+ end
+
+ private
+
+ def next_element(numerator, denominator)
+ sum = numerator + denominator
+ sum.even? ?
+ get_even_element_step(numerator, denominator) :
+ get_odd_element_step(numerator, denominator)
+ end
+
+ def get_even_element_step(numerator, denominator)
+ if denominator == 1 then
+ Rational(numerator + 1, denominator)
+ else
+ check_relatively_prime(numerator + 1, denominator - 1) ?
+ Rational(numerator + 1, denominator - 1) :
+ get_even_element_step(numerator + 1, denominator - 1)
+ end
+ end
+
+ def get_odd_element_step(numerator, denominator)
+ if numerator == 1 then
+ Rational(numerator, denominator + 1)
+ else
+ check_relatively_prime(numerator - 1, denominator + 1) ?
+ Rational(numerator - 1, denominator + 1) :
+ get_odd_element_step(numerator - 1, denominator + 1)
+ end
+ end
+
+ def check_relatively_prime(numerator, denominator)
+ prime = Rational(numerator, denominator)
+ numerator == prime.numerator && denominator == prime.denominator
+ end
+end
+
+class Integer
+ def prime?()
+ return ('1' * self) !~ /^1?$|^(11+?)\1+$/
+ end
+end
+
+class PrimeSequence
+ def initialize(number)
+ @number_of_elements = number
+ end
+
+ def to_a()
+ (2..(1.0/0)).lazy.select{ |number|
+ number.prime?
+ }.take(@number_of_elements).to_a
+ end
+end
+
+class FibonacciSequence
+ def initialize(number, first=1, second=1)
+ @number_of_elements = number
+ @first = first
+ @second = second
+ end
+
+ def to_a()
+ [@first, @second] + (1..(1.0/0)).lazy.collect {
+ next_number = @first + @second
+ @first = @second
+ @second = next_number
+ }.take(@number_of_elements - 2).to_a
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ 1 / RationalSequence.new(n).to_a.chunk { |number|
+ number.numerator.prime? or number.denominator.prime?
+ }.collect { |condition, index|
+ index.reduce(:*)
+ }.each_slice(2).to_a.flat_map { |element|
+ element.reduce(:/)
+ }.reduce(:*)
+ end
+
+ def aimless(n)
+ PrimeSequence.new(n).to_a.each.each_slice(2).to_a.collect { |element|
+ if (!element[1]) then element.push(1) end
+ Rational(element[0], element[1])
+ }.reduce(:+)
+ end
+
+ def worthless(n)
+ RationalSequence.new((1..1.0/0).lazy.take_while { |number|
+ RationalSequence.new(number).to_a.reduce(:+) <
+ FibonacciSequence.new(n).to_a.last
+ }.to_a.last).to_a
+ end
+end

Мирослав обнови решението на 24.10.2015 20:11 (преди над 9 години)

class RationalSequence
def initialize(number)
@number_of_elements = number
end
def to_a()
- start = Rational(1,1)
- [start] + (1...(1.0/0)).lazy.collect {
- start = next_element(start.numerator, start. denominator)
- }.take(@number_of_elements - 1).to_a
+ Enumerator.new { |array|
+ start = Rational(1,1)
+ loop {
+ array.yield start
+ start = next_element(start.numerator, start.denominator)
+ }
+ }.take(@number_of_elements)
end
private
def next_element(numerator, denominator)
sum = numerator + denominator
sum.even? ?
get_even_element_step(numerator, denominator) :
get_odd_element_step(numerator, denominator)
end
def get_even_element_step(numerator, denominator)
if denominator == 1 then
Rational(numerator + 1, denominator)
else
check_relatively_prime(numerator + 1, denominator - 1) ?
Rational(numerator + 1, denominator - 1) :
get_even_element_step(numerator + 1, denominator - 1)
end
end
def get_odd_element_step(numerator, denominator)
if numerator == 1 then
Rational(numerator, denominator + 1)
else
check_relatively_prime(numerator - 1, denominator + 1) ?
Rational(numerator - 1, denominator + 1) :
get_odd_element_step(numerator - 1, denominator + 1)
end
end
def check_relatively_prime(numerator, denominator)
prime = Rational(numerator, denominator)
numerator == prime.numerator && denominator == prime.denominator
end
end
class Integer
def prime?()
+ #apparently not only the matematician is on steroids
return ('1' * self) !~ /^1?$|^(11+?)\1+$/
end
end
class PrimeSequence
def initialize(number)
@number_of_elements = number
end
def to_a()
(2..(1.0/0)).lazy.select{ |number|
number.prime?
}.take(@number_of_elements).to_a
end
end
class FibonacciSequence
- def initialize(number, first=1, second=1)
+ def initialize(number, default_hash = { first: 1, second: 1})
@number_of_elements = number
- @first = first
- @second = second
+ @first = default_hash[:first]
+ @second = default_hash[:second]
end
def to_a()
- [@first, @second] + (1..(1.0/0)).lazy.collect {
- next_number = @first + @second
- @first = @second
- @second = next_number
- }.take(@number_of_elements - 2).to_a
+ Enumerator.new { |array|
+ i, j = @first, @second
+ loop {
+ array.yield i
+ i, j = j, i+j
+ }
+ }.take(@number_of_elements)
end
end
module DrunkenMathematician
module_function
def meaningless(n)
1 / RationalSequence.new(n).to_a.chunk { |number|
number.numerator.prime? or number.denominator.prime?
}.collect { |condition, index|
index.reduce(:*)
}.each_slice(2).to_a.flat_map { |element|
element.reduce(:/)
}.reduce(:*)
end
def aimless(n)
PrimeSequence.new(n).to_a.each.each_slice(2).to_a.collect { |element|
if (!element[1]) then element.push(1) end
Rational(element[0], element[1])
}.reduce(:+)
end
def worthless(n)
RationalSequence.new((1..1.0/0).lazy.take_while { |number|
- RationalSequence.new(number).to_a.reduce(:+) <
+ RationalSequence.new(number).to_a.reduce(:+) <=
FibonacciSequence.new(n).to_a.last
}.to_a.last).to_a
end
end