diff options
Diffstat (limited to '2024/tcl/07.tcl')
-rwxr-xr-x | 2024/tcl/07.tcl | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/2024/tcl/07.tcl b/2024/tcl/07.tcl new file mode 100755 index 0000000..9c96af9 --- /dev/null +++ b/2024/tcl/07.tcl @@ -0,0 +1,54 @@ +#!/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: $" |