#lang racket (require racket/port) ; You try to ask why they can't just use a weather machine ("not powerful enough") ; and where they're even sending you ("the sky") and why your map looks mostly ; blank ("you sure ask a lot of questions") and hang on did you just say the sky ; ("of course, where do you think snow comes from") when you realize that the ; Elves are already loading you into a trebuchet ("please hold still, we need ; to strap you in"). ; As they're making the final adjustments, they discover that their calibration ; document (your puzzle input) has been amended by a very young Elf who was ; apparently just excited to show off her art skills. Consequently, the Elves ; are having trouble reading the values on the document. ; The newly-improved calibration document consists of lines of text; each line ; originally contained a specific calibration value that the Elves now need to ; recover. On each line, the calibration value can be found by combining the ; first digit and the last digit (in that order) to form a single two-digit ; number. ; For example: ; 1abc2 ; pqr3stu8vwx ; a1b2c3d4e5f ; treb7uchet ; In this example, the calibration values of these four lines are 12, 38, 15, ; and 77. Adding these together produces 142. ; Consider your entire calibration document. What is the sum of all of the ; calibration values? ; (define input '("1abc2" ; "pqr3stu8vwx" ; "a1b2c3d4e5f" ; "treb7uchet")) ; From a char list returns the first digit it finds as a char, or nil (define (get-first-digit list) (if (= (length list) 0) null (let ([current-char (first list)]) (if (char-numeric? current-char) current-char (get-first-digit (rest list)))))) (define (get-last-digit list carry) (if (= (length list) 0) carry (let* ([current-char (first list)] [next-char (if (char-numeric? current-char) current-char carry)]) (get-last-digit (rest list) next-char)))) ; Creates a new number from the first & last number found inside a string (define (list->digits list) (let ([first-char (get-first-digit list)] [last-char (get-last-digit list -1)]) (string->number (string first-char last-char)))) ; Read file (define file-contents (port->string (open-input-file "input-01.txt") #:close? #t)) ; Split file into list of strings (define input (string-split file-contents "\n")) ; process (define char-list (map string->list input)) (define result (foldl + 0 (map list->digits char-list))) (print result)