aboutsummaryrefslogtreecommitdiff
path: root/11
diff options
context:
space:
mode:
Diffstat (limited to '11')
-rw-r--r--11/2.tcl55
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