diff options
-rwxr-xr-x | 10.scm | 42 | ||||
-rw-r--r-- | 10s.txt | 5 |
2 files changed, 47 insertions, 0 deletions
@@ -0,0 +1,42 @@ +#!/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))) @@ -0,0 +1,5 @@ +7-F7- +.FJ|7 +SJLL7 +|F--J +LJ.LJ |