to_proc ALL THE THINGS! (първа част)

Краен срок
06.12.2013 12:00

Срокът за предаване на решения е отминал

Може би вече сте се убедили, че Symbol#to_proc е нещо полезно, което прави кода по-компактен и по-четим. В това предизвикателство ще искаме от вас да добавите две интресни имплементации на to_proc и към други Ruby класове.

В примерите по-долу ще приемем, че имаме дефиниран следния код:

class Student
  attr_accessor :name, :points, :rank

  def initialize(name, points, rank)
    @name   = name
    @points = points
    @rank   = rank
  end
end

ivan   = Student.new 'Иван', 10, :second
mariya = Student.new 'Мария', 12, :first
neycho = Student.new 'Нейчо', 9, :third

students = [ivan, mariya, neycho]

Array#to_proc

Дефинирайте метод Array#to_proc, който да ни позволява да правим следното:

students.map(&[:name, :rank]) # => [['Иван', :second], ['Мария', :first], ['Нейчо', :third]]

По-просто казано, нашата имплементация на Array#to_proc трябва да работи така:

[:points, :name].to_proc.call(ivan) # => [10, 'Иван']

Hash#to_proc

Дефинирайте метод Hash#to_proc, който да ни улеснява да задаваме стойности на полета на обекти по следния начин:

students.each &{points: 0, rank: :last}
students.map(&:points) # => [0, 0, 0]
students.map(&:rank)   # => [:last, :last, :last]

Или, отново, казано по-просто, Hash#to_proc трябва да работи така:

{name: 'Петкан', points: -100}.to_proc.call(ivan)
ivan.name   # => 'Петкан'
ivan.points # => -100

Решения

Димитър Димитров
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Димитър Димитров
class Array
def to_proc
proc do |object|
map { |method| object.send(method) }
end
end
end
class Hash
def to_proc
proc do |object|
each do |property, value|
object.send "#{property}=", value
end
end
end
end
....

Finished in 0.00525 seconds
4 examples, 0 failures
Росен Рачев
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Росен Рачев
class Array
def to_proc
Proc.new { |a| map { |m| a.send m } }
end
end
class Hash
def to_proc
Proc.new { |a| each_pair { |key, value| a.send((key.to_s + "=").to_sym, value) } }
end
end
....

Finished in 0.00517 seconds
4 examples, 0 failures
Георги Гърдев
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Георги Гърдев
class Array
def to_proc
-> (object) do
each_with_object([]) do |property_name, result|
result << object.send(property_name.to_sym)
end
end
end
end
class Hash
def to_proc
-> (object) do
each do |property_name, new_value|
setter = property_name.to_s.concat('=')
object.send(setter, new_value)
end
end
end
end
....

Finished in 0.00536 seconds
4 examples, 0 failures
Стефан Василев
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Стефан Василев
class Array
def to_proc
Proc.new { |element| map { |method| element.send method } }
end
end
class Hash
def to_proc
Proc.new { |element| map { |key, value| element.send key.to_s.concat("=").to_sym, value } }
end
end
....

Finished in 0.00526 seconds
4 examples, 0 failures
Мария Терзиева
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Мария Терзиева
class Array
def to_proc
->(object) { map { |element| object.public_send element } }
end
end
class Hash
def to_proc
->(object) { each { |key, value| object.public_send "#{key}=", value } }
end
end
....

Finished in 0.00519 seconds
4 examples, 0 failures
Кристиан Ташков
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Кристиан Ташков
class Array
def to_proc
Proc.new { |student| self.map { |method| student.send(method)} }
end
end
class Hash
def to_proc
Proc.new do |student|
self.each do |key, value|
student.send("#{key}=", value)
end
end
end
end
....

Finished in 0.00519 seconds
4 examples, 0 failures
Илиян Бобев
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Илиян Бобев
class Array
def to_proc
Proc.new { |instance| map { |method| instance.public_send(method) } }
end
end
class Hash
def to_proc
Proc.new do |instance|
each do |method, arguments|
instance.public_send("#{method}=", arguments)
end
end
end
end
....

Finished in 0.00539 seconds
4 examples, 0 failures
Валентин Ейткен
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Валентин Ейткен
class Array
def to_proc
proc { |object| self.map { |method| object.send method } }
end
end
class Hash
def to_proc
proc do |object|
each do |field, value|
object.instance_variable_set("@#{field}".to_sym, value)
end
end
end
end
....

Finished in 0.00512 seconds
4 examples, 0 failures
Николай Хубанов
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Николай Хубанов
class Array
def to_proc
lambda do |object|
map { |property| object.send property.to_sym }
end
end
end
class Hash
def to_proc
lambda do |object|
each { |property, value| object.send (property.to_s + "=").to_sym, value }
end
end
end
....

Finished in 0.00511 seconds
4 examples, 0 failures
Георги Ангелов
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Георги Ангелов
class Array
def to_proc
Proc.new do |*args, &block|
map { |operation| operation.to_proc.call *args, &block }
end
end
end
class Hash
def to_proc
Proc.new do |object|
each { |name, value| object.send "#{name}=", value }
end
end
end
....

Finished in 0.00509 seconds
4 examples, 0 failures
Веселин Генадиев
  • Некоректно
  • 2 успешни тест(а)
  • 2 неуспешни тест(а)
Веселин Генадиев
class Array
def to_proc
lambda do |object|
map {|symbol| object.instance_variable_get("@#{symbol.to_s}")}
end
end
end
class Hash
def to_proc
lambda do |object|
each{|key, value| object.instance_variable_set("@#{key.to_s}", value)}
end
end
end
FF..

Failures:

  1) Array#to_proc works for a single element
     Failure/Error: [:abs].to_proc.call(-42).should eq [42]
       
       expected: [42]
            got: [nil]
       
       (compared using ==)
     # /tmp/d20131206-25737-1emu88p/spec.rb:3: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) Array#to_proc extracts values from objects
     Failure/Error: [1, -2].map(&[:abs, :to_s]).should eq [[1, '1'], [2, '-2']]
       
       expected: [[1, "1"], [2, "-2"]]
            got: [[nil, nil], [nil, nil]]
       
       (compared using ==)
     # /tmp/d20131206-25737-1emu88p/spec.rb:7: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.00564 seconds
4 examples, 2 failures

Failed examples:

rspec /tmp/d20131206-25737-1emu88p/spec.rb:2 # Array#to_proc works for a single element
rspec /tmp/d20131206-25737-1emu88p/spec.rb:6 # Array#to_proc extracts values from objects
Наталия Пацовска
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Наталия Пацовска
class Hash
def to_proc
Proc.new { |object| each { |property, value| object.send("#{property}=", value) } }
end
end
class Array
def to_proc
Proc.new { |object| map { |property| object.send(property) } }
end
end
....

Finished in 0.00513 seconds
4 examples, 0 failures
Сияна Славова
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Сияна Славова
class Array
def to_proc
Proc.new do |current_student|
map { |property_name| current_student.public_send property_name }
end
end
end
class Hash
def to_proc
Proc.new do |current_student|
map { |property_name, property_value| current_student.public_send "#{property_name}=", property_value }
end
end
end
....

Finished in 0.00514 seconds
4 examples, 0 failures
Борислава Аладжова
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Борислава Аладжова
class Array
def to_proc
Proc.new do |obj, *args|
map { |method_name| obj.send method_name, *args }
end
end
end
class Hash
def to_proc
Proc.new do |obj, *args|
map { |method_name, arg| obj.send (method_name.to_s + '=').to_sym, arg }
end
end
end
....

Finished in 0.00529 seconds
4 examples, 0 failures
Никола Ненков
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Никола Ненков
class Array
def to_proc
Proc.new { |object| map { |property| object.public_send(property) } }
end
end
class Hash
def to_proc
Proc.new { |object| map { |property, value| object.public_send(property.to_s.concat('=').to_sym, value) } }
end
end
....

Finished in 0.00641 seconds
4 examples, 0 failures
Давид Петров
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Давид Петров
class Array
def to_proc
Proc.new { |obj,*args| self.map {|method| obj.send(method,*args)} }
end
end
class Hash
def to_proc
Proc.new { |obj| self.map {|method,value| obj.send((method.to_s+"=").to_sym,value)} }
end
end
....

Finished in 0.00523 seconds
4 examples, 0 failures
Иван Проданов
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Иван Проданов
class Array
def to_proc
-> object { map(&object.method(:send)) }
end
end
class Hash
def to_proc
-> object { map { |property, value| object.send("#{property}=", value) } }
end
end
....

Finished in 0.00547 seconds
4 examples, 0 failures
Александър Попов
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Александър Попов
class Array
def to_proc
proc do |obj1|
self.each_with_object([]) do |accessor, array|
array << obj1.send(accessor)
end
end
end
end
class Hash
def to_proc
proc do |obj1|
self.each do |key, value|
obj1.send((key.to_s + "=").to_sym, value)
end
end
end
end
....

Finished in 0.00504 seconds
4 examples, 0 failures
Иван Капукаранов
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Иван Капукаранов
class Array
def to_proc
Proc.new { |object| map { |item| item.to_sym.to_proc.call(object) } }
end
end
class Hash
def to_proc
Proc.new { |object| map { |key, value| object.public_send("#{key.to_sym}=".to_sym, value) } }
end
end
....

Finished in 0.0052 seconds
4 examples, 0 failures
Илия Ватахов
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Илия Ватахов
class Array
def to_proc
->(object) do
map { |getter| object.public_send getter }
end
end
end
class Hash
def to_proc
->(object) do
each { |setter, value| object.public_send "#{setter}=", value }
end
end
end
....

Finished in 0.00515 seconds
4 examples, 0 failures
Георги Кръстев
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Георги Кръстев
class Array
def to_proc
-> obj { map { |attr| obj.public_send(attr) } }
end
end
class Hash
def to_proc
-> obj { each { |attr, value| obj.public_send("#{attr}=", value) } }
end
end
....

Finished in 0.00518 seconds
4 examples, 0 failures
Антонио Николов
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Антонио Николов
class Array
def to_proc
proc { |obj| self.map { |x| obj.send(x) } }
end
end
class Hash
def to_proc
proc { |obj| self.each { |key, value| obj.method(key.to_s + "=").call(value) } }
end
end
....

Finished in 0.00517 seconds
4 examples, 0 failures
Цветан Иванов
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Цветан Иванов
class Hash
def to_proc
Proc.new do |current_object|
self.each do |key, value|
key = "#{key}="
current_object.send(key, value)
end
end
end
end
class Array
def to_proc
Proc.new do |current_object, *args|
collect do |method|
current_object.send(method, *args)
end
end
end
end
....

Finished in 0.00535 seconds
4 examples, 0 failures
Емануела Моллова
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Емануела Моллова
class Array
def to_proc
->(object) { map { |element| element.to_proc.call(object) } }
end
end
class Hash
def to_proc
->(object) do
each { |key, value| (key.to_s + "=").to_sym.to_proc.call(object, value) }
end
end
end
....

Finished in 0.00517 seconds
4 examples, 0 failures
Диан Николов
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Диан Николов
class Array
def to_proc
->(target) do
array = []
(0...length).each do |i|
array << target.send(self[i])
end
array
end
end
end
class Hash
def to_proc
->(target) do
each do |k,v|
f = k.to_s + '='
target.send(f, v)
end
end
end
end
....

Finished in 0.00509 seconds
4 examples, 0 failures
Димитър Бонев
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Димитър Бонев
Array.class_eval do
def to_proc
proc do |obj|
map { |method| obj.public_send(method) }
end
end
end
Hash.class_eval do
def to_proc
proc do |obj|
each { |method, arg| obj.public_send("#{method}=", arg) }
end
end
end
....

Finished in 0.00506 seconds
4 examples, 0 failures
Калоян Калудов
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Калоян Калудов
class Array
def to_proc
->(object) { map { |symbol| object.public_send(symbol) } }
end
end
class Hash
def to_proc
->(object) { each { |key, value| object.send("#{key}=", *value) } }
end
end
....

Finished in 0.00514 seconds
4 examples, 0 failures
Кристиян Азманов
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Кристиян Азманов
class Array
def to_proc
proc { |observed| self.map { |curr_argument| observed.send(curr_argument) } }
end
end
class Hash
def to_proc
proc { |observed| self.map { |curr_argument| set_property(observed, curr_argument[0], curr_argument[1])} }
end
def set_property(obj, prop_name, prop_value)
obj.send("#{prop_name}=",prop_value)
end
end
....

Finished in 0.00529 seconds
4 examples, 0 failures
Слав Керемидчиев
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Слав Керемидчиев
class Array
def to_proc
Proc.new { |obj| self.map { |symbol| obj.send(symbol) } }
end
end
class Hash
def to_proc
Proc.new do |obj|
self.map() { |element| obj.send(element.first.to_s + '=', element.last) }
end
end
end
....

Finished in 0.00564 seconds
4 examples, 0 failures
Георги Шопов
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Георги Шопов
class Array
def to_proc
Proc.new do |obj|
self.each_with_object([]) { |attribute, list| list << obj.public_send(attribute) }
end
end
end
class Hash
def to_proc
Proc.new do |obj|
self.each { |attribute, value| obj.public_send("#{attribute}=", value) }
end
end
end
....

Finished in 0.00512 seconds
4 examples, 0 failures
Ангел Венчев
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Ангел Венчев
class Array
def to_proc
proc do |obj|
map.with_object([]) do |record,result|
result << obj.send(record.to_sym)
end
end
end
end
class Hash
def to_proc
proc do |obj|
each { |attr, value| obj.instance_variable_set("@#{attr}", value) }
end
end
end
....

Finished in 0.00535 seconds
4 examples, 0 failures
Красимира Божанова
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Красимира Божанова
class Array
def to_proc
-> (object) { map { |attribute| object.public_send attribute } }
end
end
class Hash
def to_proc
-> (object) { each { |key, value| object.public_send "#{key}=", value } }
end
end
....

Finished in 0.00507 seconds
4 examples, 0 failures
Ангел Цанев
  • Коректно
  • 4 успешни тест(а)
  • 0 неуспешни тест(а)
Ангел Цанев
class Array
def to_proc
Proc.new { |object| self.map{ |symbol| object.send(symbol.to_sym) } }
end
end
class Hash
def to_proc
Proc.new { |object| self.map{ |key, value| object.send((key.to_s + '=').to_sym, value) } }
end
end
....

Finished in 0.00631 seconds
4 examples, 0 failures