advent-23-racket/main.rkt

82 lines
2.6 KiB
Racket
Raw Normal View History

2023-12-03 00:25:35 +00:00
#lang racket
2023-12-03 00:32:58 +00:00
(require racket/port)
2023-12-03 00:25:35 +00:00
; 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?
2023-12-03 00:32:58 +00:00
; (define input '("1abc2"
; "pqr3stu8vwx"
; "a1b2c3d4e5f"
; "treb7uchet"))
2023-12-03 00:25:35 +00:00
; 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))))
2023-12-03 00:35:25 +00:00
; Read file
2023-12-03 00:32:58 +00:00
(define file-contents
(port->string (open-input-file "input-01.txt") #:close? #t))
2023-12-03 00:35:25 +00:00
; Split file into list of strings
(define input (string-split file-contents "\n"))
2023-12-03 00:32:58 +00:00
2023-12-03 00:35:25 +00:00
; process
(define char-list (map string->list input))
(define result (foldl + 0 (map list->digits char-list)))
2023-12-03 00:32:58 +00:00
2023-12-03 00:25:35 +00:00
2023-12-03 00:35:25 +00:00
(print result)