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
|