commit 6c38775ae43dbf79b3047fd3ce1d4dd942e6f81f
parent 5159ab9c6bfe1873b8f2bdb44c71e5d80fd4bad4
Author: Natasha Kerensikova <natacha@instinctive.eu>
Date:   Sun, 25 Dec 2022 17:27:55 +0100
Add day 25 reference input and solution
Diffstat:
| A | day25.ps | | | 110 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
| A | day25.txt | | | 13 | +++++++++++++ | 
2 files changed, 123 insertions(+), 0 deletions(-)
diff --git a/day25.ps b/day25.ps
@@ -0,0 +1,110 @@
+%!PS
+%
+% Copyright (c) 2022, Natacha Porté
+%
+% Permission to use, copy, modify, and distribute this software for any
+% purpose with or without fee is hereby granted, provided that the above
+% copyright notice and this permission notice appear in all copies.
+%
+% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+%
+% Usage:
+% gs -q- -sDEVICE=png16m -o- day25.ps <day25.txt | display
+
+/datafile (%stdin) (r) file def
+/stderr (%stderr) (w) file def
+
+/char-to-digit <<
+  61 -2
+  45 -1
+  48  0
+  49  1
+  50  2
+>> def
+
+/digit-to-char (=-0123) def
+
+% (num) -> num
+/read-snafu {
+  0 exch {
+    % prev-acc digit-char
+    char-to-digit exch get
+    % prev-acc digit-vaue
+    exch 5 mul add
+    % acc
+  } forall
+  % result
+} bind def
+
+% num -> (num)
+/write-snafu {
+  [ exch 0 exch
+    {
+      % ... carry remainder
+      dup 0 eq { pop exit } if
+      % ... carry remainder
+      dup 5 idiv 3 1 roll
+      % ... next-remainder carry remainder
+      5 mod add
+      % ... next-remainder cur-abs-digit
+      0 exch
+      % ... next-remainder next-carry cur-abs-digit
+      {
+        dup 2 le { exit } if
+        exch 1 add exch 5 sub
+      } loop
+      % ... next-remainder next-carry cur-digit
+      3 1 roll exch
+      % ... cur-digit next-carry next-remainder
+    } loop
+    dup 0 eq { pop } if
+  ]
+  % reverse-digit-array
+  dup length string
+  % reverse-digit-array result
+  0 1 2 index length 1 sub {
+    % reverse-digit-array result index
+    2 index length 1 sub 1 index sub
+    % reverse-digit-array result index reverse-index
+    3 index exch get
+    % reverse-digit-array result index cur-digit
+    2 add digit-to-char exch get
+    % reverse-digit-array result index cur-digit-char
+    2 index 3 1 roll put
+    % reverse-digit-array result
+  } for
+  % reverse-digit-array result
+  exch pop
+} bind def
+
+/data [
+  {
+    datafile 200 string readline
+    not { pop exit } if
+    % line
+    read-snafu
+  } loop
+] def
+
+
+
+/Helvetica 20 selectfont
+
+
+(First Puzzle: )
+72 700 moveto show
+
+0 data { add } forall
+% sum
+write-snafu
+% (sum)
+show
+
+showpage
+quit
diff --git a/day25.txt b/day25.txt
@@ -0,0 +1,13 @@
+1=-0-2
+12111
+2=0=
+21
+2=01
+111
+20012
+112
+1=-1=
+1-12
+12
+1=
+122