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