Solution of part 2
This commit is contained in:
parent
5a842ea86f
commit
126aad4e12
130
chicken.org
130
chicken.org
|
@ -1,35 +1,39 @@
|
|||
# -*- geiser-scheme-implementation: chicken -*-
|
||||
#+TITLE: Advent Of Code with Chicken Scheme
|
||||
#+AUTHOR: Daniel Ziltener
|
||||
#+PROPERTY: header-args:scheme :session *chicken*
|
||||
|
||||
* Helpers
|
||||
|
||||
* Day 1: Trebuchet?!
|
||||
|
||||
** Part One
|
||||
|
||||
Something is wrong with global snow production, and you've been selected to take a look. The Elves
|
||||
have even given you a map; on it, they've used stars to mark the top fifty locations that are likely
|
||||
to be having problems.
|
||||
|
||||
You've been doing this long enough to know that to restore snow operations, you need to check all
|
||||
fifty stars by December 25th.
|
||||
*fifty stars* by December 25th.
|
||||
|
||||
Collect stars by solving puzzles. Two puzzles will be made available on each day in the Advent
|
||||
calendar; the second puzzle is unlocked when you complete the first. Each puzzle grants one
|
||||
star. Good luck!
|
||||
calendar; the second puzzle is unlocked when you complete the first. Each puzzle grants *one
|
||||
star*. Good luck!
|
||||
|
||||
You try to ask why they can't just use a weather machine ("not powerful enough") and where they're
|
||||
You try to ask why they can't just use a [[https://adventofcode.com/2015/day/1][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
|
||||
realize that the Elves are already loading you into a [[https://en.wikipedia.org/wiki/Trebuchet][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
|
||||
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.
|
||||
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:
|
||||
|
||||
|
@ -43,11 +47,11 @@ 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?
|
||||
Consider your entire calibration document. *What is the sum of all of the calibration values?*
|
||||
|
||||
** Puzzle input
|
||||
*** Puzzle Input
|
||||
|
||||
Jump to [[id:day1-puzzle-solution][the solution]].
|
||||
Jump to [[#headline-5][the solution]].
|
||||
|
||||
#+NAME: day1-input
|
||||
#+begin_example
|
||||
|
@ -1053,12 +1057,12 @@ eightbqfhnmvqsoneninezbrzcqkz4ftv
|
|||
1eightcrcjcbdthreebscfpvznqfrj6
|
||||
#+end_example
|
||||
|
||||
** Puzzle solution
|
||||
*** Puzzle Solution
|
||||
:PROPERTIES:
|
||||
:ID: day1-puzzle-solution
|
||||
:ID: day1-puzzle-solution-1
|
||||
:END:
|
||||
|
||||
#+NAME: day1-solution
|
||||
#+NAME: day1-solution-1
|
||||
#+begin_src scheme :var input=day1-input
|
||||
(import (chicken string)
|
||||
(chicken irregex))
|
||||
|
@ -1075,5 +1079,99 @@ eightbqfhnmvqsoneninezbrzcqkz4ftv
|
|||
lines)))
|
||||
#+end_src
|
||||
|
||||
#+RESULTS: day1-solution
|
||||
#+RESULTS: day1-solution-1
|
||||
: 54159
|
||||
|
||||
** Part Two
|
||||
|
||||
*** Puzzle Solution
|
||||
|
||||
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?*
|
||||
|
||||
#+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
|
||||
|
|
Loading…
Reference in New Issue