diff options
| author | Mistivia <i@mistivia.com> | 2024-12-23 18:40:14 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-12-23 18:40:14 +0800 |
| commit | 898ca38df41f266ae58c0ac69fe8ea2a99445dd8 (patch) | |
| tree | baa3b10b909efc92f07d59763b5032b73415ecee /11 | |
| parent | 1cc355995dcf98bb3b07bf71a638b3e19e63d33c (diff) | |
day 11 part 2
Diffstat (limited to '11')
| -rw-r--r-- | 11/2.tcl | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/11/2.tcl b/11/2.tcl new file mode 100644 index 0000000..d0c5766 --- /dev/null +++ b/11/2.tcl @@ -0,0 +1,55 @@ +set fp [open "input"] +gets $fp line +close $fp + +proc is_even {x} { + return [expr {$x % 2 == 0}] +} + +proc zero_trim {x} { + for {set i 0} {$i < [expr {[string length $x] - 1}]} {incr i} { + if {[string index $x $i] != 0} { + break + } + } + return [string range $x $i end] +} + +set blinked_length_cache {} + +proc blinked_length {x n} { + global blinked_length_cache + if {$n == 0} { + return 1 + } + set key "$x,$n" + if {[dict exists $blinked_length_cache $key]} { + return [dict get $blinked_length_cache $key] + } + if {$x == 0} { + set result [blinked_length 1 [expr {$n - 1}]] + dict set blinked_length_cache $key $result + return $result + } + if {[is_even [string length $x]]} { + set len [string length $x] + set halflen [expr {$len / 2}] + set first [zero_trim [string range $x 0 [expr {$halflen - 1}]]] + set second [zero_trim [string range $x $halflen end]] + set next_n [expr {$n - 1}] + set result [expr {[blinked_length $first $next_n] \ + + [blinked_length $second $next_n]}] + dict set blinked_length_cache $key $result + return $result + } + set result [blinked_length [expr {$x * 2024}] [expr {$n - 1}]] + dict set blinked_length_cache $key $result + return $result +} + +set lst $line +set sum 0 +foreach x $lst { + incr sum [blinked_length $x 75] +} +puts $sum |
