#!/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) (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))))