diff --git a/.dir-locals.el b/.dir-locals.el new file mode 100644 index 0000000..e276bae --- /dev/null +++ b/.dir-locals.el @@ -0,0 +1 @@ +((scheme-mode . ((geiser-scheme . 'chicken)))) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e4e5f6c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*~ \ No newline at end of file diff --git a/chicken.org b/chicken.org index ad0ebb0..93a4abf 100644 --- a/chicken.org +++ b/chicken.org @@ -55,9 +55,132 @@ these together produces =142=. Consider your entire calibration document. *What is the sum of all of the calibration values?* -*** Puzzle Input +*** Puzzle Solution +:PROPERTIES: +:ID: day1-puzzle-solution-1 +:END: -Jump to [[#headline-6][the solution]]. +#+NAME: day1-solution-1 +#+begin_src scheme :var input=day1-input + (import (chicken string) + (chicken irregex)) + (let ((lines (string-split input "\n"))) + (foldl + 0 + (map + (lambda (line) + (let ((digits (irregex-extract '(/ #\0 #\9) line))) + (if (= 0 (length digits)) + 0 + (let ((first-digit (car digits)) + (last-digit (car (reverse digits)))) + (string->number (string-append first-digit last-digit)))))) + lines))) +#+end_src + +#+RESULTS: day1-solution-1 +: 54159 + + +** Part Two + +*** Quest + +Your calculation isn't quite right. It looks like some of the digits are actually *spelled out with +letters*: =one=, =two=, =three=, =four=, =five=, =six=, =seven=, =eight=, and =nine= *also* count as +valid "digits". + +Equipped with this new information, you now need to find the real first and last digit on each +line. For example: + +#+begin_example +two1nine +eightwothree +abcone2threexyz +xtwone3four +4nineeightseven2 +zoneight234 +7pqrstsixteen +#+end_example + +In this example, the calibration values are =29=, =83=, =13=, =24=, =42=, =14=, and =76=. Adding +these together produces =281=. + +*What is the sum of all of the calibration values?* + +*** Puzzle Solution + +#+NAME: day1-solution-2 +#+begin_src scheme + (import (chicken string) + (chicken irregex)) + + (define (extract-digits input-string) + (irregex-extract '(or (/ #\0 #\9) + "one" + "two" + "three" + "four" + "five" + "six" + "seven" + "eight" + "nine" + ; Duplicates + "twone" + "eightwo" + "nineight" + "eighthree" + "threeight" + "fiveight" + "oneight" + "sevenine") + input-string)) + + (define (translate-code digit) + (case (string->symbol digit) + ((|0|) "0") + ((|1| one) "1") + ((|2| two) "2") + ((|3| three) "3") + ((|4| four) "4") + ((|5| five) "5") + ((|6| six) "6") + ((|7| seven) "7") + ((|8| eight) "8") + ((|9| nine) "9") + ; Again, duplicates + ((twone) "21") + ((eightwo) "82") + ((nineight) "98") + ((eighthree) "83") + ((threeight) "38") + ((fiveight) "58") + ((oneight) "18") + ((sevenine) "79") + )) + + (let ((lines (string-split input "\n"))) + (foldl + 0 + (map + (lambda (line) + (let ((digits (string->list + (foldl string-append "" + (map translate-code (extract-digits line)))))) + (if (= 0 (length digits)) + 0 + (let ((first-digit (car digits)) + (last-digit (car (reverse digits)))) + (string->number (string first-digit last-digit)))))) + lines))) +#+end_src + +#+RESULTS: day1-solution-2 +: 53866 + + +** Puzzle Input + +Jump to [[#headline-10][day 2]]. #+NAME: day1-input #+begin_example @@ -1063,123 +1186,291 @@ eightbqfhnmvqsoneninezbrzcqkz4ftv 1eightcrcjcbdthreebscfpvznqfrj6 #+end_example -*** Puzzle Solution -:PROPERTIES: -:ID: day1-puzzle-solution-1 -:END: +* Day 2: Cube Conundrum -#+NAME: day1-solution-1 -#+begin_src scheme :var input=day1-input - (import (chicken string) - (chicken irregex)) - (let ((lines (string-split input "\n"))) - (foldl + 0 - (map - (lambda (line) - (let ((digits (irregex-extract '(/ #\0 #\9) line))) - (if (= 0 (length digits)) - 0 - (let ((first-digit (car digits)) - (last-digit (car (reverse digits)))) - (string->number (string-append first-digit last-digit)))))) - lines))) +** Part One +*** Quest +You're launched high into the atmosphere! The apex of your trajectory just barely reaches the +surface of a large island floating in the sky. You gently land in a fluffy pile of leaves. It's +quite cold, but you don't see much snow. An Elf runs over to greet you. + +The Elf explains that you've arrived at *Snow Island* and apologizes for the lack of snow. He'll be +happy to explain the situation, but it's a bit of a walk, so you have some time. They don't get many +visitors up here; would you like to play a game in the meantime? + +As you walk, the Elf shows you a small bag and some cubes which are either red, green, or blue. Each +time you play this game, he will hide a secret number of cubes of each color in the bag, and your +goal is to figure out information about the number of cubes. + +To get information, once a bag has been loaded with cubes, the Elf will reach into the bag, grab a +handful of random cubes, show them to you, and then put them back in the bag. He'll do this a few +times per game. + +You play several games and record the information from each game (your puzzle input). Each game is +listed with its ID number (like the =11= in =Game 11: ...=) followed by a semicolon-separated list of +subsets of cubes that were revealed from the bag (like =3 red, 5 green, 4 blue=). + +For example, the record of a few games might look like this: + +#+begin_example +Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green +Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue +Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red +Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red +Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green +#+end_example + +In game 1, three sets of cubes are revealed from the bag (and then put back again). The first set is +3 blue cubes and 4 red cubes; the second set is 1 red cube, 2 green cubes, and 6 blue cubes; the +third set is only 2 green cubes. + +The Elf would first like to know which games would have been possible if the bag contained *only 12 +red cubes, 13 green cubes, and 14 blue cubes*? + +In the example above, games 1, 2, and 5 would have been *possible* if the bag had been loaded with +that configuration. However, game 3 would have been *impossible* because at one point the Elf showed +you 20 red cubes at once; similarly, game 4 would also have been *impossible* because the Elf showed +you 15 blue cubes at once. If you add up the IDs of the games that would have been possible, you +get =8=. + +Determine which games would have been possible if the bag had been loaded with only 12 red cubes, 13 +green cubes, and 14 blue cubes. *What is the sum of the IDs of those games?* + +*** Puzzle Solution + +I decided to make the code for this as readable as possible. +I've split the process into multiple parts: + +**** Record Splitting + +Here, I am turning the input data into an alist with the game number as key, and the draws as value +of the entries, by using irregex matches. + +#+NAME: day2-part1-record-splitting +#+begin_src scheme + ;; Records + (define record-pattern + '(: bol + "Game " + (submatch-named game-no (+ (/ #\0 #\9))) + ":" + (submatch-named draws (*? any)) + eol)) + + (define (record-kons from-index match seed) + (cons + (cons (string->number (irregex-match-substring match 'game-no)) + (draws-fold (irregex-match-substring match 'draws))) + seed)) + + (define (record-fold input) + (irregex-fold record-pattern record-kons '() input)) #+end_src -#+RESULTS: day1-solution-1 -: 54159 +**** Draw Splitting + +Next, as already called inside ~record-kons~, the list of draws has to be split and processed into +individual draws. Here, I simply split them. + +#+NAME: day2-part1-draw-splitting +#+begin_src scheme + ;; Draws + (define draws-pattern + '(: " " (* (~ #\;)))) + + (define (draws-kons from-index match seed) + (cons + (draw-fold (irregex-match-substring match)) + seed)) + + (define (draws-fold line) + (irregex-fold draws-pattern draws-kons '() line)) +#+end_src + +**** Draw Processing + +And as the last pre-processing step, I take apart the individual draws, and assign each amount to +its respective colour keyword. + +#+NAME: day2-part1-draw-processing +#+begin_src scheme + ;; Draw + (define draw-pattern + '(: " " + (submatch-named amount (+ (/ #\0 #\9))) + " " + (submatch-named colour (or "red" "green" "blue")) + (? ","))) + + (define (draw-kons from-index match seed) + (cons + (cons (string->keyword (irregex-match-substring match 'colour)) + (string->number (irregex-match-substring match 'amount))) + seed)) + + (define (draw-fold draw) + (irregex-fold draw-pattern draw-kons '() draw)) + #+end_src + +**** Main Program + +I check the possibility of a game by folding over its draws, starting with a ~#t~ (true) value; +basically, it is nothing more than a recursive ~and~ statement. + +#+NAME: day2-part1-success-check +#+begin_src scheme + ;; Game success check + (define (game-possible? draws) + (foldl (lambda (seed draw) + (and seed + (>= 12 (alist-ref #:red draw eqv? 0)) + (>= 13 (alist-ref #:green draw eqv? 0)) + (>= 14 (alist-ref #:blue draw eqv? 0)))) + #t draws)) + #+end_src + + Then, I put everything together in a main function, preprocessing the input and summing up all game + ids for which ~game-possible?~ returns ~#t~. + +#+NAME: day2-part1-main-function +#+begin_src scheme + ;; Main function + (define (sum-of-valid-games input) + (let ((games (record-fold input))) + (foldl + (lambda (seed game) + (let ((game-id (car game)) + (draws (cdr game))) + (if (game-possible? draws) + (+ seed game-id) + seed))) + 0 games))) + #+end_src + + And now, everything can be put together: + +#+NAME: day2-part1-solution + #+begin_src scheme :noweb no-export + (import (chicken string) + (chicken keyword) + (chicken irregex)) + + <> + <> + <> + <> + <> +#+end_src + +#+RESULTS: day2-part1-solution +: 2406 ** Part Two -*** Quest +To be done... -Your calculation isn't quite right. It looks like some of the digits are actually *spelled out with -letters*: =one=, =two=, =three=, =four=, =five=, =six=, =seven=, =eight=, and =nine= *also* count as -valid "digits". - -Equipped with this new information, you now need to find the real first and last digit on each -line. For example: +** Puzzle Input +#+NAME: day2-input #+begin_example -two1nine -eightwothree -abcone2threexyz -xtwone3four -4nineeightseven2 -zoneight234 -7pqrstsixteen +Game 1: 2 blue, 4 green; 7 blue, 1 red, 14 green; 5 blue, 13 green, 1 red; 1 red, 7 blue, 11 green +Game 2: 6 blue, 3 green; 4 red, 1 green, 7 blue; 2 green +Game 3: 4 blue, 3 red; 2 blue, 4 red, 7 green; 1 blue, 6 red, 7 green; 5 green, 10 blue; 9 green, 1 blue, 6 red; 8 blue, 1 red, 12 green +Game 4: 15 blue, 4 green, 5 red; 2 red, 2 green, 5 blue; 3 green, 13 blue; 17 blue, 1 green, 5 red +Game 5: 11 green, 4 red, 3 blue; 8 blue, 6 green; 8 green, 2 red, 9 blue; 4 red, 16 blue; 8 blue, 10 red, 6 green; 9 blue, 3 red, 10 green +Game 6: 4 green, 9 red, 2 blue; 7 red, 2 green, 15 blue; 13 red, 2 green, 6 blue; 5 green, 7 blue, 6 red; 19 red, 15 blue, 4 green +Game 7: 12 blue, 5 red; 5 green, 6 blue; 5 red, 15 blue; 5 blue, 5 red, 5 green; 1 green, 11 blue, 2 red +Game 8: 6 red, 11 green; 5 red, 2 blue, 7 green; 7 red, 6 green +Game 9: 5 red, 1 blue, 11 green; 4 green, 1 blue; 8 green, 2 red; 1 green, 2 red, 2 blue; 3 green, 2 red +Game 10: 7 blue, 4 red, 11 green; 13 green, 1 red, 1 blue; 7 blue, 6 green +Game 11: 4 blue, 7 red, 2 green; 1 green, 14 red, 3 blue; 2 green, 5 red, 3 blue +Game 12: 6 green, 6 blue, 1 red; 1 green, 3 red, 2 blue; 2 blue, 6 red, 7 green +Game 13: 6 red, 10 green, 13 blue; 3 red, 12 green, 9 blue; 11 blue, 1 green; 4 red, 3 blue, 13 green; 12 green, 10 blue, 6 red; 13 blue, 3 green, 3 red +Game 14: 8 green, 1 blue, 17 red; 7 green, 11 blue, 19 red; 19 red, 9 blue, 2 green; 8 green, 20 red, 12 blue; 16 red, 3 green, 11 blue +Game 15: 3 red, 1 green, 5 blue; 9 blue, 4 green; 6 blue, 5 green, 9 red +Game 16: 13 blue, 1 red; 2 blue, 2 green; 1 green; 10 blue, 8 red; 4 red, 3 green, 9 blue +Game 17: 10 blue, 2 red; 3 green, 4 red; 6 blue, 1 red, 6 green; 5 green, 7 blue, 5 red +Game 18: 3 red, 1 green; 2 red, 5 blue; 5 blue, 2 red +Game 19: 7 green, 4 blue, 1 red; 1 green, 4 blue, 4 red; 6 blue, 8 green; 4 green, 2 blue, 1 red; 1 red, 1 blue, 2 green +Game 20: 13 green, 1 red, 1 blue; 12 green, 1 blue; 5 green, 1 blue, 2 red; 16 green, 3 red; 2 red, 9 green +Game 21: 8 red, 2 green, 2 blue; 5 red, 3 blue; 2 blue, 5 red, 2 green; 7 blue +Game 22: 9 red, 12 blue, 7 green; 7 red, 13 blue, 4 green; 9 blue, 13 red, 1 green; 3 blue, 4 red, 5 green +Game 23: 7 green, 12 red; 6 red, 7 green, 4 blue; 1 blue, 11 red, 5 green; 4 green, 2 blue, 6 red; 12 green, 6 red, 3 blue +Game 24: 11 red, 4 blue; 9 blue, 6 green, 17 red; 8 green, 2 red; 16 blue, 6 red, 2 green +Game 25: 7 red, 4 blue; 7 blue, 4 green; 10 blue, 4 red, 2 green; 6 green, 4 blue, 1 red; 10 blue, 2 red, 4 green +Game 26: 7 green, 8 red, 6 blue; 5 red, 3 green, 2 blue; 13 blue, 6 green, 5 red; 10 blue, 4 red, 8 green; 2 red, 2 blue, 1 green; 8 blue, 1 green, 4 red +Game 27: 7 green, 3 blue, 13 red; 1 green, 17 red, 1 blue; 16 red, 3 blue, 3 green; 5 green, 3 red, 5 blue; 13 red, 4 green, 8 blue; 6 blue, 2 green, 15 red +Game 28: 8 blue, 5 red, 18 green; 1 green, 6 red; 7 blue, 18 green, 5 red; 16 green, 3 red, 7 blue; 6 blue, 18 green; 8 blue, 8 green, 7 red +Game 29: 4 blue, 1 red; 6 blue, 1 red; 17 blue, 1 green +Game 30: 1 red, 2 green, 5 blue; 2 blue, 7 green, 6 red; 11 blue, 4 red, 2 green; 5 green, 6 blue, 4 red; 5 red, 8 blue, 7 green +Game 31: 10 green, 9 blue; 5 green, 9 blue, 1 red; 1 red, 8 blue +Game 32: 3 red, 5 green; 5 red, 5 blue, 14 green; 2 red, 2 green; 11 green, 3 red, 5 blue +Game 33: 7 blue, 10 green, 8 red; 18 blue, 15 green, 4 red; 6 red, 1 green; 18 blue, 8 red, 11 green +Game 34: 3 green; 2 red, 5 green; 5 blue, 3 green; 3 blue, 5 green, 1 red +Game 35: 1 blue, 5 green, 6 red; 3 green, 2 red, 3 blue; 4 red, 9 blue, 3 green; 1 green, 12 blue, 1 red +Game 36: 14 green, 3 blue, 16 red; 1 green, 2 red, 4 blue; 4 blue, 9 green, 18 red; 4 blue, 4 green, 14 red; 4 blue, 11 green +Game 37: 7 green, 2 blue, 3 red; 8 green, 9 red, 2 blue; 4 blue, 15 green, 18 red +Game 38: 11 red, 1 blue, 6 green; 6 green, 2 blue, 1 red; 6 blue, 17 red, 2 green; 17 red, 9 blue, 3 green; 7 red, 7 blue, 3 green; 3 green, 7 red, 7 blue +Game 39: 1 blue, 2 green; 1 blue, 2 green, 7 red; 1 blue, 4 red, 2 green; 1 blue, 12 red +Game 40: 1 blue, 4 red, 15 green; 12 green, 1 blue, 15 red; 15 red, 8 green +Game 41: 5 blue, 5 green, 1 red; 9 red, 8 green, 9 blue; 10 red, 10 blue, 4 green; 3 blue, 17 red, 3 green; 3 blue, 4 red, 2 green +Game 42: 2 blue, 10 red, 17 green; 6 red, 10 green, 10 blue; 3 blue, 6 green, 8 red; 9 green, 2 blue, 8 red; 13 green, 5 blue; 4 red, 18 green, 11 blue +Game 43: 8 red, 3 blue, 6 green; 2 red, 8 green, 10 blue; 5 blue, 9 red, 9 green; 1 green, 15 red, 8 blue +Game 44: 11 green, 19 red, 14 blue; 1 red, 19 green, 9 blue; 7 green, 8 red, 10 blue; 14 green, 8 blue, 15 red; 7 green, 3 red, 2 blue +Game 45: 4 green, 9 blue, 4 red; 7 blue, 13 green, 2 red; 12 green, 10 blue, 10 red +Game 46: 10 red, 2 green, 1 blue; 10 red, 10 green, 1 blue; 1 blue, 13 green; 1 blue, 2 green, 10 red; 1 blue, 7 red, 11 green; 10 red, 5 green +Game 47: 3 blue, 2 green, 12 red; 5 blue, 7 red; 5 green, 14 red; 12 red, 7 green, 5 blue +Game 48: 5 red, 1 blue, 3 green; 7 red, 8 green, 4 blue; 4 blue, 5 green, 17 red; 1 blue, 12 red +Game 49: 2 green, 7 red, 1 blue; 11 green, 5 red; 4 red, 1 blue, 1 green; 11 green, 1 blue, 7 red +Game 50: 10 red, 3 blue, 6 green; 1 blue, 5 red, 3 green; 6 blue, 11 red, 12 green; 10 green +Game 51: 18 blue, 1 green, 1 red; 15 blue; 13 blue, 11 green, 4 red; 8 red, 1 green, 18 blue; 10 green, 7 blue, 8 red +Game 52: 13 green, 15 blue; 6 blue, 4 red, 8 green; 6 red, 13 green, 11 blue; 2 red, 7 green, 13 blue; 12 green, 2 blue, 3 red; 6 red, 11 green, 1 blue +Game 53: 2 red, 2 green; 3 green, 1 blue, 1 red; 1 blue, 4 green, 7 red; 4 red, 1 blue; 4 red, 5 green, 2 blue +Game 54: 8 blue, 2 red, 5 green; 6 green, 2 blue, 3 red; 1 blue, 8 green, 4 red +Game 55: 6 green, 6 blue, 3 red; 13 green, 1 red; 2 blue, 1 red, 1 green; 14 green, 1 blue, 1 red; 1 blue, 2 red, 9 green; 9 green, 2 blue, 4 red +Game 56: 4 green, 6 blue, 1 red; 5 red, 3 blue; 6 red, 1 blue; 9 green, 5 blue, 7 red +Game 57: 5 red, 5 green, 8 blue; 11 red, 3 blue, 8 green; 7 green, 9 blue, 11 red; 3 green, 2 blue, 12 red +Game 58: 3 green, 3 red; 4 red, 1 green; 1 red, 6 green; 5 green; 5 red, 1 blue, 3 green; 3 red, 1 blue +Game 59: 2 green, 2 blue; 7 red, 18 green; 2 blue, 7 red, 16 green; 7 red, 10 green +Game 60: 3 blue, 4 red; 4 blue, 3 red, 3 green; 16 green +Game 61: 1 blue, 2 red, 8 green; 9 blue, 4 green, 12 red; 10 green, 2 red; 5 blue, 11 red, 1 green; 10 green, 3 blue, 8 red; 5 red, 2 green +Game 62: 15 red, 10 blue, 7 green; 4 blue, 9 red, 4 green; 4 red, 2 blue, 2 green; 11 green, 2 red; 8 blue, 2 green; 2 green, 8 red, 8 blue +Game 63: 2 green, 3 blue, 1 red; 7 blue, 5 red; 7 blue +Game 64: 3 green, 5 blue, 6 red; 9 green, 4 red; 13 red, 1 blue, 5 green; 4 blue, 13 red, 8 green +Game 65: 7 green, 1 blue; 1 red, 14 blue, 4 green; 8 blue, 6 red; 14 green, 4 red +Game 66: 6 red, 11 green, 7 blue; 1 blue, 6 red; 13 red, 7 blue, 3 green; 8 red, 6 blue, 15 green; 7 green, 6 blue, 4 red; 4 red, 1 blue, 20 green +Game 67: 4 blue, 9 green; 15 red, 16 green, 3 blue; 1 green, 14 red, 3 blue; 3 red, 2 blue, 3 green; 4 green, 3 blue, 12 red +Game 68: 5 green, 3 blue, 2 red; 4 green, 8 blue, 11 red; 6 red, 6 blue, 4 green; 8 red, 5 blue, 7 green; 6 blue, 6 green, 11 red; 2 blue, 3 green, 3 red +Game 69: 15 blue, 16 green, 5 red; 10 blue, 3 red, 13 green; 4 red, 5 blue, 2 green; 1 red; 11 green, 5 red, 15 blue +Game 70: 8 red, 9 blue, 12 green; 3 red, 2 blue, 14 green; 10 blue, 1 red, 18 green; 1 blue, 7 red, 16 green; 3 green, 4 red, 16 blue; 10 green, 6 red +Game 71: 12 blue, 7 red, 16 green; 2 red, 9 blue, 15 green; 1 red, 11 blue, 11 green; 15 red, 16 blue, 2 green +Game 72: 1 blue, 11 red, 6 green; 1 red, 2 blue, 5 green; 4 green, 2 red; 2 green, 12 red +Game 73: 1 blue, 1 red; 2 red, 4 blue, 2 green; 1 blue, 2 green, 10 red; 8 red +Game 74: 12 red, 1 green, 4 blue; 1 red, 5 blue, 1 green; 11 green, 16 red, 7 blue; 7 red, 1 blue, 1 green; 12 red, 11 green, 12 blue; 11 green, 6 red +Game 75: 12 green, 8 red, 3 blue; 7 red, 10 green; 1 green, 7 blue, 1 red +Game 76: 4 green, 1 red, 3 blue; 7 blue, 3 green, 3 red; 4 blue, 2 red, 3 green; 4 blue, 1 green +Game 77: 2 green, 12 blue, 10 red; 5 blue, 7 red; 2 red, 6 green; 1 blue, 2 red, 6 green +Game 78: 2 green, 4 blue, 4 red; 8 green, 10 red, 10 blue; 5 green, 8 blue, 10 red; 6 green, 2 red +Game 79: 3 green, 2 blue, 11 red; 8 red, 11 green, 1 blue; 1 blue, 16 red; 5 red, 7 green, 16 blue; 12 red, 7 green, 9 blue; 4 red, 20 blue, 12 green +Game 80: 3 red, 5 green; 2 blue, 4 green; 2 red, 12 green, 4 blue; 10 green, 1 blue, 1 red; 4 blue, 3 red +Game 81: 1 blue, 1 green, 1 red; 5 green, 3 red, 1 blue; 1 blue, 6 green; 1 green; 1 red, 5 green, 2 blue; 1 blue, 1 red, 3 green +Game 82: 7 green, 10 blue, 3 red; 10 green, 12 red, 12 blue; 18 red, 8 green, 14 blue; 3 red, 3 green, 10 blue; 3 red, 1 blue, 5 green; 1 green, 8 blue +Game 83: 9 red, 3 blue; 14 blue, 8 red, 3 green; 14 blue, 5 green, 4 red +Game 84: 2 blue, 3 red, 6 green; 11 green, 2 red, 1 blue; 17 green, 3 blue, 3 red; 1 red, 1 blue; 1 red, 2 blue, 19 green +Game 85: 3 green, 2 blue, 3 red; 4 red, 5 blue, 8 green; 15 green, 1 red, 9 blue; 12 green, 3 blue, 2 red +Game 86: 15 green, 7 red, 10 blue; 2 blue, 2 red, 1 green; 4 red, 1 green, 9 blue; 7 red, 14 blue, 5 green +Game 87: 1 green, 3 blue, 1 red; 2 blue, 1 green; 1 blue, 2 green, 1 red +Game 88: 2 green, 6 blue, 5 red; 5 blue, 2 red; 3 red, 13 blue; 9 blue, 10 red, 1 green +Game 89: 6 green, 10 red, 2 blue; 7 red, 1 blue, 8 green; 4 blue, 3 red, 5 green; 4 green, 4 blue, 10 red +Game 90: 8 red, 7 blue; 4 green, 3 red, 1 blue; 5 blue, 2 green +Game 91: 15 green, 14 red; 12 red, 16 green, 2 blue; 8 red, 10 green; 1 green, 6 red; 8 green, 12 red +Game 92: 4 blue, 4 green, 9 red; 1 blue, 17 green; 1 green; 15 green, 3 blue, 12 red; 11 red, 1 blue, 7 green; 7 blue, 13 red, 8 green +Game 93: 10 blue, 12 red; 10 blue, 11 green, 8 red; 1 blue, 11 green, 7 red; 10 blue, 15 red, 5 green; 11 red, 8 green, 9 blue; 10 green, 3 blue +Game 94: 1 blue, 2 red; 4 red, 1 green, 5 blue; 3 red, 2 green; 2 green, 2 blue; 1 red, 5 blue, 1 green; 4 blue, 1 red, 2 green +Game 95: 1 red, 1 blue, 3 green; 2 green, 6 blue; 1 green, 13 blue, 1 red; 3 green, 15 blue +Game 96: 16 blue, 7 green, 5 red; 5 green, 5 blue, 6 red; 3 green, 17 blue, 10 red; 13 blue, 2 red, 1 green +Game 97: 12 red; 1 blue, 6 red, 1 green; 9 red, 2 blue, 1 green; 1 green, 2 blue, 1 red; 15 red, 1 blue; 1 blue +Game 98: 11 red, 6 blue, 13 green; 4 blue, 2 red, 12 green; 2 blue, 8 green, 10 red +Game 99: 2 red, 1 blue; 4 green; 7 green, 1 blue, 1 red; 5 green, 2 red; 1 blue, 2 red, 9 green; 2 green, 3 red +Game 100: 7 red, 11 blue; 10 red, 5 blue, 1 green; 7 red, 1 green, 13 blue; 9 red; 9 red, 19 blue; 9 red, 9 blue #+end_example - -In this example, the calibration values are =29=, =83=, =13=, =24=, =42=, =14=, and =76=. Adding -these together produces =281=. - -*What is the sum of all of the calibration values?* - -*** Puzzle Solution - -#+NAME: day1-solution-2 -#+begin_src scheme - (import (chicken string) - (chicken irregex)) - - (define (extract-digits input-string) - (irregex-extract '(or (/ #\0 #\9) - "one" - "two" - "three" - "four" - "five" - "six" - "seven" - "eight" - "nine" - ; Duplicates - "twone" - "eightwo" - "nineight" - "eighthree" - "threeight" - "fiveight" - "oneight" - "sevenine") - input-string)) - - (define (translate-code digit) - (case (string->symbol digit) - ((|0|) "0") - ((|1| one) "1") - ((|2| two) "2") - ((|3| three) "3") - ((|4| four) "4") - ((|5| five) "5") - ((|6| six) "6") - ((|7| seven) "7") - ((|8| eight) "8") - ((|9| nine) "9") - ; Again, duplicates - ((twone) "21") - ((eightwo) "82") - ((nineight) "98") - ((eighthree) "83") - ((threeight) "38") - ((fiveight) "58") - ((oneight) "18") - ((sevenine) "79") - )) - - (let ((lines (string-split input "\n"))) - (foldl + 0 - (map - (lambda (line) - (let ((digits (string->list - (foldl string-append "" - (map translate-code (extract-digits line)))))) - (if (= 0 (length digits)) - 0 - (let ((first-digit (car digits)) - (last-digit (car (reverse digits)))) - (string->number (string first-digit last-digit)))))) - lines))) -#+end_src - -#+RESULTS: day1-solution-2 -: 53866