Compare commits
No commits in common. "539cf753d04b5f07fedc854b860eb7581c97fd65" and "f638ffbff79c3d6fe50838a667392879a39e14cd" have entirely different histories.
539cf753d0
...
f638ffbff7
|
@ -44,12 +44,33 @@ proc place {boxp lens} {
|
||||||
set h [hash $label]
|
set h [hash $label]
|
||||||
set i 0
|
set i 0
|
||||||
set found 0
|
set found 0
|
||||||
dict set box($h) $label $num
|
if {![info exists box($h)]} { set box($h) {} }
|
||||||
|
foreach {l n} $box($h) {
|
||||||
|
if {$l eq $label} {
|
||||||
|
lset box($h) $i+1 $num
|
||||||
|
set found 1
|
||||||
|
break
|
||||||
|
}
|
||||||
|
incr i 2
|
||||||
|
}
|
||||||
|
if {!$found} {
|
||||||
|
lappend box($h) $label $num
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
set label [trim $lens "-"]
|
set label [trim $lens "-"]
|
||||||
set h [hash $label]
|
set h [hash $label]
|
||||||
#puts "$lens $label $h"
|
#puts "$lens $label $h"
|
||||||
dict unset box($h) $label
|
if {[info exists box($h)]} {
|
||||||
|
set i 0
|
||||||
|
foreach {l n} $box($h) {
|
||||||
|
if {$l eq $label} {
|
||||||
|
#puts "removing $i from $h"
|
||||||
|
set box($h) [lreplace $box($h) $i $i+1]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
incr i 2
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +83,7 @@ proc solve input {
|
||||||
set t 0
|
set t 0
|
||||||
foreach {h elems} [array get box] {
|
foreach {h elems} [array get box] {
|
||||||
set slot 0
|
set slot 0
|
||||||
dict for {l n} $elems {
|
foreach {l n} $elems {
|
||||||
incr slot
|
incr slot
|
||||||
incr t [expr {($h+1) * $slot * $n}]
|
incr t [expr {($h+1) * $slot * $n}]
|
||||||
}
|
}
|
||||||
|
|
110
day16/input
110
day16/input
|
@ -1,110 +0,0 @@
|
||||||
\.\............/........|............/.-....................|............|.......-..............//....../../..
|
|
||||||
......\.-/..|...............-...-\......../.............-.../.............../........-................../../..
|
|
||||||
.........\..\......................................................../\.......\.............................-.
|
|
||||||
....|.........-..................|..../....-......................................|.../...............|.../...
|
|
||||||
.....|...|..-....|................/............./......./............../|.......|.....|.................../...
|
|
||||||
.........-............../.|.-...\..........................|..................//............-\......|.........
|
|
||||||
.........|...................||.........-.|/.......---...-...........\........\.-...\..../......|.............
|
|
||||||
.......|-................................................................./........../..../...................
|
|
||||||
......-......|......././...............................\.....\.........|...........|..\-............|\........
|
|
||||||
|...\.............................-...\\-.................|................................-.........|........
|
|
||||||
...\....|.|........................-.........................\..|............................-....|...........
|
|
||||||
\.........|..|./....................../..........-......|...-....................\....-../...\.-.....|/.......
|
|
||||||
......\./................|...................-....../..................................|.......-....-.........
|
|
||||||
......-.........................................|....\..................../-./-.......|........./.............
|
|
||||||
................|...|...\....\....-....//........./...../.....-..............|\.|..\.........\......./\....\.\
|
|
||||||
.\...|.....|......./....-...........|.............-..\...-..-....................|.../.....-...........--.....
|
|
||||||
......................................-................../..............\.\\........../.../................\..
|
|
||||||
.-..........|..|......................|....|.-|.....................-..../............|......./..../..\/.-.\..
|
|
||||||
..\..\.............../-......-................-......................................\....../......|..........
|
|
||||||
.........\.....\.......................................-../........./-....-.................\....../..../.....
|
|
||||||
......-..\..-.............|...................|....../.......\../........../.....-............................
|
|
||||||
.............|../.\...\....|...............|.........../..|-....../........../..../|.|.\........|........\..|.
|
|
||||||
..\............|...../...................\......................./...-.......-..........................-.....
|
|
||||||
....|......................|......../.|.\.../......|...|..-.....................|................../..\.......
|
|
||||||
.....................................................-................/\..-....|..........................-.\.
|
|
||||||
................../...\..........\...........\............................................./.../.........|.|..
|
|
||||||
.....-......................................./....-........|.-........................|.........\.....\.......
|
|
||||||
...............\/\..........|.|................................|.\......\......\............|...-.............
|
|
||||||
..................................\.......-.........|-........../...........\\..\.|../......|........\..|.....
|
|
||||||
..............-...........\.....\\./......................./...-...........-..........................././....
|
|
||||||
...-..............-..........................\..........|...........-/........../.../...|.....................
|
|
||||||
...\..............-......./-...........|............./.......-./........-..-....|......./\.-.......\./........
|
|
||||||
.........|......././..\.-......./............-....-..................|....-......../........-.........\.......
|
|
||||||
....|.........................../....................-..................-...\|............................|...
|
|
||||||
.-........-...........|..............................|.........................................\......-......-
|
|
||||||
............./......../..-....\...............................././.......|................................|...
|
|
||||||
.|\../......-./........./...............-./..............\../..............|....|........./...................
|
|
||||||
..................................................|............................-..............................
|
|
||||||
.............-...................\.......|........|.............../......-....|......../.../.-...\|...........
|
|
||||||
.................../..............-|........................|.............\..\.........................././...
|
|
||||||
...../.........../..-.......|........../.......|........................./......|......./..........|..........
|
|
||||||
../...-........../...........................-.|..\../..................\.....-...........|...................
|
|
||||||
.........\.......-.......-.\.|......|.......||......|.\....-...-.................-..........-..\..............
|
|
||||||
................................\./.......\/............-................./.....\......../....................
|
|
||||||
/...........-......|..|....../.....\.........|.....................................\...................|....-.
|
|
||||||
...........\.............../.......\......................................................................\..-
|
|
||||||
....../...................-..................|-\......................-..................\....................
|
|
||||||
/............./...........|.....|............/.................................-....................-......\|.
|
|
||||||
...............\..|..............|............\../.../..........................\\................|......./...
|
|
||||||
....--/............|......|......-........-...../........./.........../-..\..|........-.......................
|
|
||||||
|.-....-.........................|../................\................../......\..../.\..|...../.../|.........
|
|
||||||
....................................../.........\........-....................../.-..-.\.....././.../.....\..\
|
|
||||||
......\...../............./................-...........\.................../.....-../......-..................
|
|
||||||
....../............../...........|......|..................................|...................|..............
|
|
||||||
......-../.../.|.........././..........\.......\........./......|..............\.................-.........../
|
|
||||||
...../...|........//...../.................\................../.\.............-............/.........../......
|
|
||||||
..............-.....|................\................/.........|.....\.......\....................\.....\....
|
|
||||||
..........|..........-.../..................\.-.......................................\..-.........|..........
|
|
||||||
....|..................-.....|..................|...........-......./.....-......../...|........\....\-.|.....
|
|
||||||
.......................-......./......................./.-.-.........|.....|.................|................
|
|
||||||
...|................/......-.....|....-..-.........-|....|..................../.../....-......\.......-......\
|
|
||||||
............-.............................-...................../..............|.|.......-....................
|
|
||||||
-....-..............|................./......../.\............./../............../..-...-...........|.........
|
|
||||||
.|............|..........-................./................|.....................|./....\......./.....\......
|
|
||||||
..........|\.|...................-.............\......|..-..\.......\..........\........|......-.../........\.
|
|
||||||
\.......\....................\..............|................................|..............-.../.............
|
|
||||||
......../-....................|...............-........................\................\..............-......
|
|
||||||
...|..-.............//.-.............../........-........../..|.............\|../....................-........
|
|
||||||
..../.\.-.-|.....\.-|..../.....\..|.........../........................-.....................-..........|.....
|
|
||||||
...../-..........\.........-....................\.............................\............|-..\..........|...
|
|
||||||
...-...../....................../-......\...|.....-........................../.|.........|.......\..\.....\../
|
|
||||||
...................\...../......................./...-.....\.-.........-...../.|...................|......./..
|
|
||||||
../.....|..|..\.........|.../.................../..-............\../........\.....\.....................\.....
|
|
||||||
.........................../...\.|........\...||..........\......\.-....|.........\-..\.......................
|
|
||||||
../.........|............................/../-||..............|-........\............\....\.\................|
|
|
||||||
../....|....................|.....|-.......|.................../...\.-.\.............-.................-......
|
|
||||||
....|..............................................................-|.........................................
|
|
||||||
..................\-.\/.........|../|....../|..\...-...\.........|/............./...\...\.....................
|
|
||||||
.\.........-../....|-......................./................/\..\........................................./..
|
|
||||||
./......................-...............|...............|................-.......................\............
|
|
||||||
................\..........././............................-....\/..........-.../../....|.........-....|...../
|
|
||||||
.-..-..|\..\/........\./....|.......................\.........../.....|......./-.-..../..../..................
|
|
||||||
\.....|........................../.|...../.-...............|.../\...|.........|.\|....../.-......|............
|
|
||||||
.........-|............./..../.\.|//.......-....-...........\.........-..-.........\....\..........|..........
|
|
||||||
....................|.......-../.....\-..........\................-..................\.-........|.............
|
|
||||||
.....|.\-........................./........................................../.......-.\....-......../........
|
|
||||||
...................|..............\..|/................................|/..../........../..|.................|
|
|
||||||
.......\...|./......../..........-............-....|...........-/.\...-......./....\......./........\....../..
|
|
||||||
...\............\..........\../................./....-......|..........................................\......
|
|
||||||
............|......|......../.............\...|.....................\.\\......................................
|
|
||||||
-.-.-......\.......|..........-.|.....|\....\/..............-/..........|............|......./.........-......
|
|
||||||
......................../...|................./......\............../..............-/.......\.....\\..........
|
|
||||||
...|.|.-..-./..................../................................-....\|........./...-..|........\......-....
|
|
||||||
....\....-../.........|....|........-./..\../...|...../-.|.|....\................................./...|......-
|
|
||||||
..............\../..............|.|................\......./.............../.\......|.....|..\...../....../...
|
|
||||||
............|....\......|........|.......\.................................................../.-..............
|
|
||||||
.|............|...\....................../............................................\.......|.-.-...........
|
|
||||||
.....-.\|......\.............|............|....-.........\....|.............................../....\....-.|...
|
|
||||||
............|./.........................\...|..............................\...|..|..............|...-........
|
|
||||||
.-.....|..................|....-.............-..\..-...............-....-..................-..................
|
|
||||||
..\......-.-./..................................-............\........./........-.-.............-............-
|
|
||||||
..../.\--...............//..................................||................\.................|......|......
|
|
||||||
..|./...\......................|.........../........\.....-....-.................................../-....\....
|
|
||||||
.........-........\..............................|.......|......../...........|....../......|..\.|..../.......
|
|
||||||
....../....-....|\............|.....|..\../||....................................\.....................-......
|
|
||||||
.....\.....--...././......................-........\\............-...............\....-....|................./
|
|
||||||
........./........../...-................/...........-............................................-........./.
|
|
||||||
.........-..-...|/..\.........................\............\..-........-.........-...............\......|./.-.
|
|
||||||
|......................-.....-..-.........../-..................|.....|.........\./........./...-/............
|
|
||||||
..............-...........|-....-.../.............-........./...../.................../.......--.|....-..../..
|
|
|
@ -1,10 +0,0 @@
|
||||||
.|...\....
|
|
||||||
|.-.\.....
|
|
||||||
.....|-...
|
|
||||||
........|.
|
|
||||||
..........
|
|
||||||
.........\
|
|
||||||
..../.\\..
|
|
||||||
.-.-/..|..
|
|
||||||
.|....-|.\
|
|
||||||
..//.|....
|
|
141
day16/sol.tcl
141
day16/sol.tcl
|
@ -1,141 +0,0 @@
|
||||||
#!/usr/bin/env tclsh
|
|
||||||
source ../prelude.tcl
|
|
||||||
|
|
||||||
proc read-input {input} {
|
|
||||||
global grid
|
|
||||||
global width
|
|
||||||
global height
|
|
||||||
set i 0
|
|
||||||
while {[gets $input line] >= 0} {
|
|
||||||
set j 0
|
|
||||||
foreach c [split $line ""] {
|
|
||||||
set grid($i,$j) $c
|
|
||||||
incr j
|
|
||||||
}
|
|
||||||
incr i
|
|
||||||
}
|
|
||||||
set height $i
|
|
||||||
set width $j
|
|
||||||
}
|
|
||||||
|
|
||||||
proc reset-visited {} {
|
|
||||||
global visit
|
|
||||||
array unset visit
|
|
||||||
}
|
|
||||||
|
|
||||||
proc mark-visited {x y d} {
|
|
||||||
global visit
|
|
||||||
set v [switch -exact -- $d n {expr 1} s {expr 2} w {expr 4} e {expr 8} default {error "invalid dir '$d'"}]
|
|
||||||
incr visit($y,$x) 0
|
|
||||||
set result [expr {($visit($y,$x) & $v) != 0}]
|
|
||||||
set visit($y,$x) [expr {$visit($y,$x) | $v}]
|
|
||||||
return $result
|
|
||||||
}
|
|
||||||
|
|
||||||
proc print-visited {} {
|
|
||||||
global visit
|
|
||||||
global width
|
|
||||||
global height
|
|
||||||
for {set i 0} {$i < $height} {incr i} {
|
|
||||||
set row {}
|
|
||||||
for {set j 0} {$j < $width} {incr j} {
|
|
||||||
if {[info exist visit($i,$j)] && $visit($i,$j)} {
|
|
||||||
lappend row "#"
|
|
||||||
} else {
|
|
||||||
lappend row "."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
puts [join $row ""]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
proc follow {beams {first 0}} {
|
|
||||||
global grid
|
|
||||||
set newbeams {}
|
|
||||||
foreach {x y d} $beams {
|
|
||||||
if {!$first} {
|
|
||||||
if { [mark-visited $x $y $d] } continue
|
|
||||||
switch $d {
|
|
||||||
n { incr y -1 }
|
|
||||||
s { incr y +1 }
|
|
||||||
w { incr x -1 }
|
|
||||||
e { incr x +1 }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if {[info exists grid($y,$x)]} {
|
|
||||||
switch -exact "$grid($y,$x) $d" {
|
|
||||||
{\ n} { set d w }
|
|
||||||
{\ s} { set d e }
|
|
||||||
{\ e} { set d s }
|
|
||||||
{\ w} { set d n }
|
|
||||||
{/ n} { set d e }
|
|
||||||
{/ s} { set d w }
|
|
||||||
{/ e} { set d n }
|
|
||||||
{/ w} { set d s }
|
|
||||||
{| w} { set d {n s} }
|
|
||||||
{| e} { set d {n s} }
|
|
||||||
{- n} { set d {w e} }
|
|
||||||
{- s} { set d {w e} }
|
|
||||||
}
|
|
||||||
foreach d' [split $d] {
|
|
||||||
lappend newbeams $x $y ${d'}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $newbeams
|
|
||||||
}
|
|
||||||
|
|
||||||
proc solve {} {
|
|
||||||
global visit
|
|
||||||
reset-visited
|
|
||||||
set beams [follow {0 0 e} 1]
|
|
||||||
while {[llen $beams] > 0} {
|
|
||||||
set beams [follow $beams]
|
|
||||||
}
|
|
||||||
print-visited
|
|
||||||
puts [array size visit]
|
|
||||||
}
|
|
||||||
|
|
||||||
proc lmax {list} {
|
|
||||||
set t 0
|
|
||||||
foreach x $list { if {$t < $x} {set t $x} }
|
|
||||||
return $t
|
|
||||||
}
|
|
||||||
|
|
||||||
proc solve2 {} {
|
|
||||||
global grid
|
|
||||||
global width
|
|
||||||
global height
|
|
||||||
global visit
|
|
||||||
puts "width=$width height=$height"
|
|
||||||
|
|
||||||
set edges {}
|
|
||||||
foreach k [array names grid] {
|
|
||||||
lassign [split $k ","] y x
|
|
||||||
if {$x == 0} { lappend edges [list $x $y e] }
|
|
||||||
if {$y == 0} { lappend edges [list $x $y s] }
|
|
||||||
if {$x == $width - 1} { lappend edges [list $x $y n] }
|
|
||||||
if {$y == $height - 1} { lappend edges [list $x $y w] }
|
|
||||||
}
|
|
||||||
|
|
||||||
set l {}
|
|
||||||
foreach beams $edges {
|
|
||||||
reset-visited
|
|
||||||
set beams [follow $beams 1]
|
|
||||||
while {[llen $beams] > 0} {
|
|
||||||
set beams [follow $beams]
|
|
||||||
}
|
|
||||||
puts [array size visit]
|
|
||||||
lappend l [array size visit]
|
|
||||||
}
|
|
||||||
|
|
||||||
puts [lmax $l]
|
|
||||||
}
|
|
||||||
|
|
||||||
read-input stdin
|
|
||||||
puts [array get grid]
|
|
||||||
puts [follow {0 0 e}]
|
|
||||||
puts [array get visit]
|
|
||||||
|
|
||||||
solve
|
|
||||||
solve2
|
|
Loading…
Reference in New Issue