Решение на Втора задача от Петя Петрова

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

Към профила на Петя Петрова

Резултати

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

Код

class NumberSet
include Enumerable
def initialize
@arr = []
end
def each
@arr.each do |number|
yield(number)
end
end
def << number
@arr << number unless @arr.include?(number)
end
def size
@arr.count
end
def empty?
@arr.empty?
end
def to_a
@arr.to_a
end
def [](filter)
@arr.select(yield)
end
end
class Filter
attr_accessor :filter
def initialize
@filter = filter
end
def &(other)
Filter.new(lambda { |task| @filter.call task and other.filter.call task })
end
def |(other)
Filter.new(lambda { |task| @filter.call task or other.filter.call task })
end
end

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

........FFFFFFFFFFFFFF.F

Failures:

  1) NumberSet can filter by complex type
     Failure/Error: can_filter [0.3+2i, 3.14, 11], using: TypeFilter.new(:complex),
     NameError:
       uninitialized constant TypeFilter
     # /tmp/d20141028-18133-1ushecp/spec.rb:43:in `block (2 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) NumberSet can filter by integer type
     Failure/Error: can_filter [Rational(5, 2), 8.0, 7, Rational(9, 1)], using: TypeFilter.new(:integer),
     NameError:
       uninitialized constant TypeFilter
     # /tmp/d20141028-18133-1ushecp/spec.rb:49:in `block (2 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) NumberSet can filter by real type
     Failure/Error: can_filter [Rational(5, 2), 8.3, 7], using: TypeFilter.new(:real),
     NameError:
       uninitialized constant TypeFilter
     # /tmp/d20141028-18133-1ushecp/spec.rb:55:in `block (2 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) NumberSet can filter by custom filter
     Failure/Error: filtered_numbers = numbers[using]
     LocalJumpError:
       no block given (yield)
     # /tmp/d20141028-18133-1ushecp/solution.rb:31:in `[]'
     # /tmp/d20141028-18133-1ushecp/spec.rb:179:in `can_filter'
     # /tmp/d20141028-18133-1ushecp/spec.rb:61:in `block (2 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) NumberSet can filter positive numbers
     Failure/Error: can_filter [Rational(-5, 2), 7.6, 0], using: SignFilter.new(:positive),
     NameError:
       uninitialized constant SignFilter
     # /tmp/d20141028-18133-1ushecp/spec.rb:67:in `block (2 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)>'

  6) NumberSet can filter non-positive numbers
     Failure/Error: can_filter [Rational(-5, 2), 7.6, 0], using: SignFilter.new(:non_positive),
     NameError:
       uninitialized constant SignFilter
     # /tmp/d20141028-18133-1ushecp/spec.rb:73:in `block (2 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)>'

  7) NumberSet can filter negative numbers
     Failure/Error: can_filter [Rational(-5, 2), 7.6, 0], using: SignFilter.new(:negative),
     NameError:
       uninitialized constant SignFilter
     # /tmp/d20141028-18133-1ushecp/spec.rb:79:in `block (2 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)>'

  8) NumberSet can filter non-negative numbers
     Failure/Error: can_filter [Rational(-5, 2), 7.6, 0], using: SignFilter.new(:non_negative),
     NameError:
       uninitialized constant SignFilter
     # /tmp/d20141028-18133-1ushecp/spec.rb:85:in `block (2 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)>'

  9) NumberSet can combine two filters with "and" rule
     Failure/Error: filter = SignFilter.new(:non_negative) & Filter.new { |number| number != 0 }
     NameError:
       uninitialized constant SignFilter
     # /tmp/d20141028-18133-1ushecp/spec.rb:91:in `block (2 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)>'

  10) NumberSet can combine two filters with "or" rule
     Failure/Error: filter = Filter.new { |number| number % 2 == 0 } | Filter.new { |number| number > 5 }
     ArgumentError:
       wrong number of arguments (1 for 0)
     # /tmp/d20141028-18133-1ushecp/solution.rb:38:in `initialize'
     # /tmp/d20141028-18133-1ushecp/solution.rb:47:in `new'
     # /tmp/d20141028-18133-1ushecp/solution.rb:47:in `|'
     # /tmp/d20141028-18133-1ushecp/spec.rb:98:in `block (2 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)>'

  11) NumberSet can combine multiple filters with "and" rule
     Failure/Error: non_negative  = SignFilter.new(:non_negative)
     NameError:
       uninitialized constant SignFilter
     # /tmp/d20141028-18133-1ushecp/spec.rb:105:in `block (2 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)>'

  12) NumberSet can combine multiple filters with "or" rule
     Failure/Error: negative      = SignFilter.new(:negative)
     NameError:
       uninitialized constant SignFilter
     # /tmp/d20141028-18133-1ushecp/spec.rb:116:in `block (2 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)>'

  13) NumberSet can combine multiple filters with "and" and "or" rules
     Failure/Error: negative      = SignFilter.new(:negative)
     NameError:
       uninitialized constant SignFilter
     # /tmp/d20141028-18133-1ushecp/spec.rb:126:in `block (2 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)>'

  14) NumberSet can combine multiple filters with "and", "or" and parenthesis
     Failure/Error: negative      = SignFilter.new(:negative)
     NameError:
       uninitialized constant SignFilter
     # /tmp/d20141028-18133-1ushecp/spec.rb:136:in `block (2 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)>'

  15) NumberSet returns enumerable of set's contents if no block is given to each
     Failure/Error: expect(numbers.each.to_a.size).to eq [1, 3, 5].size
     LocalJumpError:
       no block given (yield)
     # /tmp/d20141028-18133-1ushecp/solution.rb:10:in `block in each'
     # /tmp/d20141028-18133-1ushecp/solution.rb:9:in `each'
     # /tmp/d20141028-18133-1ushecp/solution.rb:9:in `each'
     # /tmp/d20141028-18133-1ushecp/spec.rb:164:in `block (2 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.03743 seconds
24 examples, 15 failures

Failed examples:

rspec /tmp/d20141028-18133-1ushecp/spec.rb:42 # NumberSet can filter by complex type
rspec /tmp/d20141028-18133-1ushecp/spec.rb:48 # NumberSet can filter by integer type
rspec /tmp/d20141028-18133-1ushecp/spec.rb:54 # NumberSet can filter by real type
rspec /tmp/d20141028-18133-1ushecp/spec.rb:60 # NumberSet can filter by custom filter
rspec /tmp/d20141028-18133-1ushecp/spec.rb:66 # NumberSet can filter positive numbers
rspec /tmp/d20141028-18133-1ushecp/spec.rb:72 # NumberSet can filter non-positive numbers
rspec /tmp/d20141028-18133-1ushecp/spec.rb:78 # NumberSet can filter negative numbers
rspec /tmp/d20141028-18133-1ushecp/spec.rb:84 # NumberSet can filter non-negative numbers
rspec /tmp/d20141028-18133-1ushecp/spec.rb:90 # NumberSet can combine two filters with "and" rule
rspec /tmp/d20141028-18133-1ushecp/spec.rb:97 # NumberSet can combine two filters with "or" rule
rspec /tmp/d20141028-18133-1ushecp/spec.rb:104 # NumberSet can combine multiple filters with "and" rule
rspec /tmp/d20141028-18133-1ushecp/spec.rb:114 # NumberSet can combine multiple filters with "or" rule
rspec /tmp/d20141028-18133-1ushecp/spec.rb:124 # NumberSet can combine multiple filters with "and" and "or" rules
rspec /tmp/d20141028-18133-1ushecp/spec.rb:134 # NumberSet can combine multiple filters with "and", "or" and parenthesis
rspec /tmp/d20141028-18133-1ushecp/spec.rb:159 # NumberSet returns enumerable of set's contents if no block is given to each

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

Петя обнови решението на 27.10.2014 10:57 (преди над 9 години)

+class NumberSet
+ include Enumerable
+
+ def initialize
+ @arr = []
+ end
+
+ def each
+ @arr.each do |number|
+ yield(number)
+ end
+ end
+
+ def << number
+ @arr << number unless @arr.include?(number)
+ end
+
+ def size
+ @arr.count
+ end
+
+ def empty?
+ @arr.empty?
+ end
+
+ def to_a
+ @arr.to_a
+ end
+
+ def [](filter)
+ @arr.select(yield)
+ end
+end
+
+class Filter
+ attr_accessor :filter
+
+ def initialize
+ @filter = filter
+ end
+
+ def &(other)
+ Filter.new(lambda { |task| @filter.call task and other.filter.call task })
+ end
+
+ def |(other)
+ Filter.new(lambda { |task| @filter.call task or other.filter.call task })
+ end
+end

Здрасти,

Ето някои насоки:

  • Измисли по-добро име от @arr, моля. Говорим си за множества от числа, а не за пирати. :)
  • Очакваме NumberSet#each да работи като Array#each, когато не му подаваме блок.
  • Имаш бъг в идентацията на NumberSet#size.
  • В NumberSet#[] трябва да филтрираш на базата на filter. Този yield не ти върши работа. Пробвай да използваш филтъра, който пазиш във Filter и който вече ползваш във Filter#&.
  • Във Filter#initialize си забравила да приемеш блока като параметър. :))

Давай, имаш още два класа! :))