aoc-2022

My solutions in postscript to Advent of Code 2022
Log | Files | Refs | README | LICENSE

commit 0b5352ef1fe40c1eaf287a17705fb04b67fac41e
parent b4c2347e441726b319f88afc95c25ddabb92fe04
Author: Natasha Kerensikova <natacha@instinctive.eu>
Date:   Wed, 14 Dec 2022 08:59:31 +0100

Add day 13 reference input and solutions

Diffstat:
Aday13.ps | 247+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aday13.txt | 23+++++++++++++++++++++++
2 files changed, 270 insertions(+), 0 deletions(-)

diff --git a/day13.ps b/day13.ps @@ -0,0 +1,247 @@ +%!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- day13.ps <day13.txt | display + +/datafile (%stdin) (r) file def +/stderr (%stderr) (w) file def + +% [ item_1 ... item_n ] item_0 -> [ item_0 item_1 ... item_n ] +/apush { + % array new_item + exch aload length 1 add array astore +} bind def + +% [ item_0 ... item_n-1 ] item_n -> [ item_0 item_1 ... item_n ] +/aappend { + exch aload length + % new-item item-0 item-1 ... item-n-1 n + dup dup 2 add exch 1 add roll + % item-0 item-1 ... item-n-1 n new-item + exch + % item-0 item-1 ... item-n-1 new-item n + 1 add array astore +} bind def + +% [ item_0 item_1 ... item_n ] -> [ item_1 ... item_n ] item_0 +/apop { + aload length 1 sub array astore exch +} bind def + +% (item) -> item +/parse-item { + { % (suffix) + dup length 0 eq { pop exit } if + % (suffix) + { %%% 1-iteration loop to use `exit` as a short circuit + ([) anchorsearch + { % (next-suffix) ([) + pop [ exch + % mark (next-suffix) + exit + } if + + (]) anchorsearch + { % (next-suffix) (]) + pop + % mark items (next-suffix) + counttomark 1 add + % mark items (next-suffix) item-count+2 + 1 roll + % (next-suffix) mark items + ] exch + % array (next-suffix) + exit + } if + + (,) anchorsearch + { % (next-suffix) (,) + pop exit + } if + + 0 { + % (suffix) digit-count + 2 copy get + % (suffix) digit-count cur-char + dup 48 ge exch 57 le and + % (suffix) digit-count cur-char-is-digit? + { 1 add } + { exit } + ifelse + } loop + % (suffix) digit-count + dup 0 eq { 2.125 pstack quit } if + % (suffix) digit-count + 2 copy 0 exch getinterval + % (suffix) digit-count (num) + cvi 3 1 roll + % num (suffix) digit-count + 1 index length 1 index sub getinterval + % num (next-suffix) + exit + } loop + } loop +} bind def + +% left right -> num +% -1 if left < right +% 0 if left = right +% 1 if left > right +/cmp-items { + % left right + 1 index type /integertype eq + { % int-left right + dup type /integertype eq + { % int-left int-right + 2 copy eq + { pop pop 0 } + { lt { -1 } { 1 } ifelse} + ifelse + % result + } + { % int-left list-right + exch 1 array astore exch + % list-left list-right + cmp-items + % result + } + ifelse + } + { % list-left right + dup type /integertype eq + { % list-left int-right + 1 array astore + % list-left list-right + cmp-items + % result + } + { 0 % list-left list-right index + { + 2 index length 1 index le + % list-left list-right index list-left-too-short? + 2 index length 2 index le + % list-left list-right index list-left-too-short? list-right-too-short? + 2 copy or + { 2 copy and + { pop pop pop pop pop 0 } + { 5 1 roll pop pop pop pop { 1 } { -1 } ifelse } + ifelse + % result + exit + } + { pop pop } + ifelse + % list-left list-right index + 2 index 1 index get + % list-left list-right index left-item + 2 index 2 index get + % list-left list-right index left-item right-item + cmp-items + % list-left list-right index item-cmp + dup 0 eq + { pop } + { 4 1 roll pop pop pop exit } + ifelse + % list-left list-right index + 1 add + % list-left list-right next-index + } loop + % result + } + ifelse + } + ifelse +} bind def + +/data [ + [ + { + datafile 200 string readline + not { pop exit } if + % line + dup length 0 eq + { pop ] [ } + { parse-item } + ifelse + } loop + ] +] def + + +/Helvetica 20 selectfont + + +(First Puzzle: ) +72 700 moveto show +0 0 data { + % sum prev-rank pair + exch 1 add exch + % sum rank pair + dup length 2 eq not + { 1.125 pstack quit } if + % sum rank pair + aload pop + % sum rank left right + cmp-items + % sum rank cmp + stderr (Pair ) writestring + stderr 2 index 15 string cvs writestring + stderr (: ) writestring + stderr 1 index 15 string cvs writestring + stderr 10 write + % sum rank cmp + -1 eq + { exch 1 index add exch } if + % sum rank +} forall +pop +% sum +15 string cvs show + + +(Second Puzzle: ) +72 664 moveto show + +1 [[2]] 2 [[6]] 0 data { + % rank-A item-A rank-B item-B prev-index pair + exch 1 add exch + % rank-A item-A rank-B item-B index pair + { + % rank-A item-A rank-B item-B index item + dup 5 index cmp-items -1 le + % rank-A item-A rank-B item-B index item item<item-A? + { 6 5 roll 1 add 6 1 roll } if + % rank-A item-A rank-B item-B index item + 2 index cmp-items -1 le + % rank-A item-A rank-B item-B index item<item-B? + { 3 2 roll 1 add 3 1 roll } if + % rank-A item-A rank-B item-B index + } forall + % rank-A item-A rank-B item-B index +} forall +% rank-A item-A rank-B item-B index +pop pop exch pop +% rank-A rank-B + +1 index 15 string cvs show +( * ) show +dup 15 string cvs show +( = ) show +mul 15 string cvs show + +showpage +quit diff --git a/day13.txt b/day13.txt @@ -0,0 +1,23 @@ +[1,1,3,1,1] +[1,1,5,1,1] + +[[1],[2,3,4]] +[[1],4] + +[9] +[[8,7,6]] + +[[4,4],4,4] +[[4,4],4,4,4] + +[7,7,7,7] +[7,7,7] + +[] +[3] + +[[[]]] +[[]] + +[1,[2,[3,[4,[5,6,7]]]],8,9] +[1,[2,[3,[4,[5,6,0]]]],8,9]