Решение на Четвърта задача от Кристиян Азманов
Към профила на Кристиян Азманов
Резултати
- 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 (преди почти 11 години)
Дотук имаш доста повторения (лошо е, виж 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 }
Кристияне, и аз се включвам в тълпата, която те насърчава да не се отказваш на финалната права :) Да, трябва малко зор, но зорът се отплаща :)
Ако имаш нужда от още подсказки, питай, но не се отказвай :)
Оценявам помощта ви, но наистина зарязах задачата. Вече е доста късно да правя, каквито и да било опити. Очаквам решенията на колегите.
Е, днес ще пуснем пета задача, където ще имаш възможност да се реваншираш :)