aboutsummaryrefslogtreecommitdiff
path: root/day11.scm
diff options
context:
space:
mode:
Diffstat (limited to 'day11.scm')
-rw-r--r--day11.scm72
1 files changed, 72 insertions, 0 deletions
diff --git a/day11.scm b/day11.scm
new file mode 100644
index 0000000..76ca159
--- /dev/null
+++ b/day11.scm
@@ -0,0 +1,72 @@
+(define-module (day11)
+ #:use-module (ice-9 rdelim))
+
+(define (part1 port)
+ (define line (read-line port))
+ (define nums (map string->number (string-split line #\space)))
+ (define (blink lst acc)
+ (if (null? lst)
+ (reverse acc)
+ (blink (cdr lst)
+ (if (zero? (car lst))
+ (cons 1 acc)
+ (let ((s (number->string (car lst))))
+ (if (even? (string-length s))
+ (cons (string->number (substring s (/ (string-length s) 2)))
+ (cons (string->number (substring s 0 (/ (string-length s) 2)))
+ acc))
+ (cons (* (car lst) 2024) acc)))))))
+ (define (iter lst left)
+ (if (zero? left)
+ (length lst)
+ (iter (blink lst '()) (- left 1))))
+ (iter nums 25))
+
+(define memo (make-hash-table))
+
+(define (next0 num)
+ (if (zero? num)
+ (list 1)
+ (let* ((s (number->string num))
+ (len (string-length s)))
+ (if (even? len)
+ (list (string->number (substring s 0 (/ len 2)))
+ (string->number (substring s (/ len 2))))
+ (list (* num 2024))))))
+
+(define (next num)
+ (define val (hashv-ref memo num))
+ (if val
+ val
+ (let ((comp (next0 num)))
+ (hashv-set! memo num comp)
+ comp)))
+
+(define (step ht)
+ (define new (make-hash-table))
+ (hash-for-each
+ (lambda (num amt)
+ (for-each
+ (lambda (v)
+ (hashv-set! new v
+ (+ (hashv-ref new v 0) amt)))
+ (next num)))
+ ht)
+ new)
+
+(define (part2 port)
+ (define line (read-line port))
+ (define nums (map string->number (string-split line #\space)))
+ (define ht (make-hash-table))
+ (for-each (lambda (n)
+ (hashv-set! ht n
+ (+ 1 (hashv-ref ht n 0))))
+ nums)
+ (define (iter ht left)
+ (if (zero? left)
+ (let ((cnt 0))
+ (hash-for-each (lambda (k v) (set! cnt (+ cnt v)))
+ ht)
+ cnt)
+ (iter (step ht) (- left 1))))
+ (iter ht 75))