From 898ca38df41f266ae58c0ac69fe8ea2a99445dd8 Mon Sep 17 00:00:00 2001 From: Mistivia Date: Mon, 23 Dec 2024 18:40:14 +0800 Subject: day 11 part 2 --- 11/2.tcl | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 11/2.tcl 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 -- cgit v1.0