summaryrefslogtreecommitdiff
path: root/10.scm
diff options
context:
space:
mode:
Diffstat (limited to '10.scm')
-rwxr-xr-x10.scm23
1 files changed, 17 insertions, 6 deletions
diff --git a/10.scm b/10.scm
index 15c4b1c..b6b50b6 100755
--- a/10.scm
+++ b/10.scm
@@ -31,12 +31,23 @@
,(cons (1- x) y)))
((equal? type #\.) '()))))
-(let* ((port (open-input-file "10s.txt"))
+(let* ((port (open-input-file "10.txt"))
(lines (read-lines port))
- (candidates '((0 . 2)))
- (seen '()))
+ (candidates '(((0 . 2) . 0)))
+ (seen '())
+ (last #nil)
+ (start 0))
(close-port port)
+ (do ((i 0 (1+ i))) ((string-contains (list-ref lines i) "S")) (set! start i))
+ (set! candidates `(,(cons (cons (string-index (list-ref lines (1+ start)) #\S) (1+ start)) 0)))
(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)))
+ (set! seen (append! seen `(,(caar candidates))))
+ (let* ((cands (candidates-for (string-ref (list-ref lines (cdaar candidates)) (caaar candidates)) (caar candidates)))
+ (cands (filter (lambda (x) (and (not (member x seen))
+ (not (negative? (car x)))
+ (not (negative? (cdr x)))
+ (member (caar candidates) (candidates-for (string-ref (list-ref lines (cdr x)) (car x)) x)))) cands))
+ (cands (map (lambda (x) (cons (cons (car x) (cdr x)) (1+ (cdar candidates)))) cands)))
+ (set! last (car candidates))
+ (set! candidates (append! (cdr candidates) cands))))
+ (display (cdr last)))