adventofcode2023/day08/sol.tcl

69 lines
1.6 KiB
Tcl
Raw Normal View History

2023-12-08 05:19:09 +00:00
#!/usr/bin/env tclsh
source ../prelude.tcl
2023-12-08 05:43:15 +00:00
proc read-input {input} {
2023-12-08 05:19:09 +00:00
set dirs [split [gets $input] ""] ;# LR...
if {[gets $input] ne ""} { error "invalid input" }
set graph {}
while {[gets $input line] >= 0} {
2023-12-08 05:43:15 +00:00
must_regexp {^([A-Z12]+) = \(([A-Z12]+), ([A-Z12]+)\)$} $line _ node left right
2023-12-08 05:19:09 +00:00
lappend graph [list $node $left $right]
}
return [list $dirs $graph]
}
2023-12-08 05:43:15 +00:00
proc solve {dirs graph} {
2023-12-08 05:19:09 +00:00
foreach x $graph {
lassign $x node l r
set G($node) [list $l $r]
}
2023-12-08 05:43:15 +00:00
if {![info exists G(ZZZ)]} { return }
#puts [array get G]
2023-12-08 05:19:09 +00:00
set node AAA
set steps 0
while {$node ne "ZZZ"} {
set d [lindex $dirs [expr {$steps % [llength $dirs]}]]
set node [lindex $G($node) [expr {($d eq "L") ? 0 : 1}]]
puts "$d -> $node"
incr steps
}
puts "$steps"
}
2023-12-08 05:43:15 +00:00
proc ghost-solve {dirs graph} {
set start {}
array set end {}
foreach x $graph {
lassign $x node l r
set G($node) [list $l $r]
if {[string match "*A" $node]} {
lappend start $node
}
set end($node) [string match "*Z" $node]
}
set node $start
set steps 0
puts "start: $node"
while {1} {
set done 1
foreach n $node {
if {! $end($n)} {
set done 0
break
}
}
if {$done} break
set d [lindex $dirs [expr {$steps % [llength $dirs]}]]
set i [expr {$d eq "L" ? 0 : 1}]
set node [lmap n $node {lindex $G($n) $i}]
#puts "$d -> $node"
incr steps
}
puts "$steps"
}
set data [read-input stdin]
#solve {*}$data
ghost-solve {*}$data