commit 0f945b6c776acc051e536eaa1c6f2155a37d4b21
parent 3f08cf5d856ff53a7e4c779d85cd082f1dabf3b9
Author: Natasha Kerensikova <natacha@instinctive.eu>
Date: Fri, 9 Dec 2022 19:51:43 +0100
Add day 8 reference input and solutions
Diffstat:
A | day08.ps | | | 228 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | day08.txt | | | 5 | +++++ |
2 files changed, 233 insertions(+), 0 deletions(-)
diff --git a/day08.ps b/day08.ps
@@ -0,0 +1,228 @@
+%!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- day08.ps <day4.txt | display
+
+% array new-item -> new-array
+/append {
+ 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
+
+% line-count col-count data-array dx dy x y -> is-visible?
+/is-visible {
+ % line-count col-count data-array dx dy x y
+ dup 6 index mul 2 index add
+ % line-count col-count data-array dx dy x y offset
+ 5 index exch get
+ % line-count col-count data-array dx dy x y ref-height
+ 5 1 roll
+ % line-count col-count data-array ref-height dx dy x y
+ {
+ 2 index add
+ exch
+ 3 index add
+ exch
+ % line-count col-count data-array ref-height dx dy updated-x updated-y
+ false
+ % line-count col-count data-array ref-height dx dy x y loop-terminated?
+ 2 index 0 lt or % x < 0
+ 1 index 0 lt or % y < 0
+ 2 index 8 index ge or % x >= col-count
+ 1 index 9 index ge or % y >= line-count
+ % line-count col-count data-array ref-height dx dy x y loop-terminated?
+ { pop pop pop pop pop pop pop pop true exit } if
+ % line-count col-count data-array ref-height dx dy x y
+ dup 7 index mul 2 index add
+ % line-count col-count data-array ref-height dx dy x y offset
+ 6 index exch get
+ % line-count col-count data-array ref-height dx dy x y cur-height
+ 5 index ge
+ % line-count col-count data-array ref-height dx dy x y is-hiding?
+ { pop pop pop pop pop pop pop pop false exit } if
+ } loop
+} bind def
+
+% line-count col-count data-array x y -> is-visible?
+/is-visible-4 {
+ false
+ % line-count col-count data-array x y false
+ 6 copy pop 0 -1 4 2 roll is-visible or
+ % line-count col-count data-array x y visible-from-top?
+ 6 copy pop 0 1 4 2 roll is-visible or
+ % line-count col-count data-array x y visible-from-top-or-bottom?
+ 6 copy pop -1 0 4 2 roll is-visible or
+ % line-count col-count data-array x y visible-from-top-or-bottom-or-left?
+ 6 copy pop 1 0 4 2 roll is-visible or
+ % line-count col-count data-array x y is-visible?
+ 6 1 roll
+ % is-visible? line-count col-count data-array x y
+ pop pop pop pop pop
+ % is-visible?
+} bind def
+
+% line-count col-count data-array dx dy x y -> visible-count
+/visible-count {
+ % line-count col-count data-array dx dy x y
+ dup 6 index mul 2 index add
+ % line-count col-count data-array dx dy x y offset
+ 5 index exch get
+ % line-count col-count data-array dx dy x y ref-height
+ 0 6 2 roll
+ % line-count col-count data-array ref-height counter dx dy x y
+ {
+ % line-count col-count data-array ref-height count dx dy prev-x prev-y
+ 2 index add
+ exch
+ 3 index add
+ exch
+ % line-count col-count data-array ref-height count dx dy x y
+ false
+ % line-count col-count data-array ref-height count dx dy x y loop-finished?
+ 2 index 0 lt or % x < 0
+ 1 index 0 lt or % y < 0
+ 2 index 9 index ge or % x >= col-count
+ 1 index 10 index ge or % y >= line-count
+ % line-count col-count data-array ref-height count dx dy x y loop-finished?
+ { pop pop pop pop
+ % line-count col-count data-array ref-height count
+ 5 1 roll
+ % count line-count col-count data-array ref-height
+ pop pop pop pop
+ % count
+ exit
+ } if
+ % line-count col-count data-array ref-height prev-count dx dy x y
+ 5 4 roll 1 add 5 1 roll
+ % line-count col-count data-array ref-height count dx dy x y
+ dup 8 index mul 2 index add
+ % line-count col-count data-array ref-height count dx dy x y offset
+ 7 index exch get
+ % line-count col-count data-array ref-height count dx dy x y cur-height
+ 6 index ge
+ % line-count col-count data-array ref-height count dx dy x y is-hiding?
+ { pop pop pop pop
+ % line-count col-count data-array ref-height count
+ 5 1 roll
+ % count line-count col-count data-array ref-height
+ pop pop pop pop
+ % count
+ exit
+ } if
+ } loop
+} bind def
+
+% line-count col-count data-array x y -> scenic-score
+/scenic-score {
+ 1
+ % line-count col-count data-array x y 1
+ 6 copy pop 0 -1 4 2 roll visible-count mul
+ % line-count col-count data-array x y top
+ 6 copy pop 0 1 4 2 roll visible-count mul
+ % line-count col-count data-array x y top*bottom
+ 6 copy pop -1 0 4 2 roll visible-count mul
+ % line-count col-count data-array x y top*bottom*left
+ 6 copy pop 1 0 4 2 roll visible-count mul
+ % line-count col-count data-array x y score
+ 6 1 roll
+ % score line-count col-count data-array x y
+ pop pop pop pop pop
+ % score
+} bind def
+
+
+/datafile (%stdin) (r) file def
+/stderr (%stderr) (w) file def
+
+0 0 array {
+ % line-count data-array
+ datafile 120 string readline
+ not { pop exit } if
+ % line-count data-array line
+ {
+ % line-count data-array char
+ 48 sub
+ append
+ } forall
+ % line-count updated-data-array
+ exch 1 add exch
+ % updated-line-count updated-data-array
+} loop
+
+% line-count data-array
+dup length 2 index idiv exch
+% line-count col-count data-array
+
+/Helvetica 20 selectfont
+
+(First Puzzle: )
+72 700 moveto show
+0
+% init-line-count col-count data-array 0
+0 1 5 index 1 sub {
+ % line-count col-count data-array cur-count y
+ 0 1 5 index 1 sub {
+ % line-count col-count data-array cur-count y x
+ 6 copy exch 3 2 roll pop
+ % [save] line-count col-count data-array x y
+ is-visible-4
+ % line-count col-count data-array cur-count y x is-visible?
+ { 3 2 roll 1 add 3 1 roll } if
+ % line-count col-count data-array updated-count y x
+ pop
+ } for
+ pop
+} for
+% line-count col-count data-array visible-count
+15 string cvs show
+
+(Second Puzzle: )
+72 664 moveto show
+0 4 1 roll
+% init-best-score line-count col-count data-array
+1 1 4 index 2 sub {
+ % best-score line-count col-count data-array y
+ 1 1 4 index 2 sub {
+ % best-score line-count col-count data-array y x
+ 5 copy exch
+ % [save] line-count col-count data-array x y
+ scenic-score
+%dup 15 string cvs stderr exch writestring
+%stderr 9 write
+ % best-score line-count col-count data-array y x cur-score
+ dup 7 index gt
+ % best-score line-count col-count data-array y x cur-score is-better?
+ { 7 6 roll pop 6 1 roll }
+ { pop }
+ ifelse
+ % updated-best-score line-count col-count data-array y x
+ pop
+ } for
+%stderr 10 write
+ pop
+} for
+% best-score line-count col-count data-array
+4 3 roll
+15 string cvs show
+
+showpage
+quit
diff --git a/day08.txt b/day08.txt
@@ -0,0 +1,5 @@
+30373
+25512
+65332
+33549
+35390