From b16625cf6797da68f9c3c82a48509c7697d01040 Mon Sep 17 00:00:00 2001 From: Aleteoryx Date: Sat, 7 Dec 2024 16:15:48 -0500 Subject: 2024.7; could be more elegant, but it works --- 2024/tcl/07.tcl | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/2024/tcl/07.tcl b/2024/tcl/07.tcl index 9c96af9..9cc9ddd 100755 --- a/2024/tcl/07.tcl +++ b/2024/tcl/07.tcl @@ -5,31 +5,25 @@ 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]}] +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]} } - set e2 [join $e2 " || "] - - _op_search $e1 $e2 $targ $cur $rest } -proc _op_search {e1 e2 targ cur rest} { +proc op_search_cat {targ cur rest} { set rest [lassign $rest next] if {$rest == {}} { - expr $e1 +# puts "leaf: $cur,$next // $targ" + expr {$cur + $next == $targ || $cur * $next == $targ || [string cat $cur $next] == $targ} } else { - expr $e2 +# 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]} } } @@ -38,11 +32,11 @@ set cat_test_total 0 foreach line $input { lassign [split $line :] targ nums set nums [lassign $nums first] - if [op_search {{ + } { * }} $targ $first $nums] { + if [op_search $targ $first $nums] { incr test_total $targ } - if [op_search {{ + } { * } {}} $targ $first $nums] { - incr test_total $targ + if [op_search_cat $targ $first $nums] { + incr cat_test_total $targ } } @@ -51,4 +45,4 @@ puts "Total: $test_total" puts "" puts {Part 2: Total of valid test lines with || operator} -puts "2: $" +puts "Total: $cat_test_total" -- cgit v1.2.3-70-g09d2