diff options
Diffstat (limited to '2-2.scm')
-rwxr-xr-x | 2-2.scm | 38 |
1 files changed, 38 insertions, 0 deletions
@@ -0,0 +1,38 @@ +#!/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 (triplet-values 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)))) + `(,red ,green ,blue))) + +(define (line-value line) + (let* ((id-split (string-match "^Game ([0-9]+):(.*)$" line)) + (rest (string-split (match:substring id-split 2) #\;)) + (values (map triplet-values rest)) + (red-min (fold (lambda (x y) (if (> x y) x y)) 0 (map car values))) + (green-min (fold (lambda (x y) (if (> x y) x y)) 0 (map cadr values))) + (blue-min (fold (lambda (x y) (if (> x y) x y)) 0 (map caddr values))) + (power (* red-min green-min blue-min))) + power)) + +(let* ((port (open-input-file "2.txt")) + (lines (read-lines port))) + (close-port port) + (display (fold + 0 (map line-value lines)))) |