60 lines
1.5 KiB
Tcl
60 lines
1.5 KiB
Tcl
|
#!/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"
|