2023 - Day 1
This commit is contained in:
44
2023/01/PART1.md
Normal file
44
2023/01/PART1.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
--- Day 1: Trebuchet?! ---
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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!
|
||||||
|
|
||||||
|
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?
|
||||||
23
2023/01/PART2.md
Normal file
23
2023/01/PART2.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
--- Part Two ---
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
```
|
||||||
|
two1nine
|
||||||
|
eightwothree
|
||||||
|
abcone2threexyz
|
||||||
|
xtwone3four
|
||||||
|
4nineeightseven2
|
||||||
|
zoneight234
|
||||||
|
7pqrstsixteen
|
||||||
|
```
|
||||||
|
|
||||||
|
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?
|
||||||
1000
2023/01/input.txt
Normal file
1000
2023/01/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
4
2023/01/sample.txt
Normal file
4
2023/01/sample.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
1abc2
|
||||||
|
pqr3stu8vwx
|
||||||
|
a1b2c3d4e5f
|
||||||
|
treb7uchet
|
||||||
7
2023/01/sample2.txt
Normal file
7
2023/01/sample2.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
two1nine
|
||||||
|
eightwothree
|
||||||
|
abcone2threexyz
|
||||||
|
xtwone3four
|
||||||
|
4nineeightseven2
|
||||||
|
zoneight234
|
||||||
|
7pqrstsixteen
|
||||||
63
2023/01/solution.ts
Normal file
63
2023/01/solution.ts
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
const sample = await Deno.readTextFile("sample.txt");
|
||||||
|
const sample2 = await Deno.readTextFile("sample2.txt");
|
||||||
|
const input = await Deno.readTextFile("input.txt");
|
||||||
|
|
||||||
|
const wordsToNumbers: Record<string, number> = {
|
||||||
|
one: 1,
|
||||||
|
two: 2,
|
||||||
|
three: 3,
|
||||||
|
four: 4,
|
||||||
|
five: 5,
|
||||||
|
six: 6,
|
||||||
|
seven: 7,
|
||||||
|
eight: 8,
|
||||||
|
nine: 9,
|
||||||
|
};
|
||||||
|
|
||||||
|
const getNumberStringsFromString = (data: string): string[] =>
|
||||||
|
data.match(/(\d)/g) ?? [];
|
||||||
|
|
||||||
|
const getNumberStringsAndNumberWordsFromString = (data: string): string[] =>
|
||||||
|
Array.from(
|
||||||
|
data.matchAll(
|
||||||
|
new RegExp(`(?=(\\d|${Object.keys(wordsToNumbers).join("|")}))`, "gi"),
|
||||||
|
),
|
||||||
|
(x) => x[1],
|
||||||
|
);
|
||||||
|
|
||||||
|
const replaceWordNumbersToNumbers = (data: string): string =>
|
||||||
|
data.replace(
|
||||||
|
new RegExp(Object.keys(wordsToNumbers).join("|"), "gi"),
|
||||||
|
(match) => String(wordsToNumbers[match]),
|
||||||
|
);
|
||||||
|
|
||||||
|
const solvePart1 = (data: string): number =>
|
||||||
|
data
|
||||||
|
.split("\n")
|
||||||
|
.filter(Boolean)
|
||||||
|
.map(getNumberStringsFromString)
|
||||||
|
.map((numbers) => [
|
||||||
|
numbers[0],
|
||||||
|
numbers[numbers.length - 1],
|
||||||
|
])
|
||||||
|
.map(([a, b]) => parseFloat(a + b))
|
||||||
|
.reduce((s, v) => s + v);
|
||||||
|
|
||||||
|
console.log("Sample:", solvePart1(sample)); // 142
|
||||||
|
console.log("Input", solvePart1(input)); // 55090
|
||||||
|
|
||||||
|
const solvePart2 = (data: string): number =>
|
||||||
|
data
|
||||||
|
.split("\n")
|
||||||
|
.filter(Boolean)
|
||||||
|
.map(getNumberStringsAndNumberWordsFromString)
|
||||||
|
.map((numbers) => numbers.map(replaceWordNumbersToNumbers))
|
||||||
|
.map((numbers) => [
|
||||||
|
numbers[0],
|
||||||
|
numbers[numbers.length - 1],
|
||||||
|
])
|
||||||
|
.map(([a, b]) => parseFloat(a + b))
|
||||||
|
.reduce((s, v) => s + v);
|
||||||
|
|
||||||
|
console.log("Sample2:", solvePart2(sample2)); //281
|
||||||
|
console.log("Input", solvePart2(input)); //54845
|
||||||
Reference in New Issue
Block a user