blob: 9849d6983bd8d13d83daad7623ce8ac65d43808a (
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 red-max 12)
(define green-max 13)
(define blue-max 14)
(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 (valid-triplet? triplet)
(let* ((zero (string-match "(.)" "0"))
(red (string->number (match:substring (or (string-match "([0-9]+) red" triplet) zero) 1)))
(green (string->number (match:substring (or (string-match "([0-9]+) green" triplet) zero) 1)))
(blue (string->number (match:substring (or (string-match "([0-9]+) blue" triplet) zero) 1))))
(and (<= red red-max) (<= green green-max) (<= blue blue-max))))
(define (line-value line)
(let* ((id-split (string-match "^Game ([0-9]+):(.*)$" line))
(id (string->number (match:substring id-split 1)))
(rest (string-split (match:substring id-split 2) #\;))
(valid? (fold (lambda (x y) (and x y)) #t (map valid-triplet? rest))))
(if valid? id 0)))
(line-value "Game 38: 2 blue, 4 green, 11 red; 7 green, 6 red, 2 blue; 1 green, 3 red, 1 blue; 4 blue, 4 green, 4 red; 2 red, 5 blue, 2 green")
(let* ((port (open-input-file "2.txt"))
(lines (read-lines port)))
(close-port port)
(display (fold + 0 (map line-value lines))))
|