musifter

AoC 2019, day 9 (dc)

May 9th, 2026
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 2.48 KB | Source Code | 0 0
  1. # Command: perl -pe'y/-/_/;s/,/\n/g' <input | dc -f- -fdc-p12.dc
  2.  
  3. # Send Input by pushing on - register (ie 1S- to send 1)
  4. 1S-
  5.  
  6. # Load Intcode into c array:
  7. z               # idx val_n val_n-1 ... val_0
  8. [
  9.     1-d 3Rr:c
  10.     d0<L
  11. ] dsLx          # 0 left on stack for ip
  12.  
  13. # Get parameter address: modes ip -> addr modes%10 ip+1
  14. [s.d] sI        # set immediate mode: junk ip modes -> ip ip modes
  15. [
  16.     A~          # pmode modes%10 ip
  17.     3R1+        # ip++ pmode modes%10
  18.     d;c         # code[ip+1] ip+1 pmode modes%10
  19.     3R d2/l$*   # (base|0) pmode code[ip+1] ip+1 modes%10
  20.     3R+         # code[ip+1]+(base|0) pmode ip+1 modes%10
  21.     r1=I        # addr=(ip+1 or code[ip+1]+(base|0)) ip+1 modes%10
  22.     SArLA       # addr modes%10 ip+1
  23. ] sA
  24.  
  25. # get and deref addr for input parameter; modes ip -> parm modes%10 ip+1
  26. [ lAx;c ] sP
  27.  
  28. # perform add/mul: fn modes ip -> ip+3
  29. [
  30.     _3R lPx     # parm1 modes%10  ip+1 fn
  31.     _3R lPx     # parm2 modes%100 ip+2 parm1 fn
  32.     4R5Rx       # result=fn(parm1, parm2) modes%100 ip+2
  33.     _3R lAx     # addr modes%1000=0 ip+3 result
  34.     +           # clear modes
  35.     3R r:c      # code[addr] = result; ip+3
  36. ] s0
  37.  
  38. # Branching: test modes ip -> new-ip (ip+2 or parm2-1 if test)
  39. [ 1- _3R ] sJ   # Jump: parm2 modes ip+2 -> junk junk parm2-1
  40. [
  41.     _3R lPx     # parm1 modes ip+1 test
  42.     _3R lPx     # parm2 modes ip+2 parm1 test
  43.     4R          # parm1 parm2 modes ip+2  test
  44.     0 6Rx       # jump if test(parm1); junk junk parm2-1 or junk junk ip+2
  45.     +s.
  46. ] sB            # jt/jnz: modes ip -> new-ip (ip+2 or parm2-1)
  47.  
  48. # Conditionals: cond modes ip -> ip+3
  49. [1+] s+         # inc top
  50. [
  51.     _3R lPx     # parm1 modes%10 ip+1 cond
  52.     _3R lPx     # parm2 modes%100 ip+2 parm1 cond
  53.     _3R lAx     # addr modes%1000=0 ip+3 parm2 parm1 cond
  54.  
  55.     r4R5R       # parm1 parm2 0 addr ip+3 cond
  56.     6Rx         # inc 0 if cond(parm1, parm2); bool addr ip+3
  57.     r:c         # code[parm3] = bool; ip+3
  58. ] sC
  59.  
  60. # add/mul: modes ip -> ip+3
  61. [ [+] l0x ] 1:O
  62. [ [*] l0x ] 2:O
  63.  
  64. [ lAx L- r:c +       ] 3:O  # in: modes in -> ip+1
  65. [ lPx + [Out: ]n ps. ] 4:O  # out: modes ip -> ip+1
  66.  
  67. # Jump true/false: modes ip -> new-ip
  68. [ [!=J] lBx ] 5:O
  69. [ [ =J] lBx ] 6:O
  70.  
  71. # Compare lt or eq: modes ip -> ip+3
  72. [ [<+] lCx ] 7:O
  73. [ [=+] lCx ] 8:O
  74.  
  75. # Set relative base register: modes ip -> ip+1
  76. [ lPx l$++s$ ] 9:O  # relative base ($) += parm + 0
  77.  
  78. [q] 99:O
  79.  
  80. # Execute Intcode:
  81. [
  82.     d;c A0~     # load op code: op modes ip
  83.     ;Ox
  84.     1+ lMx      # ip++
  85. ] dsMx
Advertisement
Add Comment
Please, Sign In to add comment