#!/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"