day 16 part 2
parent
b14209ff39
commit
94bf752568
|
@ -24,11 +24,12 @@ proc mark-visited {visitp x y d} {
|
||||||
return $result
|
return $result
|
||||||
}
|
}
|
||||||
|
|
||||||
proc follow {gridp visitp beams} {
|
proc follow {gridp visitp beams {first 0}} {
|
||||||
upvar $gridp grid
|
upvar $gridp grid
|
||||||
upvar $visitp visit
|
upvar $visitp visit
|
||||||
set newbeams {}
|
set newbeams {}
|
||||||
foreach {x y d} $beams {
|
foreach {x y d} $beams {
|
||||||
|
if {!$first} {
|
||||||
if { [mark-visited visit $x $y $d] } continue
|
if { [mark-visited visit $x $y $d] } continue
|
||||||
switch $d {
|
switch $d {
|
||||||
n { incr y -1 }
|
n { incr y -1 }
|
||||||
|
@ -36,6 +37,7 @@ proc follow {gridp visitp beams} {
|
||||||
w { incr x -1 }
|
w { incr x -1 }
|
||||||
e { incr x +1 }
|
e { incr x +1 }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if {![info exists grid($y,$x)]} continue
|
if {![info exists grid($y,$x)]} continue
|
||||||
switch -exact "$grid($y,$x) $d" {
|
switch -exact "$grid($y,$x) $d" {
|
||||||
{\ n} { set d w }
|
{\ n} { set d w }
|
||||||
|
@ -60,14 +62,15 @@ proc follow {gridp visitp beams} {
|
||||||
|
|
||||||
proc solve {} {
|
proc solve {} {
|
||||||
global grid
|
global grid
|
||||||
set beams {-1 0 e}
|
set beams [follow grid visit {0 0 e} 1]
|
||||||
while {[llen $beams] > 0} {
|
while {[llen $beams] > 0} {
|
||||||
set beams [follow grid visit $beams]
|
set beams [follow grid visit $beams]
|
||||||
}
|
}
|
||||||
set t 0
|
set t 0
|
||||||
for {set i 0} {$i < 110} {incr i} {
|
set N 10
|
||||||
|
for {set i 0} {$i < $N} {incr i} {
|
||||||
set row {}
|
set row {}
|
||||||
for {set j 0} {$j < 110} {incr j} {
|
for {set j 0} {$j < $N} {incr j} {
|
||||||
if {[info exists visit($i,$j)] && $visit($i,$j)} {
|
if {[info exists visit($i,$j)] && $visit($i,$j)} {
|
||||||
lappend row "#"
|
lappend row "#"
|
||||||
incr t
|
incr t
|
||||||
|
@ -80,8 +83,40 @@ proc solve {} {
|
||||||
puts [array size visit]
|
puts [array size visit]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proc lmax {list} {
|
||||||
|
set t 0
|
||||||
|
foreach x $list { if {$t < $x} {set t $x} }
|
||||||
|
return $t
|
||||||
|
}
|
||||||
|
|
||||||
|
proc solve2 {width height} {
|
||||||
|
global grid
|
||||||
|
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 {
|
||||||
|
array unset visit
|
||||||
|
set beams [follow grid visit $beams 1]
|
||||||
|
while {[llen $beams] > 0} {
|
||||||
|
set beams [follow grid visit $beams]
|
||||||
|
}
|
||||||
|
puts [array size visit]
|
||||||
|
lappend l [array size visit]
|
||||||
|
}
|
||||||
|
|
||||||
|
puts [lmax $l]
|
||||||
|
}
|
||||||
|
|
||||||
read-input grid stdin
|
read-input grid stdin
|
||||||
puts [array get grid]
|
puts [array get grid]
|
||||||
puts [follow grid visit {0 0 e}]
|
puts [follow grid visit {0 0 e}]
|
||||||
|
|
||||||
solve
|
solve
|
||||||
|
solve2 110 110
|
||||||
|
|
Loading…
Reference in New Issue