diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..99afe76 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +inputs + + diff --git a/main.rkt b/main.rkt index 16418dd..3b96818 100644 --- a/main.rkt +++ b/main.rkt @@ -1,81 +1,23 @@ #lang racket -(require racket/port) +; import all days +(require "src/day01.rkt") -; 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)))) +(define (run-all) + (printf "Running all solutions") + (define result-01-p1 (advent-of-code-01-p1)) + (printf (string-append "Day 1 part 1: " result-01-p1))) -; 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")) +(define argv (current-command-line-arguments)) +(define argc (vector-length argv)) -; process -(define char-list (map string->list input)) -(define result (foldl + 0 (map list->digits char-list))) +; If no arguments are provided, run all solutions from all days +; on the real inputs + +(when (= argc 0) + (run-all) + (exit 1)) - - -(print result) diff --git a/src/day01.rkt b/src/day01.rkt new file mode 100644 index 0000000..f6f2910 --- /dev/null +++ b/src/day01.rkt @@ -0,0 +1,81 @@ +#lang racket + +(require racket/port) +(provide advent-of-code-01-p1) + +; 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)))) + + +(define (advent-of-code-01-p1) + ; 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))) + result) +