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