Na een zorgvuldige analyse ben je ervan overtuigd dat er precies één instructie gewijzigd is.

Ergens in het programma staat er ofwel een jmp die een nop zou moeten zijn, of een nop die een jmp zou moeten zijn. (Er zijn geen acc-instructies gewijzigd bij het beschadigen van de opstartcode.)

The program is supposed to terminate by attempting to execute an instruction immediately after the last instruction in the file. By changing exactly one jmp or nop, you can repair the boot code and make it terminate correctly.

Het programma wordt verondersteld te eindigen door te proberen een instructie uit te voeren onmiddellijk na de laatste instructie in het bestand. Door juist één jmp in een nop te veranderen (of omgekeerd), kan je de opstartcode herstellen en deze correct laten beëindigen.

Stel dat we bijvoorbeeld opnieuw het volgende programma hebben:

nop +0
acc +1
jmp +4
acc +3
jmp -3
acc -99
acc +1
jmp -4
acc +6

Als je de eerste instructie wijzigt van nop +0 naar jmp +0, dan zou je met die ene instructie een oneindige lus creëren die de instructie nooit meer zou verlaten. Als je zowat elk van de andere jmp instructies wijzigt, dan zal het programma uiteindelijk toch een andere jmp instructie vinden voor altijd blijven lopen.

Als je echter de voorlaatste instructie wijzigt (van jmp -4 naar nop -4), dan eindigt het programma! De instructies worden in deze volgorde doorlopen:

nop +0  | 1
acc +1  | 2
jmp +4  | 3
acc +3  |
jmp -3  |
acc -99 |
acc +1  | 4
nop -4  | 5
acc +6  | 6

Na de laatste instructie (acc +6) wordt het programma beëindigd omdat het probeert de instructie uit te voeren onder de laatste instructie in het bestand. Met deze wijziging bevat de accumulator, nadat het programma beëindigd is, de waarde 8 (acc +1, acc +1, acc +6).

Opgave

Herstel het programma zodat het op een normale manier beëindigd wordt. Doe dit door precies één jmp (naar nop) of één nop (naar jmp) te veranderen. Wat is de waarde van de accumulator nadat het herstelde programma beëindigd is? Hiervoor ga je als volgt te werk: ,

Voorbeeld

In deze interactieve sessie gaan we ervan uit dat het tekstbestand code.txt1 zich in de huidige directory bevindt.

> fix("code.txt")
8