Skip to content

Commit 9a4ae23

Browse files
author
Matthew Judy
committed
Complete challenge 2023-01.
1 parent 11db3ce commit 9a4ae23

File tree

1 file changed

+108
-60
lines changed

1 file changed

+108
-60
lines changed

Sources/2023/01/Trebuchet.swift

Lines changed: 108 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -10,80 +10,128 @@ import Foundation
1010
import Shared
1111

1212

13-
/**
14-
Day 1 : Trebuchet?!
15-
16-
# Part One
17-
18-
Something is wrong with global snow production, and you've been selected to
19-
take a look. The Elves have even given you a map; on it, they've used stars
20-
to mark the top fifty locations that are likely to be having problems.
21-
22-
You've been doing this long enough to know that to restore snow operations,
23-
you need to check all **fifty stars** by December 25th.
24-
25-
Collect stars by solving puzzles. Two puzzles will be made available on each
26-
day in the Advent calendar; the second puzzle is unlocked when you complete
27-
the first. Each puzzle grants **one star**. Good luck!
28-
29-
You try to ask why they can't just use a weather machine ("not powerful
30-
enough") and where they're even sending you ("the sky") and why your map looks
31-
mostly blank ("you sure ask a lot of questions") and hang on did you just say
32-
the sky ("of course, where do you think snow comes from") when you realize
33-
that the Elves are already loading you into a trebuchet ("please hold still,
34-
we need to strap you in").
35-
36-
As they're making the final adjustments, they discover that their calibration
37-
document (your puzzle input) has been **amended** by a very young Elf who was
38-
apparently just excited to show off her art skills. Consequently, the Elves
39-
are having trouble reading the values on the document.
40-
41-
The newly-improved calibration document consists of lines of text; each line
42-
originally contained a specific **calibration value** that the Elves now need
43-
to recover. On each line, the calibration value can be found by combining
44-
the **first digit** and the **last digit** (in that order) to form a single
45-
**two-digit number**.
46-
47-
For example:
48-
49-
```
50-
1abc2
51-
pqr3stu8vwx
52-
a1b2c3d4e5f
53-
treb7uchet
54-
```
55-
56-
In this example, the calibration values of these four lines are `12`, `38`,
57-
`15`, and `77`. Adding these together produces `142`.
58-
59-
Consider your entire calibration document. **What is the sum of all of the
60-
calibration values?**
61-
*/
13+
/// Day 1 : Trebuchet?!
14+
///
15+
/// # Part One
16+
///
17+
/// Something is wrong with global snow production, and you've been selected to
18+
/// take a look. The Elves have even given you a map; on it, they've used stars
19+
/// to mark the top fifty locations that are likely to be having problems.
20+
///
21+
/// You've been doing this long enough to know that to restore snow operations,
22+
/// you need to check all **fifty stars** by December 25th.
23+
///
24+
/// Collect stars by solving puzzles. Two puzzles will be made available on each
25+
/// day in the Advent calendar; the second puzzle is unlocked when you complete
26+
/// the first. Each puzzle grants **one star**. Good luck!
27+
///
28+
/// You try to ask why they can't just use a weather machine ("not powerful
29+
/// enough") and where they're even sending you ("the sky") and why your map
30+
/// looks mostly blank ("you sure ask a lot of questions") and hang on did you
31+
/// just say, "the sky" ("of course, where do you think snow comes from") when
32+
/// you realize that the Elves are already loading you into a trebuchet ("please
33+
/// hold still, we need to strap you in").
34+
///
35+
/// As they're making the final adjustments, they discover that their
36+
/// calibration document (your puzzle input) has been **amended** by a very
37+
/// young Elf who was apparently just excited to show off her art skills.
38+
/// Consequently, the Elves are having trouble reading the values on
39+
/// the document.
40+
///
41+
/// The newly-improved calibration document consists of lines of text; each line
42+
/// originally contained a specific **calibration value** that the Elves now
43+
/// need to recover. On each line, the calibration value can be found by
44+
/// combining the **first digit** and the **last digit** (in that order) to form
45+
/// a single **two-digit number**.
46+
///
47+
/// For example:
48+
///
49+
/// ```
50+
/// 1abc2
51+
/// pqr3stu8vwx
52+
/// a1b2c3d4e5f
53+
/// treb7uchet
54+
/// ```
55+
///
56+
/// In this example, the calibration values of these four lines are `12`, `38`,
57+
/// `15`, and `77`. Adding these together produces **`142`**.
58+
///
59+
/// Consider your entire calibration document. **What is the sum of all of the
60+
/// calibration values?**
61+
///
62+
/// # Part Two
63+
///
64+
/// Your calculation isn't quite right. It looks like some of the digits are
65+
/// actually **spelled out with letters**: `one`, `two`, `three`, `four`,
66+
/// `five`, `six`, `seven`, `eight`, and `nine` **also** count as
67+
/// valid "digits".
68+
///
69+
/// Equipped with this new information, you now need to find the real first and
70+
/// last digit on each line. For example:
71+
///
72+
/// ```
73+
/// two1nine
74+
/// eightwothree
75+
/// abcone2threexyz
76+
/// xtwone3four
77+
/// 4nineeightseven2
78+
/// zoneight234
79+
/// 7pqrstsixteen
80+
/// ```
81+
///
82+
/// In this example, the calibration values are `29`, `83`, `13`, `24`, `42`,
83+
/// `14`, and `76`. Adding these together produces **`281`**.
84+
///
85+
/// **What is the sum of all of the calibration values?**
6286
@main
6387
struct Trebuchet: AsyncParsableCommand
6488
{
65-
/// Enumeration for argument which activates "Part Two" behavior
66-
enum Mode: String, ExpressibleByArgument, CaseIterable
67-
{
68-
case modeA
69-
case modeB
70-
}
71-
72-
@Option(help: "<#Argument used to activate “Part Two” behavior.#>")
73-
var mode: Mode
89+
@Flag(help: "Search for both cardinal values ('one', 'two', ...) and integers.")
90+
var includeCardinals: Bool = false
7491
}
7592

7693

7794
// MARK: - Command Execution
7895

7996
extension Trebuchet
8097
{
98+
static let cardinalMapping: [(cardinalString: String, arabicString: String, integerString: Int)] = [
99+
("zero", "0", 0),
100+
("one", "1", 1),
101+
("two", "2", 2),
102+
("three", "3", 3),
103+
("four", "4", 4),
104+
("five", "5", 5),
105+
("six", "6", 6),
106+
("seven", "7", 7),
107+
("eight", "8", 8),
108+
("nine", "9", 9),
109+
]
110+
111+
81112
mutating func run() async throws
82113
{
83-
while let inputLine = readLine()
114+
let input: AsyncLineSequence = FileHandle.standardInput.bytes.lines // URL.homeDirectory.appending(path: "Desktop/input.txt").lines
115+
let calibrationSum: Int = try await input.reduce(0)
84116
{
85-
print("\(inputLine)")
117+
currentSum, inputLine in
118+
119+
let integerIndices: [(index: String.Index, intValue: Int)] = Trebuchet.cardinalMapping.reduce(into: [])
120+
{
121+
result, mapping in
122+
result.append(contentsOf: inputLine.indices(of: mapping.arabicString).map { ($0, mapping.integerString) })
123+
124+
if (self.includeCardinals)
125+
{
126+
result.append(contentsOf: inputLine.indices(of: mapping.cardinalString).map { ($0, mapping.integerString) })
127+
}
128+
}
129+
.sorted { $0.index < $1.index }
130+
131+
return (currentSum + (integerIndices.first!.intValue * 10) + integerIndices.last!.intValue)
86132
}
133+
134+
print(calibrationSum)
87135
}
88136
}
89137

0 commit comments

Comments
 (0)