summaryrefslogtreecommitdiff
path: root/1-2.scm
blob: 27bc0040a10bdb3a6c7ae22b705b6c2fa5df24cb (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
#!/usr/bin/guile -s
!#
(use-modules (ice-9 regex)
             (ice-9 textual-ports)
             (srfi srfi-1))

(define numbers '(("one" . "1")
                  ("two" . "2")
                  ("three" . "3")
                  ("four" . "4")
                  ("five" . "5")
                  ("six" . "6")
                  ("seven" . "7")
                  ("eight" . "8")
                  ("nine" . "9")))

(define revnumbers (map (lambda (x) (cons (string-reverse (car x)) (cdr x))) numbers))

(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 (find-digit dict line)
  (let* ((regex (fold (lambda (x y) (string-append x "|" y)) "[0-9]" (map car dict)))
         (matches (string-match regex line))
         (digit (match:substring matches 0))
         (as-num (string->number digit)))
    (if as-num digit (cdr (assoc digit dict)))))

(define (fix-line line)
  (let ((first-digit (find-digit numbers line))
        (last-digit (find-digit revnumbers (string-reverse line))))
    (string->number (string-append first-digit last-digit))))

(let* ((port (open-input-file "1.txt"))
       (lines (read-lines port)))
  (close-port port)
  (display (fold + 0 (map fix-line lines))))