blob: 48517ce959a4c8c5a9d323d09d36af832413d76d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#!/usr/bin/env -S guile -s
!#
(use-modules (ice-9 regex)
(ice-9 textual-ports)
(srfi srfi-1))
(define (read-lines port)
(letrec ((loop (lambda (l ls)
(if (eof-object? l)
ls
(loop (get-line port) (cons l ls))))))
(reverse (loop (get-line port) '()))))
(define (split-up nums)
(filter (lambda (x) (not (string-null? x))) (string-split nums char-set:whitespace)))
(define (parse line)
(let* ((m (string-match " ([0-9]+): ([0-9| ]+) \\| ([0-9| ]+)" line))
(winning (split-up (match:substring m 2)))
(have (split-up (match:substring m 3)))
(shared (filter (lambda (x) (member x winning)) have)))
`(,(length shared) . ,1)))
(let* ((port (open-input-file "4.txt"))
(lines (read-lines port))
(cards (map parse lines)))
(close-port port)
;; (while (< index (length cards))
;; (do ((i 1 (1+ i))) ((> i (cdr (list-ref cards index))))
;; (set! cards (append cards `(,(assoc (+ (car (list-ref cards index)) i) cards)))))
;; (set! index (1+ index)))
;; (display (length cards))
(do ((i 0 (1+ i))) ((= i (length cards)))
(do ((j 1 (1+ j))) ((> j (car (list-ref cards i))))
(let ((card (list-ref cards (+ i j))))
(list-set! cards (+ i j) `(,(car card) . ,(+ (cdr card) (cdr (list-ref cards i))))))))
(display (fold + 0 (map cdr cards))))
|