Object#thread

Краен срок
24.10.2013 00:00

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

Понеже ви казахме, че Monkey patching-а е нещо, което трябва да се избягва по принцип, решихме отново да ви накараме да го приложите. :-)

Дефинирайте метод Object#thread, който приема списък от произволен брой операции, които имат вида на Proc, lambda, или Symbol, и ги прилага последователно отляво надясно, по следния начин:

Подава като аргумент на първата операция обекта, на който е извикан thread, резултатът от това прилагане се подава като аргумент на втората операция и така нататък, докато не се изчерпят всички операции. Ако операцията е подадена като Symbol, то резултатът не се подава като аргумент, а му се вика съответния метод (вижте примерите).

Пример:

-42.thread :abs, -> x { x ** 3 }, :succ, -> x { x - 2 } # Резултат: 74087

Горният пример е еквивалентен на израза:

((((-42.abs) ** 3).succ) - 2)

Пример:

"Marvin".thread :size, -> x { x ** 4 }, :to_s, -> s { s.split "" }, -> a { a[0] + a[-1] }, :to_i # Резултат: 16

Горният пример е еквивалентен на израза:

(((-> a { a[0] + a[1] }).(((("Marvin".size) ** 4).to_s).split "")).to_i)

За още примери разгледайте sample_spec-a.

P.S. Има вероятност да ви е полезен методът Object#send, който приема като аргумент символ и извиква метода на обекта, който има същото име като символа, например:

-42.send :abs # Извиква -42.abs и връща 42

Както винаги, ваш приятел е документацията

Решения

Росен Рачев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Росен Рачев
class Object
def thread(*args)
args.map(&:to_proc).reduce(self) { |argument, method| method.call argument }
end
end
.

Finished in 0.00397 seconds
1 example, 0 failures
Цветан Иванов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Цветан Иванов
class Object
def thread(* args)
current = self
args.each do |arg|
if arg.is_a? Symbol
current = current.send arg
else
current = arg.call current
end
end
current
end
end
.

Finished in 0.01661 seconds
1 example, 0 failures
Георги Ангелов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Георги Ангелов
class Object
def thread(*operations)
operations.reduce(self) do |accumulator, operation|
operation.to_proc.call(accumulator)
end
end
end
.

Finished in 0.02518 seconds
1 example, 0 failures
Александър Антов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Александър Антов
class Object
def thread(*processes_to_execute)
current_result = self
processes_to_execute.each do |process|
if process.class == Proc
current_result = process.call(current_result)
else process.class == Symbol
current_result = current_result.send(process.to_s)
end
end
return current_result
end
end
.

Finished in 0.09608 seconds
1 example, 0 failures
Георги Кръстев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Георги Кръстев
class Object
def thread(*forms)
forms.reduce(self) { |expr, form| form.to_proc.curry[expr] }
end
end
.

Finished in 0.01671 seconds
1 example, 0 failures
Георги Гърдев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Георги Гърдев
class Object
def thread(*operations)
operations.reduce(self) do |object, operation|
case operation
when Symbol then object.send operation
when Proc then operation.call(object)
end
end
end
end
.

Finished in 0.0269 seconds
1 example, 0 failures
Наталия Пацовска
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Наталия Пацовска
class Object
def thread(*operations)
operations.reduce(self) { |result, operation| operation.to_proc.call result }
end
end
.

Finished in 0.04049 seconds
1 example, 0 failures
Владимир Конушлиев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Владимир Конушлиев
class Object
def thread(*operations)
operations.reduce(self) do |result, operation|
result = if operation.kind_of?(Proc)
operation.call(result)
else
result.send(operation)
end
end
end
end
.

Finished in 0.01994 seconds
1 example, 0 failures
Емануела Моллова
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Емануела Моллова
class Object
def thread(*args)
args.reduce(self) { |reduced, arg| arg.to_proc.call reduced }
end
end
.

Finished in 0.05092 seconds
1 example, 0 failures
Мария Терзиева
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Мария Терзиева
class Object
def thread(*operations)
operations.reduce(self) do |input, operation|
operation.instance_of?(Symbol) ? input.send(operation) : operation.call(input)
end
end
end
.

Finished in 0.02791 seconds
1 example, 0 failures
Красимира Божанова
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Красимира Божанова
class Object
def thread(*actions)
actions.reduce(self) { |current, action| action.to_proc.call(current) }
end
end
.

Finished in 0.02137 seconds
1 example, 0 failures
Христо Владев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Христо Владев
class Object
def thread(*operations)
operations.reduce(self) do |argument, operation|
operation.to_proc.call argument
end
end
end
.

Finished in 0.00281 seconds
1 example, 0 failures
Веселин Генадиев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Веселин Генадиев
class Object
def thread(*operations)
thread_result = self
operations.each do |x|
if x.class == Symbol
thread_result = thread_result.send x
else
thread_result = x.call thread_result
end
end
thread_result
end
end
.

Finished in 0.02112 seconds
1 example, 0 failures
Мария Митева
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Мария Митева
class Object
def thread(*operations)
operations.reduce(self) do |current_result, next_operation|
if next_operation.is_a?(Symbol)
current_result.send next_operation
else
next_operation.call current_result
end
end
end
end
.

Finished in 0.0463 seconds
1 example, 0 failures
Георги Урумов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Георги Урумов
class Object
def thread(*args)
args.inject(self) { |result, n| n.to_proc.call(result) }
end
end
.

Finished in 0.03104 seconds
1 example, 0 failures
Методи Димитров
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Методи Димитров
class Object
def thread(*operations)
operations.map(&:to_proc).reduce(self) do |result, operation|
operation.call result
end
end
end
.

Finished in 0.02003 seconds
1 example, 0 failures
Илиян Бобев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Илиян Бобев
class Object
def thread(*args)
arg = args.shift
if arg.class == Symbol then
result = self.send arg
else
result = arg.(self)
end
if args.size > 0 then
result = result.thread(*args)
end
result
end
end
.

Finished in 0.01767 seconds
1 example, 0 failures
Станимир Килявков
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Станимир Килявков
class Object
def thread(*operations)
item=self
operations.each_index{|i| item=operations[i].to_proc.call(item)}
item
end
end
.

Finished in 0.02001 seconds
1 example, 0 failures
Сияна Славова
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Сияна Славова
class Object
def thread(*arguments)
arguments.reduce(self) do |result, current_operation|
current_operation = current_operation.to_proc if current_operation.is_a? Symbol
current_operation.call(result)
end
end
end
.

Finished in 0.00238 seconds
1 example, 0 failures
Иван Капукаранов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Иван Капукаранов
class Object
def thread(*methods)
argument = self
methods.each do |method|
if method.instance_of? Symbol
argument = argument.send method
else
argument = method.call argument
end
end
argument
end
end
.

Finished in 0.02118 seconds
1 example, 0 failures
Давид Петров
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Давид Петров
class Object
def thread(*args)
result = self
args.each do |x|
if x.is_a? Symbol
result = result.send(x)
elsif block_given?
result = yield result
else
result = x.call result
end
end
result
end
end
.

Finished in 0.02496 seconds
1 example, 0 failures
Иван Латунов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Иван Латунов
class Object
def thread(*args)
result = self
args.each { |x| result = x.class == Proc ? x.call(result) : result.send(x)}
result
end
#Due to the fact that neither lambda functions nor
#__send__ mutates their arguments, `self` will not mutate.
end
.

Finished in 0.00301 seconds
1 example, 0 failures
Венцислав Велков
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Венцислав Велков
class Object
def thread(*args)
tempobj = self
args.each do |i|
if i.is_a? Symbol
tempobj = tempobj.send i
else
tempobj = i.call tempobj
end
end
tempobj
end
end
.

Finished in 0.00298 seconds
1 example, 0 failures
Марио Даскалов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Марио Даскалов
class Object
def thread(*args)
args.reduce(self) do |result, operator|
operator.is_a?(Symbol) ? result.send(operator) : operator.call(result)
end
end
end
.

Finished in 0.00249 seconds
1 example, 0 failures
Георги Шопов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Георги Шопов
class Object
def thread(*operations)
operations.reduce(self) do |result, item|
item.class == Symbol ? result.send(item) : item.call(result)
end
end
end
.

Finished in 0.00288 seconds
1 example, 0 failures
Валентин Ейткен
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Валентин Ейткен
class Object
def thread(*args)
args.inject(self) do |memo, arg|
if arg.is_a? Symbol
memo.send arg
elsif arg.is_a? Proc
arg.call memo
else
raise ArgumentError, "Invalid operation"
end
end
end
end
.

Finished in 0.00244 seconds
1 example, 0 failures
Николай Колев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Николай Колев
class Object
def thread(*functions)
functions.reduce(self) { |accumulator, candidate| candidate.to_proc.call accumulator }
end
end
.

Finished in 0.02493 seconds
1 example, 0 failures
Илиян Танев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Илиян Танев
class Object
def thread(*operations)
object = self
operations.each do |op|
object = object.send op if op.is_a?(Symbol)
object = op.call(object) if op.is_a?(Proc)
end
object
end
end
.

Finished in 0.0024 seconds
1 example, 0 failures
Лилия Любенова
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Лилия Любенова
class Object
def thread(*operations)
current_result = result = self
operations.each do |operation|
operation.class.name == "Symbol" ? result = current_result.send(operation) : result = operation.call(current_result)
current_result = result;
end
result
end
end
.

Finished in 0.00257 seconds
1 example, 0 failures
Кристиян Кисимов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Кристиян Кисимов
class Object
def thread(*args)
result = self
args.each { |i| result = (i.is_a? Symbol) ? result.send(i) : i.call(result) }
result
end
end
.

Finished in 0.00273 seconds
1 example, 0 failures
Николай Хубанов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Николай Хубанов
class Object
def thread(*args)
args.reduce(self) { |res, action| (action.is_a? Symbol) ? res.send(action) : action.(res) }
end
end
.

Finished in 0.02293 seconds
1 example, 0 failures
Александър Попов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Александър Попов
class Object
def thread(*operations)
operations.reduce(self) { |result, operation| operation.to_proc.call(result) }
end
end
.

Finished in 0.01988 seconds
1 example, 0 failures
Петър Мазълов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Петър Мазълов
class Object
def thread(*actions)
actions.reduce(self) do |current, action|
if action.class == Symbol
current.send(action)
else
action.call(current)
end
end
end
end
.

Finished in 0.00283 seconds
1 example, 0 failures
Ясен Трифонов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Ясен Трифонов
#!/usr/local/bin/ruby -w
class Object
def thread(*items)
items.reduce(self) { |sum, item| (item.instance_of? Symbol) ? sum.send(item) : item.call(sum) }
end
end
.

Finished in 0.00239 seconds
1 example, 0 failures
Николай Генов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Николай Генов
class Object
def thread(*args)
args.reduce(self) { |sum,arg| arg.to_proc.call(sum) }
end
end
.

Finished in 0.04645 seconds
1 example, 0 failures
Иван Проданов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Иван Проданов
class Object
def thread (*args)
return self if args.empty?
next_argument = (args[0].respond_to? :call) ? args[0].call(self) : send(args[0])
next_argument.thread(*args[1..-1])
end
end
.

Finished in 0.00293 seconds
1 example, 0 failures
Слав Керемидчиев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Слав Керемидчиев
class Object
def thread(*args)
accumulate = self
args.each do |argument|
accumulate = argument.to_proc.yield(accumulate)
end
accumulate
end
end
.

Finished in 0.00246 seconds
1 example, 0 failures
Цани Проданов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Цани Проданов
class Object
def processOperation(value, operation)
if operation.kind_of? Symbol
value.send operation
else
operation.call value
end
end
def thread(*pipeline)
pipeline.reduce(self) { |intermediate_value, operation|
processOperation(intermediate_value,operation) }
end
end
.

Finished in 0.00288 seconds
1 example, 0 failures
Моника Ефтимова
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Моника Ефтимова
class Object
def thread(*operations)
operations.reduce(self) { |product, operation| (operation.is_a? Symbol) ? product.send(operation) : operation.call(product) }
end
end
.

Finished in 0.00236 seconds
1 example, 0 failures
Ангел Венчев
  • Некоректно
  • 0 успешни тест(а)
  • 1 неуспешни тест(а)
Ангел Венчев
class Object
def thread(*args)
args.reduce(self) do |result, arg|
(arg.respond_to?(:to_proc) ? arg : arg.to_proc).call(result)
end
end
end
F

Failures:

  1) Object.thread works with multiple operations
     Failure/Error: 42.thread(->(x) { x / 6 }, :succ, ->(x) { [1] * x }, :size).should eq 8
     NoMethodError:
       undefined method `call' for :succ:Symbol
     # /tmp/d20131106-4393-13wphle/solution.rb:4:in `block in thread'
     # /tmp/d20131106-4393-13wphle/solution.rb:3:in `each'
     # /tmp/d20131106-4393-13wphle/solution.rb:3:in `reduce'
     # /tmp/d20131106-4393-13wphle/solution.rb:3:in `thread'
     # /tmp/d20131106-4393-13wphle/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)>'

Finished in 0.00148 seconds
1 example, 1 failure

Failed examples:

rspec /tmp/d20131106-4393-13wphle/spec.rb:2 # Object.thread works with multiple operations
Николай Каращранов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Николай Каращранов
class Object
def thread(*operations)
result = self
operations.each do |x|
if x.is_a? Symbol
result = result.send x
else
result = x.call result
end
end
result
end
end
.

Finished in 0.0228 seconds
1 example, 0 failures
Диан Николов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Диан Николов
class Object
def thread(*args)
if not args.empty?
nextArg = args.shift
if nextArg.is_a? Symbol
self.send(nextArg).thread *args
else
nextArg.(self).thread *args
end
else
self
end
end
end
.

Finished in 0.06718 seconds
1 example, 0 failures
Иван Георгиев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Иван Георгиев
class Object
def thread(*args)
i=1
if(args[0].class == Symbol)
result = self.send args[0]
else
result = args[0].call self
end
while i < args.length do
if(args[i].class == Symbol)
result = result.send args[i]
else
result = args[i].call result
end
i=i+1
end
result
end
end
.

Finished in 0.06789 seconds
1 example, 0 failures
Никола Величков
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Никола Величков
class Object
def thread *args
return self if args.empty?
result = (args[0].class == Symbol) ? (self.send args[0]) : (args[0].call self)
result.thread *args[1..-1]
end
end
.

Finished in 0.05269 seconds
1 example, 0 failures
Илия Ватахов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Илия Ватахов
class Object
def thread(*operations)
operations.reduce(self) do |argument, operation|
operation.is_a?(Symbol) ? argument.send(operation) : operation.call(argument)
end
end
end
.

Finished in 0.04151 seconds
1 example, 0 failures
Георги Пурнаров
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Георги Пурнаров
class Object
def thread (*functions)
functions.reduce(self) do |result,function|
if function.class==(Symbol)
result.send function
else
function.call result
end
end
end
end
.

Finished in 0.01908 seconds
1 example, 0 failures
Михаил Господинов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Михаил Господинов
class Object
def thread (*args)
return self if args.empty?
head,*tail = args
head.to_proc.call(self).thread *tail
end
end
.

Finished in 0.02883 seconds
1 example, 0 failures
Калоян Калудов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Калоян Калудов
class Object
def thread(*operations)
return self if operations.empty?
current_operation = operations.shift
if current_operation.class == Symbol
send(current_operation).thread(*operations)
else
current_operation.call(self).thread(*operations)
end
end
end
.

Finished in 0.0168 seconds
1 example, 0 failures
Христо Хърсев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Христо Хърсев
class Object
def thread *args
acc = self
args.each { |arg| arg.instance_of?(Symbol) ? acc = acc.send(arg) : acc = arg.call(acc) }
acc
end
end
.

Finished in 0.01605 seconds
1 example, 0 failures
Деян Хаджиев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Деян Хаджиев
class Object
def thread *args
args.reduce(self) do |result, next_proc|
next_proc.class == Symbol ? result.send(next_proc) : result = next_proc.(result)
end
end
end
.

Finished in 0.0177 seconds
1 example, 0 failures
Любомир Георгиев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Любомир Георгиев
class Object
def thread (*threads)
threads.inject(self) { |toy, x| x.class != Symbol ? ( x.call toy ) : ( toy.send x ) }
end
end
.

Finished in 0.02273 seconds
1 example, 0 failures
Никола Ненков
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Никола Ненков
class Object
def thread(*operations)
operations.reduce(self) do |so_far, operation|
operation.is_a?(Symbol) ? so_far.send(operation) : operation.call(so_far)
end
end
end
.

Finished in 0.02273 seconds
1 example, 0 failures
Моника Димитрова
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Моника Димитрова
class Object
def thread(*operations)
operations.reduce(self) { |result, operation| operation.to_proc.call result }
end
end
.

Finished in 0.01989 seconds
1 example, 0 failures
Елена Орешарова
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Елена Орешарова
class Object
def thread (*block)
result = self
block.each do |operation|
result = operation.to_proc.call result
end
return result
end
end
.

Finished in 0.02184 seconds
1 example, 0 failures
Кристиан Ташков
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Кристиан Ташков
class Object
def thread(*functions)
functions.reduce(self) do |accumulate, func|
func.is_a?(Symbol) ? accumulate.send(func) : func.call(accumulate)
end
end
end
.

Finished in 0.02358 seconds
1 example, 0 failures
Петя Делчева
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Петя Делчева
class Object
def thread(*operators)
result=self
operators.each_index do |i|
result=operators[i].to_proc.call(result)
end
result
end
end
.

Finished in 0.02289 seconds
1 example, 0 failures
Антонио Николов
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Антонио Николов
class Object
def thread(*args)
current_value = self
args.each do |argument|
if (argument.class == Symbol)
current_value = current_value.send argument
else
current_value = argument.call current_value
end
end
current_value
end
end
.

Finished in 0.05507 seconds
1 example, 0 failures
Стефан Василев
  • Коректно
  • 1 успешни тест(а)
  • 0 неуспешни тест(а)
Стефан Василев
class Object
def thread(*arguments)
result = self
arguments.each { |item| result = if Symbol == item.class then result.send item else item.call result end }
result
end
end
.

Finished in 0.05485 seconds
1 example, 0 failures
Александър Тахчиев
  • Некоректно
  • 0 успешни тест(а)
  • 1 неуспешни тест(а)
Александър Тахчиев
def thread (*args)
args.reduce(self) do |answer, func|
if func.class == Proc
func.call(answer)
else
answer.send func
end
end
end
F

Failures:

  1) Object.thread works with multiple operations
     Failure/Error: 42.thread(->(x) { x / 6 }, :succ, ->(x) { [1] * x }, :size).should eq 8
     NoMethodError:
       private method `thread' called for 42:Fixnum
     # /tmp/d20131106-4393-1s7ixyt/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)>'

Finished in 0.01939 seconds
1 example, 1 failure

Failed examples:

rspec /tmp/d20131106-4393-1s7ixyt/spec.rb:2 # Object.thread works with multiple operations