From c55423d6f3245e8016da1f583fcd2310f48bd658 Mon Sep 17 00:00:00 2001 From: Andrew Ekstedt Date: Tue, 12 Dec 2023 09:40:29 +0000 Subject: [PATCH] day 12 cleanup --- day12/sol2.tcl | 60 ++++++++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/day12/sol2.tcl b/day12/sol2.tcl index 7662a6c..ccdb658 100755 --- a/day12/sol2.tcl +++ b/day12/sol2.tcl @@ -2,27 +2,25 @@ source ../prelude.tcl set input stdin -array set ::m {} - -proc memo {row nums i left} { +proc count-memo {row nums i left} { + global memo + if {$i == 0} { + array unset memo + } set key "$i,$left,[llength $nums]" - if {[info exists ::m($key)]} { + if {[info exists memo($key)]} { #puts "$key exists" - #puts [array get ::m] - return $::m($key) + return $memo($key) } set n [count $row $nums $i $left] - set ::m($key) $n + set memo($key) $n return $n } proc count {row nums i left} { -#puts [list count $row $nums $i $left] + #puts [list count $row $nums $i $left] if {$i >= [string length $row]} { - if {[llength $nums] > 0} { - return 0 - } - return [expr {$left > 1 ? 0 : 1}] + return [expr {($left > 1 || [llength $nums] > 0) ? 0 : 1}] } if {[llength $nums] <= 0 && $left <= 0} { return [expr {[string first "#" $row $i] >= 0 ? 0 : 1}] @@ -31,70 +29,64 @@ proc count {row nums i left} { incr i if {$c eq "."} { if {$left > 1} { + # contradiction: expecting a "#" return 0 } elseif {$left == 1} { + # left counts the number of "#" left in the current group, + # plus the "." at the end. if left==1 then we've seen all + # the "#" and now we need to see a "." set left 0 } else { # nothing } - return [memo $row $nums $i $left] + return [count-memo $row $nums $i $left] } if {$c eq "#"} { if {$left > 1} { incr left -1 } elseif {$left == 1} { + # contradiction: expecting a "." return 0 } else { set nums [lassign $nums left] ;# shift nums } - return [memo $row $nums $i $left] + return [count-memo $row $nums $i $left] } if {$c eq "?"} { if {$left > 1} { # must be "#" incr left -1 #set row [string replace $row $i-1 $i-1 "#"] - return [memo $row $nums $i $left] + return [count-memo $row $nums $i $left] } elseif {$left == 1} { # must be "." set left 0 #set row [string replace $row $i-1 $i-1 "."] - return [memo $row $nums $i $left] + return [count-memo $row $nums $i $left] } else { # bifurcate + # "." #set row [string replace $row $i-1 $i-1 "."] - set a [memo $row $nums $i $left] ;# "." + set a [count-memo $row $nums $i $left] set nums [lassign $nums left] + # "#" #set row [string replace $row $i-1 $i-1 "#"] - set b [memo $row $nums $i $left] ;# "#" + set b [count-memo $row $nums $i $left] return [expr {$a + $b}] } } error "invalid character '$c' at position $i" } -proc match {row nums} { - #puts -nonewline " $row -> " - set row [string map {. " "} $row] - #puts " $row" - foreach group $row n $nums { - if {[string length $group] != $n} { - return 0 - } - } - return 1 -} - +set part1 0 set part2 0 while {[gets $input line] >= 0} { - set n 0 lassign $line row nums set row "$row?$row?$row?$row?$row" - set row [string trim $row "."] + #set row [string trim $row "."] set nums [split $nums ","] set nums [concat $nums $nums $nums $nums $nums] - array unset ::m - set n [memo $row $nums 0 0] + set n [count-memo $row $nums 0 0] puts "$n | $row $nums" incr part2 $n }