Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Command: perl -pe'y/-/_/;s/,/\n/g' <input | dc -f- -fdc-p12.dc
- # Send Input by pushing on - register (ie 1S- to send 1)
- 1S-
- # Load Intcode into c array:
- z # idx val_n val_n-1 ... val_0
- [
- 1-d 3Rr:c
- d0<L
- ] dsLx # 0 left on stack for ip
- # Get parameter address: modes ip -> addr modes%10 ip+1
- [s.d] sI # set immediate mode: junk ip modes -> ip ip modes
- [
- A~ # pmode modes%10 ip
- 3R1+ # ip++ pmode modes%10
- d;c # code[ip+1] ip+1 pmode modes%10
- 3R d2/l$* # (base|0) pmode code[ip+1] ip+1 modes%10
- 3R+ # code[ip+1]+(base|0) pmode ip+1 modes%10
- r1=I # addr=(ip+1 or code[ip+1]+(base|0)) ip+1 modes%10
- SArLA # addr modes%10 ip+1
- ] sA
- # get and deref addr for input parameter; modes ip -> parm modes%10 ip+1
- [ lAx;c ] sP
- # perform add/mul: fn modes ip -> ip+3
- [
- _3R lPx # parm1 modes%10 ip+1 fn
- _3R lPx # parm2 modes%100 ip+2 parm1 fn
- 4R5Rx # result=fn(parm1, parm2) modes%100 ip+2
- _3R lAx # addr modes%1000=0 ip+3 result
- + # clear modes
- 3R r:c # code[addr] = result; ip+3
- ] s0
- # Branching: test modes ip -> new-ip (ip+2 or parm2-1 if test)
- [ 1- _3R ] sJ # Jump: parm2 modes ip+2 -> junk junk parm2-1
- [
- _3R lPx # parm1 modes ip+1 test
- _3R lPx # parm2 modes ip+2 parm1 test
- 4R # parm1 parm2 modes ip+2 test
- 0 6Rx # jump if test(parm1); junk junk parm2-1 or junk junk ip+2
- +s.
- ] sB # jt/jnz: modes ip -> new-ip (ip+2 or parm2-1)
- # Conditionals: cond modes ip -> ip+3
- [1+] s+ # inc top
- [
- _3R lPx # parm1 modes%10 ip+1 cond
- _3R lPx # parm2 modes%100 ip+2 parm1 cond
- _3R lAx # addr modes%1000=0 ip+3 parm2 parm1 cond
- r4R5R # parm1 parm2 0 addr ip+3 cond
- 6Rx # inc 0 if cond(parm1, parm2); bool addr ip+3
- r:c # code[parm3] = bool; ip+3
- ] sC
- # add/mul: modes ip -> ip+3
- [ [+] l0x ] 1:O
- [ [*] l0x ] 2:O
- [ lAx L- r:c + ] 3:O # in: modes in -> ip+1
- [ lPx + [Out: ]n ps. ] 4:O # out: modes ip -> ip+1
- # Jump true/false: modes ip -> new-ip
- [ [!=J] lBx ] 5:O
- [ [ =J] lBx ] 6:O
- # Compare lt or eq: modes ip -> ip+3
- [ [<+] lCx ] 7:O
- [ [=+] lCx ] 8:O
- # Set relative base register: modes ip -> ip+1
- [ lPx l$++s$ ] 9:O # relative base ($) += parm + 0
- [q] 99:O
- # Execute Intcode:
- [
- d;c A0~ # load op code: op modes ip
- ;Ox
- 1+ lMx # ip++
- ] dsMx
Advertisement
Add Comment
Please, Sign In to add comment