Решение на Трета задача от Пламен Никифоров

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

Към профила на Пламен Никифоров

Резултати

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

Код

class RationalSequence
include Enumerable
def initialize(sequence_length)
@sequence_length = sequence_length
end
def get_current_diagonal(element)
current_diagonal = 1
member_count = 1
while(element >= member_count)
member_count += current_diagonal
current_diagonal += 1
end
current_diagonal - 1
end
def compare_elements(first_element, second_element)
if first_element == second_element
second_element
else
return nil
end
end
def remove_doubles(elements)
counter = 0
second_counter = 1
doubles = []
for counter in 0..elements.length-1 do
for second_counter in counter+1..elements.length-1 do
doubles << compare_elements(elements[counter], elements[second_counter])
second_counter += 1
end
counter += 1
end
return elements - doubles.uniq
end
def get_diagonal_elements(diagonal)
numerator = 1
denominator = diagonal
elements = []
while denominator >= 1
elements << Rational(numerator,denominator)
numerator += 1
denominator = denominator - 1
end
return elements
end
def each
current = 1
elements = []
while current <= @sequence_length+1
if get_current_diagonal(current).even?
elements += get_diagonal_elements(get_current_diagonal(current)).reverse
else
elements += get_diagonal_elements(get_current_diagonal(current))
end
current = current + get_current_diagonal(current)
end
elements = remove_doubles(elements.uniq).first(@sequence_length)
elements.each {|elem| yield elem}
end
end
def is_prime?(number)
counter = 2
dividers_found = 1
for counter in 2..number do
if number%counter == 0
dividers_found +=1
end
counter+=1
end
if dividers_found == 2
return true
else
return false
end
end
class PrimeSequence
include Enumerable
def initialize(sequence_length)
@sequence_length = sequence_length
end
def each
numbers_found = 0
current_number = 2
while numbers_found < @sequence_length
if is_prime?(current_number)
numbers_found += 1
current_number
yield current_number
end
current_number += 1
end
end
end
class FibonacciSequence
include Enumerable
def initialize(sequence_length, first: nil, second: nil)
@sequence_length = sequence_length
if first and second
@first = first
@second = second
else
@first = 1
@second = 1
end
end
def each
current_position = 0
sequence = [@first, @second]
while current_position < @sequence_length
sequence[current_position+2] = sequence[current_position] + sequence[current_position+1]
current_position += 1
end
sequence.take(@sequence_length).each{|element| yield element}
end
end
module DrunkenMathematician
module_function
def meaningless(n)
alpha_group = RationalSequence.new(n)
first_group = alpha_group.find_all { |number|
is_prime?(number.denominator) or is_prime?(number.numerator)
}
second_group = alpha_group.find_all { |number|
not(is_prime?(number.denominator) or is_prime?(number.numerator))
}
first_group.empty? ? first_group[0] = Rational(1) : first_group
second_group.empty? ? second_group[0] = Rational(1) : second_group
first_group.reduce(:*) / second_group.reduce(:*)
end
def aimless(n)
sequence = PrimeSequence.new(n)
sum = Rational(0,1)
sequence.each_slice(2).to_a.each{ |element|
if element[1] == nil
sum = sum + Rational(element[0],1).to_r
else
sum = sum + Rational(element[0],element[1])
end
}
sum.to_r
end
def worthless(n)
if n == 0
return []
end
last_fibonacci = FibonacciSequence.new(n).to_a[-1]
found = false
current_sequence = 1
while not found
if RationalSequence.new(current_sequence).reduce(:+) > last_fibonacci
return RationalSequence.new(current_sequence-1).to_a
found = true
else
current_sequence += 1
end
end
end
end

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

..FF.........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), (2/7), (1/8)]
       
       (compared using ==)
     # /tmp/d20151111-27349-1azfes2/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/8)]
       
       (compared using ==)
     # /tmp/d20151111-27349-1azfes2/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 DrunkenMathematician #meaningless can calculate for 42
     Failure/Error: expect(DrunkenMathematician.meaningless(42)).to eq Rational(1, 11)
       
       expected: (1/11)
            got: (1/1)
       
       (compared using ==)
     # /tmp/d20151111-27349-1azfes2/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)>'

  4) Fifth task DrunkenMathematician #worthless can calculate for 15
     Failure/Error: expect(DrunkenMathematician.worthless(15)).to eq %w(
     Timeout::Error:
       execution expired
     # /tmp/d20151111-27349-1azfes2/solution.rb:20:in `compare_elements'
     # /tmp/d20151111-27349-1azfes2/solution.rb:32:in `block (2 levels) in remove_doubles'
     # /tmp/d20151111-27349-1azfes2/solution.rb:31:in `each'
     # /tmp/d20151111-27349-1azfes2/solution.rb:31:in `block in remove_doubles'
     # /tmp/d20151111-27349-1azfes2/solution.rb:30:in `each'
     # /tmp/d20151111-27349-1azfes2/solution.rb:30:in `remove_doubles'
     # /tmp/d20151111-27349-1azfes2/solution.rb:63:in `each'
     # /tmp/d20151111-27349-1azfes2/solution.rb:170:in `reduce'
     # /tmp/d20151111-27349-1azfes2/solution.rb:170:in `worthless'
     # /tmp/d20151111-27349-1azfes2/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 1.1 seconds
20 examples, 4 failures

Failed examples:

rspec /tmp/d20151111-27349-1azfes2/spec.rb:11 # Fifth task RationalSequence can calculate the first 28 rational numbers
rspec /tmp/d20151111-27349-1azfes2/spec.rb:18 # Fifth task RationalSequence is properly enumerable
rspec /tmp/d20151111-27349-1azfes2/spec.rb:81 # Fifth task DrunkenMathematician #meaningless can calculate for 42
rspec /tmp/d20151111-27349-1azfes2/spec.rb:111 # Fifth task DrunkenMathematician #worthless can calculate for 15

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

Пламен обнови решението на 24.10.2015 17:27 (преди над 8 години)

+class RationalSequence
+ include Enumerable
+
+ def initialize(sequence_length)
+ @sequence_length = sequence_length
+ end
+
+ def get_current_diagonal(element)
+ current_diagonal = 1
+ member_count = 1
+ while(element >= member_count)
+ member_count += current_diagonal
+ current_diagonal += 1
+ end
+ current_diagonal - 1
+ end
+
+ def compare_elements(first_element, second_element)
+ if first_element == second_element
+ second_element
+ else
+ return nil
+ end
+ end
+
+ def remove_doubles(elements)
+ counter = 0
+ second_counter = 1
+ doubles = []
+ for counter in 0..elements.length-1 do
+ for second_counter in counter+1..elements.length-1 do
+ doubles << compare_elements(elements[counter], elements[second_counter])
+ second_counter += 1
+ end
+ counter += 1
+ end
+ return elements - doubles.uniq
+ end
+
+ def get_diagonal_elements(diagonal)
+ numerator = 1
+ denominator = diagonal
+ elements = []
+ while denominator >= 1
+ elements << Rational(numerator,denominator)
+ numerator += 1
+ denominator = denominator - 1
+ end
+ return elements
+ end
+
+ def each
+ current = 1
+ elements = []
+ while current <= @sequence_length+1
+ if get_current_diagonal(current).even?
+ elements += get_diagonal_elements(get_current_diagonal(current)).reverse
+ else
+ elements += get_diagonal_elements(get_current_diagonal(current))
+ end
+ current = current + get_current_diagonal(current)
+ end
+ elements = remove_doubles(elements.uniq).first(@sequence_length)
+ elements.each {|elem| yield elem}
+ end
+end
+
+ def is_prime?(number)
+ counter = 2
+ dividers_found = 1
+ for counter in 2..number do
+ if number%counter == 0
+ dividers_found +=1
+ end
+ counter+=1
+ end
+ if dividers_found == 2
+ return true
+ else
+ return false
+ end
+ end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(sequence_length)
+ @sequence_length = sequence_length
+ end
+
+ def each
+ numbers_found = 0
+ current_number = 2
+ while numbers_found < @sequence_length
+ if is_prime?(current_number)
+ numbers_found += 1
+ current_number
+ yield current_number
+ end
+ current_number += 1
+ end
+ end
+end
+
+class FibonacciSequence
+ include Enumerable
+
+ def initialize(sequence_length, first: nil, second: nil)
+ @sequence_length = sequence_length
+ if first and second
+ @first = first
+ @second = second
+ else
+ @first = 1
+ @second = 1
+ end
+ end
+
+ def each
+ current_position = 0
+ sequence = [@first, @second]
+ while current_position < @sequence_length
+ sequence[current_position+2] = sequence[current_position] + sequence[current_position+1]
+ current_position += 1
+ end
+ sequence.take(@sequence_length).each{|element| yield element}
+ end
+end
+
+module DrunkenMathematician
+ module_function
+
+ def meaningless(n)
+ alpha_group = RationalSequence.new(n)
+
+ first_group = alpha_group.find_all { |number|
+ is_prime?(number.denominator) or is_prime?(number.numerator)
+ }
+
+ second_group = alpha_group.find_all { |number|
+ not(is_prime?(number.denominator) or is_prime?(number.numerator))
+ }
+
+ first_group.empty? ? first_group[0] = Rational(1) : first_group
+ second_group.empty? ? second_group[0] = Rational(1) : second_group
+ first_group.reduce(:*) / second_group.reduce(:*)
+ end
+
+ def aimless(n)
+ sequence = PrimeSequence.new(n)
+ sum = Rational(0,1)
+ sequence.each_slice(2).to_a.each{ |element|
+ if element[1] == nil
+ sum = sum + Rational(element[0],1).to_r
+ else
+ sum = sum + Rational(element[0],element[1])
+ end
+ }
+ sum.to_r
+ end
+
+ def worthless(n)
+ if n == 0
+ return []
+ end
+ last_fibonacci = FibonacciSequence.new(n).to_a[-1]
+ found = false
+ current_sequence = 1
+ while not found
+ if RationalSequence.new(current_sequence).reduce(:+) > last_fibonacci
+ return RationalSequence.new(current_sequence-1).to_a
+ found = true
+ else
+ current_sequence += 1
+ end
+ end
+ end
+end