summaryrefslogtreecommitdiff
path: root/2.scm
diff options
context:
space:
mode:
Diffstat (limited to '2.scm')
-rwxr-xr-x2.scm37
1 files changed, 37 insertions, 0 deletions
diff --git a/2.scm b/2.scm
new file mode 100755
index 0000000..9849d69
--- /dev/null
+++ b/2.scm
@@ -0,0 +1,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))))