#!/usr/bin/env -S guile -s !# (use-modules (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 (candidates-for type pos) (let ((x (car pos)) (y (cdr pos))) (cond ((equal? type #\|) `(,(cons x (1+ y)) ,(cons x (1- y)))) ((equal? type #\-) `(,(cons (1+ x) y) ,(cons (1- x) y))) ((equal? type #\L) `(,(cons x (1- y)) ,(cons (1+ x) y))) ((equal? type #\J) `(,(cons x (1- y)) ,(cons (1- x) y))) ((equal? type #\7) `(,(cons (1- x) y) ,(cons x (1+ y)))) ((equal? type #\F) `(,(cons x (1+ y)) ,(cons (1+ x) y))) ((equal? type #\S) `(,(cons x (1+ y)) ,(cons x (1- y)) ,(cons (1+ x) y) ,(cons (1- x) y))) ((equal? type #\.) '())))) (let* ((port (open-input-file "10s.txt")) (lines (read-lines port)) (candidates '((0 . 2))) (seen '())) (close-port port) (while (not (null? candidates)) (set! candidates (append! (cdr candidates) (filter (lambda (x) (member x seen)) (candidates-for (string-ref (list-ref lines (cdar candidates)) (caar candidates)) (car candidates))))) (display candidates) (newline)))