Решение на Трета задача от Николай Коцев

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

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

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 19 успешни тест(а)
  • 1 неуспешни тест(а)

Код

class FibonacciSequence
include Enumerable
def initialize(size, first: 1, second: 1)
return @sequence = [] if size == 0
return @sequence = [first] if size == 1
@sequence = [first, second]
(size - 2).times do
@sequence << @sequence.last(2).reduce(:+)
end
end
def size
@sequence.size
end
def each(&block)
@sequence.each(&block)
end
end
class PrimeSequence
include Enumerable
def initialize(size)
@sequence = []
counter = 2
# This is such a heresy
while @sequence.size < size
@sequence << counter if PrimeSequence.prime?(counter)
counter += 1
end
end
def size
@sequence.size
end
def each(&block)
@sequence.each(&block)
end
def self.prime?(number)
return false if number <= 1
(2...number).none? { |divider| number % divider == 0 }
end
def make_size_even
@sequence << 1 if @sequence.size.odd?
self
end
end
class RationalSequence
include Enumerable
def initialize(size)
if size == 0
@sequence = []
elsif size == 1
@sequence = [1.to_r]
else
@sequence = generate_sequence(size)
end
end
def size
@sequence.size
end
def each(&block)
@sequence.each(&block)
end
def generate_sequence(size)
sequence = [1.to_r]
(1..size).each do |row|
method_for_row = row.even? ? :reverse_each : :each
((1..row).to_a.zip (1..row).to_a.reverse).send(method_for_row) do |rational_array|
rational_number = Rational(rational_array.first, rational_array.last)
sequence << rational_number
end
end
sequence.uniq.first(size)
end
end
module DrunkenMathematician
module_function
def aimless(number)
return 0 if number == 0
prime_sequence = PrimeSequence.new(number).make_size_even.to_a
sequence = []
sequence << prime_sequence.shift(2) until prime_sequence.empty?
sequence.map { |sub_array| Rational(sub_array.first, sub_array.last) }.reduce(:+)
end
def meaningless(number)
return 1 if number == 0
rational_sequence_array = RationalSequence.new(number).to_a
first_group = rational_sequence_array.select do |number|
PrimeSequence.prime?(number.denominator) or PrimeSequence.prime?(number.numerator)
end
second_group = rational_sequence_array.select do |number|
not PrimeSequence.prime?(number.denominator) and not PrimeSequence.prime?(number.numerator)
end
(first_group.reduce(:*) or 1) / (second_group.reduce(:*) or 1)
end
def worthless(number)
return [] if number <= 0
result_combination = []
fibonacci_number = FibonacciSequence.new(number).to_a.last
(1..Float::INFINITY).lazy.each do |current_number|
# combination = combination_check(fibonacci_number, current_number)
# break if combination.empty?
# p combination
# result_combination = combination
combinations = RationalSequence.new(current_number).to_a.combination(current_number).to_a
selected_combination = combinations.select do |combination|
combination.reduce(:+) <= fibonacci_number
end.max_by(&:size)
break unless selected_combination
result_combination = selected_combination
end
result_combination
end
end

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

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

Failures:

  1) Fifth task DrunkenMathematician #worthless can calculate for 15
     Failure/Error: expect(DrunkenMathematician.worthless(15)).to eq %w(
     Timeout::Error:
       execution expired
     # /tmp/d20151111-27349-bbhulg/solution.rb:83:in `hash'
     # /tmp/d20151111-27349-bbhulg/solution.rb:83:in `uniq'
     # /tmp/d20151111-27349-bbhulg/solution.rb:83:in `generate_sequence'
     # /tmp/d20151111-27349-bbhulg/solution.rb:62:in `initialize'
     # /tmp/d20151111-27349-bbhulg/solution.rb:120:in `new'
     # /tmp/d20151111-27349-bbhulg/solution.rb:120:in `block in worthless'
     # /tmp/d20151111-27349-bbhulg/solution.rb:115:in `each'
     # /tmp/d20151111-27349-bbhulg/solution.rb:115:in `each'
     # /tmp/d20151111-27349-bbhulg/solution.rb:115:in `worthless'
     # /tmp/d20151111-27349-bbhulg/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, 1 failure

Failed examples:

rspec /tmp/d20151111-27349-bbhulg/spec.rb:111 # Fifth task DrunkenMathematician #worthless can calculate for 15

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

Николай обнови решението на 25.10.2015 14:08 (преди над 8 години)

+class FibonacciSequence
+ include Enumerable
+ def initialize(size, first: 1, second: 1)
+ return @sequence = [] if size == 0
+ return @sequence = [first] if size == 1
+ @sequence = [first, second]
+ (size - 2).times do
+ @sequence << @sequence.last(2).reduce(:+)
+ end
+ end
+
+ def size
+ @sequence.size
+ end
+
+ def each(&block)
+ @sequence.each(&block)
+ end
+end
+
+class PrimeSequence
+ include Enumerable
+
+ def initialize(size)
+ @sequence = []
+ counter = 2
+ # This is such a heresy
+ while @sequence.size < size
+ @sequence << counter if PrimeSequence.prime?(counter)
+ counter += 1
+ end
+ end
+
+ def size
+ @sequence.size
+ end
+
+ def each(&block)
+ @sequence.each(&block)
+ end
+
+ def self.prime?(number)
+ return false if number <= 1
+ (2...number).none? { |divider| number % divider == 0 }
+ end
+
+ def make_size_even
+ @sequence << 1 if @sequence.size.odd?
+ self
+ end
+end
+
+class RationalSequence
+ include Enumerable
+
+ def initialize(size)
+ if size == 0
+ @sequence = []
+ elsif size == 1
+ @sequence = [1.to_r]
+ else
+ @sequence = generate_sequence(size)
+ end
+ end
+
+ def size
+ @sequence.size
+ end
+
+ def each(&block)
+ @sequence.each(&block)
+ end
+
+ def generate_sequence(size)
+ sequence = [1.to_r]
+ (1..size).each do |row|
+ method_for_row = row.even? ? :reverse_each : :each
+ ((1..row).to_a.zip (1..row).to_a.reverse).send(method_for_row) do |rational_array|
+ rational_number = Rational(rational_array.first, rational_array.last)
+ sequence << rational_number
+ end
+ end
+ sequence.uniq.first(size)
+ end
+end
+
+module DrunkenMathematician
+
+ module_function
+
+ def aimless(number)
+ return 0 if number == 0
+ prime_sequence = PrimeSequence.new(number).make_size_even.to_a
+ sequence = []
+ sequence << prime_sequence.shift(2) until prime_sequence.empty?
+ sequence.map { |sub_array| Rational(sub_array.first, sub_array.last) }.reduce(:+)
+ end
+
+ def meaningless(number)
+ return 1 if number == 0
+ rational_sequence_array = RationalSequence.new(number).to_a
+ first_group = rational_sequence_array.select do |number|
+ PrimeSequence.prime?(number.denominator) or PrimeSequence.prime?(number.numerator)
+ end
+ second_group = rational_sequence_array.select do |number|
+ not PrimeSequence.prime?(number.denominator) and not PrimeSequence.prime?(number.numerator)
+ end
+ (first_group.reduce(:*) or 1) / (second_group.reduce(:*) or 1)
+ end
+
+ def worthless(number)
+ return [] if number <= 0
+ result_combination = []
+ fibonacci_number = FibonacciSequence.new(number).to_a.last
+ (1..Float::INFINITY).lazy.each do |current_number|
+ # combination = combination_check(fibonacci_number, current_number)
+ # break if combination.empty?
+ # p combination
+ # result_combination = combination
+ combinations = RationalSequence.new(current_number).to_a.combination(current_number).to_a
+ selected_combination = combinations.select do |combination|
+ combination.reduce(:+) <= fibonacci_number
+ end.max_by(&:size)
+ break unless selected_combination
+ result_combination = selected_combination
+ end
+ result_combination
+ end
+end