adventofcode2023/day19/sol.tcl

60 lines
1.5 KiB
Tcl
Raw Normal View History

2023-12-19 05:31:27 +00:00
#!/usr/bin/env tclsh
source ../prelude.tcl
proc read-workflows input {
set flows [dict create]
while {[gets $input line] >= 0} {
if {$line eq ""} break
set line [string map [list \{ @ \} @] $line]
must_regexp {([a-z]+)@([^@]*)@} $line _ name rulestr
set rules {}
foreach r [split $rulestr ","] {
if {[string first : $r] >= 0} {
lassign [split $r :] cond dest
set cond [regsub -all {([xmas])} $cond {$\1}]
lappend rules $cond $dest
} else {
lappend rules default $r
}
}
dict set flows $name $rules
}
return $flows
}
proc read-values input {
set values {}
while {[gets $input line] >= 0} {
set line [trim [regsub -all {[^a-z0-9]} $line { }]]
lappend values [dict create {*}[split $line]]
}
return $values
}
proc filter {flows value} {
set f in
while {[dict exists $flows $f]} {
set rules [dict get $flows $f]
foreach {cond dest} $rules {
if {$cond eq "default" || [dict with value {expr $cond}]} {
set f $dest
break
}
}
}
return $f
}
set flows [read-workflows stdin]
set values [read-values stdin]
puts $flows
puts $values
foreach v $values {
set f [filter $flows $v]
set score [ladd [lextract $v 2 1]]
puts "$v : $f : $score"
if {$f eq "A"} { incr t $score }
}
puts "$t"