46 lines
921 B
Racket
46 lines
921 B
Racket
|
#lang racket
|
||
|
|
||
|
(define ht #hash(("one" . "o1e")
|
||
|
("two" . "t2o")
|
||
|
("three" . "thr3e")
|
||
|
("four" . "fo4r")
|
||
|
("five" . "fi5e")
|
||
|
("six" . "s6x")
|
||
|
("seven" . "se7en")
|
||
|
("eight" . "ei8ht")
|
||
|
("nine" . "ni9e")) )
|
||
|
|
||
|
|
||
|
(define (numerized str)
|
||
|
(for ([i (hash-keys ht)])
|
||
|
(define repl (hash-ref ht i))
|
||
|
(set! str
|
||
|
(string-replace str i repl) ))
|
||
|
|
||
|
(set! str (regexp-replace* #rx"[^0-9]" str ""))
|
||
|
str )
|
||
|
|
||
|
(define (values str)
|
||
|
(define (first-number num)
|
||
|
(define quo (quotient num 10))
|
||
|
(cond
|
||
|
[(> quo 10) (first-number quo)]
|
||
|
[else quo]) )
|
||
|
|
||
|
(define num (string->number str))
|
||
|
|
||
|
(cond
|
||
|
[(not (number? num)) 0]
|
||
|
[(< num 10) (+ num (* num 10))]
|
||
|
[(< num 100) num]
|
||
|
[else (let*
|
||
|
([first (first-number num)]
|
||
|
[last (remainder num 10) ] )
|
||
|
(+ (* first 10) last) ) ] ))
|
||
|
|
||
|
(define lines (file->lines "data.in"))
|
||
|
(define nums (map numerized lines))
|
||
|
|
||
|
(foldr + 0 (map values nums))
|
||
|
|