blob: 39929d39eafdb9466d43feaf95847dfd8de4697e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
#!/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)
(map string->number (filter (lambda (x) (not (string-null? x))) (string-split nums char-set:whitespace))))
(define (perform-mapping val map)
(let* ((mapping (filter (lambda (x) (and (> val (cadr x))
(< val (+ (cadr x) (caddr x))))) map)))
(if (null? mapping) val
(+ val (- (caar mapping) (cadar mapping))))))
(define (perform-all-mappings val maps)
(do ((i 0 (1+ i))) ((= i (length maps)))
(set! val (perform-mapping val (list-ref maps i))))
val)
(define (parse-next-map lines)
(let ((map-started #f)
(map-parsed #f)
(current-map '()))
(while (not map-parsed)
(if (and (not map-started)
(string-match "map" (car lines)))
(set! map-started #t)
(when map-started
(if (string-match "[0-9]" (car lines))
(set! current-map (append current-map `(,(split-up (car lines)))))
(set! map-parsed #t))))
(set! lines (cdr lines)))
`(,current-map ,lines)))
(let* ((port (open-input-file "5.txt"))
(lines (read-lines port))
(seeds (split-up (match:substring (string-match ": ([0-9| ]+)" (car lines)) 1)))
(lines (cdr lines))
(maps '()))
(close-port port)
(do ((i 0 (1+ i))) ((= i 7))
(let ((res (parse-next-map lines)))
(set! maps (append maps `(,(car res))))
(set! lines (cadr res))))
(let ((locations (map (lambda (x) (perform-all-mappings x maps)) seeds)))
(display (fold (lambda (x y) (if (> x y) y x)) (car locations) locations))))
|