blob: 9c96af9bd5b075f639f2e02ecc1dae8a17ce71b7 (
plain) (
tree)
|
|
#!/bin/env tclsh
source lib.tcl
setup 7
puts {Part 1: Total of valid test lines}
proc op_search {ops targ cur rest} {
# cursed, produces exprs of the form "$cur<op>$next == $targ || ..."
set e1 {}
foreach op $ops {
lappend e1 [string cat {$cur} $op {$next == $targ}]
}
set e1 [join $e1 " || "]
# cursed, produces exprs of the form "[_op_search $e1 $e2 $targ [expr {$cur<op>$next}] $rest] || ..."
set e2 {}
foreach op $ops {
lappend e2 [string cat \
{[_op_search $e1 $e2 $targ [expr } \
[list [string cat {$cur} $op {$next}]] \
{] $rest]}]
}
set e2 [join $e2 " || "]
_op_search $e1 $e2 $targ $cur $rest
}
proc _op_search {e1 e2 targ cur rest} {
set rest [lassign $rest next]
if {$rest == {}} {
expr $e1
} else {
expr $e2
}
}
set test_total 0
set cat_test_total 0
foreach line $input {
lassign [split $line :] targ nums
set nums [lassign $nums first]
if [op_search {{ + } { * }} $targ $first $nums] {
incr test_total $targ
}
if [op_search {{ + } { * } {}} $targ $first $nums] {
incr test_total $targ
}
}
puts "Total: $test_total"
puts ""
puts {Part 2: Total of valid test lines with || operator}
puts "2: $"
|