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
).
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:
,
fix
waaraan de padnaam (String
) moet doorgegeven worden van een tekstbestand met de opstartcode van een spelcomputer. De functie moet de waarde (int
) teruggeven die de accumulator heeft nadat het herstelde programma beëindigd is.Deze statische functies moet zich in de klasse Submission
bevinden.
In deze interactieve sessie gaan we ervan uit dat het tekstbestand code.txt
1 zich in de huidige directory bevindt.
> Submission.fix("code.txt")
8