summaryrefslogtreecommitdiff
path: root/5.scm
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))))