diff options
| -rwxr-xr-x | 2024/tcl/07.tcl | 42 | 
1 files 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<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]}] +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" | 
