diff options
Diffstat (limited to 'day11.scm')
| -rw-r--r-- | day11.scm | 72 |
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)) |
