]> code.bitgloo.com Git - clyne/advent-of-code.git/commitdiff
add day2
authorClyne Sullivan <clyne@bitgloo.com>
Fri, 2 Dec 2022 10:24:28 +0000 (05:24 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Fri, 2 Dec 2022 10:24:28 +0000 (05:24 -0500)
day2/part1.forth [new file with mode: 0644]
day2/part2.forth [new file with mode: 0644]

diff --git a/day2/part1.forth b/day2/part1.forth
new file mode 100644 (file)
index 0000000..b23e418
--- /dev/null
@@ -0,0 +1,19 @@
+: next-rpc ( fd -- score-or-false-if-eof )
+    pad 4 rot read-line throw                   ( read next line from file    )
+    swap 3 = and if                             ( if read complete round      )
+        pad 2 + c@ dup 87 -                     ( score for our hand          )
+        swap pad c@ -                           ( difference between hands    )
+        dup 23 = if drop 3 + else               ( 3pts for tie e.g. 'X' - 'A' )
+            dup 21 = swap 24 = or if 6 + then   ( 6pts for win                )
+        then
+    else false then ;                           ( false if end-of-file        )
+
+: all-rpcs ( fd -- total-score )
+    0 begin                                     ( start with zero score       )
+        over next-rpc                           ( read next hand              )
+        dup if + true then                      ( add to score if not EOF     )
+    0= until nip ;
+
+s" input" r/o open-file throw all-rpcs . cr     ( play all rounds in input    )
+bye
+
diff --git a/day2/part2.forth b/day2/part2.forth
new file mode 100644 (file)
index 0000000..2dc6b13
--- /dev/null
@@ -0,0 +1,19 @@
+create outcomes 3 , 4 , 8 , 1 , 5 , 9 , 2 , 6 , 7 , ( AX-Z, BX-Z, CX-Z )
+
+: next-rpc ( fd -- outcome )
+    pad 4 rot read-line throw                   ( read next line from file     )
+    swap 3 = and if                             ( if read complete round       )
+        pad c@ 65 - 3 *                         ( calculate ABC outcomes index )
+        pad 2 + c@ 88 - +                       ( add XYZ offset               )
+        cells outcomes + @                      ( lookup score for the round   )
+    else false then ;                           ( false if end-of-file         )
+
+: all-rpcs ( fd -- total-score )
+    0 begin                                     ( start with zero score        )
+        over next-rpc                           ( read next hand               )
+        dup if + true then                      ( add to score if not EOF      )
+    0= until nip ;
+
+s" input" r/o open-file throw all-rpcs . cr     ( play all rounds in input     )
+bye
+