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))))
|