Решение на Четвърта задача от <анонимен> <анонимен>
Към профила на <анонимен> <анонимен>
Резултати
- 0 точки от тестове
- 0 бонус точки
- 0 точки общо
- 0 успешни тест(а)
- 8 неуспешни тест(а)
Код
Лог от изпълнението
FFFFFFFF
Failures:
1) Asm.asm works with empty programs
Failure/Error: Asm.asm {}.should eq [0, 0, 0, 0]
expected: [0, 0, 0, 0]
got: nil
(compared using ==)
# /tmp/d20140115-8451-1j1ayzr/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) Asm.asm implements MOV
Failure/Error: mov ax, 3
NameError:
undefined local variable or method `ax' for #<Asm::Evaluator:0xba199b40>
# /tmp/d20140115-8451-1j1ayzr/spec.rb:8:in `block (3 levels) in <top (required)>'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `instance_eval'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `asm'
# /tmp/d20140115-8451-1j1ayzr/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)>'
3) Asm.asm implements INC
Failure/Error: inc ax
NameError:
undefined local variable or method `ax' for #<Asm::Evaluator:0xba199924>
# /tmp/d20140115-8451-1j1ayzr/spec.rb:16:in `block (3 levels) in <top (required)>'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `instance_eval'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `asm'
# /tmp/d20140115-8451-1j1ayzr/spec.rb:15: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) Asm.asm implements DEC
Failure/Error: mov ax, 3
NameError:
undefined local variable or method `ax' for #<Asm::Evaluator:0xba196a6c>
# /tmp/d20140115-8451-1j1ayzr/spec.rb:24:in `block (3 levels) in <top (required)>'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `instance_eval'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `asm'
# /tmp/d20140115-8451-1j1ayzr/spec.rb:23: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) Asm.asm implements CMP
Failure/Error: mov ax, 2
NameError:
undefined local variable or method `ax' for #<Asm::Evaluator:0xba195040>
# /tmp/d20140115-8451-1j1ayzr/spec.rb:35:in `block (3 levels) in <top (required)>'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `instance_eval'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `asm'
# /tmp/d20140115-8451-1j1ayzr/spec.rb:34: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) Asm.asm implements JMP
Failure/Error: mov cx, 1
NameError:
undefined local variable or method `cx' for #<Asm::Evaluator:0xba192ed0>
# /tmp/d20140115-8451-1j1ayzr/spec.rb:69:in `block (3 levels) in <top (required)>'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `instance_eval'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `asm'
# /tmp/d20140115-8451-1j1ayzr/spec.rb:68: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) Asm.asm implements LABEL
Failure/Error: mov ax, 1
NameError:
undefined local variable or method `ax' for #<Asm::Evaluator:0xba190b44>
# /tmp/d20140115-8451-1j1ayzr/spec.rb:79:in `block (3 levels) in <top (required)>'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `instance_eval'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `asm'
# /tmp/d20140115-8451-1j1ayzr/spec.rb:78: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) Asm.asm can be used to find GCD of two numbers
Failure/Error: mov ax, 40
NameError:
undefined local variable or method `ax' for #<Asm::Evaluator:0xba18b860>
# /tmp/d20140115-8451-1j1ayzr/spec.rb:90:in `block (3 levels) in <top (required)>'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `instance_eval'
# /tmp/d20140115-8451-1j1ayzr/solution.rb:123:in `asm'
# /tmp/d20140115-8451-1j1ayzr/spec.rb:89: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.00728 seconds
8 examples, 8 failures
Failed examples:
rspec /tmp/d20140115-8451-1j1ayzr/spec.rb:2 # Asm.asm works with empty programs
rspec /tmp/d20140115-8451-1j1ayzr/spec.rb:6 # Asm.asm implements MOV
rspec /tmp/d20140115-8451-1j1ayzr/spec.rb:14 # Asm.asm implements INC
rspec /tmp/d20140115-8451-1j1ayzr/spec.rb:22 # Asm.asm implements DEC
rspec /tmp/d20140115-8451-1j1ayzr/spec.rb:33 # Asm.asm implements CMP
rspec /tmp/d20140115-8451-1j1ayzr/spec.rb:67 # Asm.asm implements JMP
rspec /tmp/d20140115-8451-1j1ayzr/spec.rb:77 # Asm.asm implements LABEL
rspec /tmp/d20140115-8451-1j1ayzr/spec.rb:88 # Asm.asm can be used to find GCD of two numbers
История (2 версии и 8 коментара)
<анонимен> обнови решението на 12.01.2014 15:45 (преди почти 12 години)
Дотук имаш доста повторения (лошо е, виж DRY принципа). Какво ще стане, ако утре scope-а на задачата се промени и някой каже „Трябват ни още 4 регистъра - ex, fx, gx и hx“? Опитай се да абстрахираш операциите върху регистър и не hardcode-вай имената на регистрите при имплементацията на операциите.
Да, осъзнавам го, но просто нямам достатъчно знания, които да ми помогнат да избегна това. В момента дори съм се отказал да решавам задачата понеже стгнах до момента с "label" командата, при която няма как да хардкодна идващите аргументи. Вероятно и подхпдът ми като цяло е грешен. Просто следвах принципа на решаване на предизвикателството " Шарлатан", но явно тук няма да ми се получат нещата.
Hint: Разгледай пак какво прави method_missing и виж дали би ти свършил работа за нещо. :)
Опитах да направя 'label' с method_missing, но когато имам 'label cycle' тук и двете се възприемат като методи и реално с правят 2 извиквания на method_missing. Като цяло смятам, че подходът ми е грешен, затова ще я зарежа тази задача и ще видя решенията на колегите после. Иначе, мерси за Hint-a!
Не се отказвай! Ето ти още един малък hint:
Изпълни следния код:
class TestClass
def method_missing(name, *args)
puts "#{name}: #{name.class}"
end
end
TestClass.new.instance_eval { label some_label }
Кристияне, и аз се включвам в тълпата, която те насърчава да не се отказваш на финалната права :) Да, трябва малко зор, но зорът се отплаща :)
Ако имаш нужда от още подсказки, питай, но не се отказвай :)
Оценявам помощта ви, но наистина зарязах задачата. Вече е доста късно да правя, каквито и да било опити. Очаквам решенията на колегите.
Е, днес ще пуснем пета задача, където ще имаш възможност да се реваншираш :)
