#!/bin/env tclsh source lib.tcl setup 7 puts {Part 1: Total of valid test lines} proc op_search {targ cur rest} { set rest [lassign $rest next] if {$rest == {}} { expr {$cur + $next == $targ || $cur * $next == $targ} } else { expr {[op_search $targ [expr {$cur + $next}] $rest] || [op_search $targ [expr {$cur * $next}] $rest]} } } proc op_search_cat {targ cur rest} { set rest [lassign $rest next] if {$rest == {}} { # puts "leaf: $cur,$next // $targ" expr {$cur + $next == $targ || $cur * $next == $targ || [string cat $cur $next] == $targ} } else { # puts "branch: $cur,$next .. $rest // $targ" expr {[op_search_cat $targ [expr {$cur + $next}] $rest] || [op_search_cat $targ [expr {$cur * $next}] $rest] || [op_search_cat $targ [string cat $cur $next] $rest]} } } 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_cat $targ $first $nums] { incr cat_test_total $targ } } puts "Total: $test_total" puts "" puts {Part 2: Total of valid test lines with || operator} puts "Total: $cat_test_total"