Skip to content

Commit 40fc6ac

Browse files
committed
Solved 2023 day 8 in Swift
1 parent 78a8046 commit 40fc6ac

9 files changed

Lines changed: 1911 additions & 0 deletions

File tree

.vscode/launch.json

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,66 @@
451451
"name": "Release day07b (2023\\swift\\07)",
452452
"program": "${workspaceFolder:adventofcode}\\2023\\swift\\07\\.build\\release\\day07b.exe",
453453
"preLaunchTask": "swift: Build Release day07b (2023\\swift\\07)"
454+
},
455+
{
456+
"type": "swift-lldb",
457+
"request": "launch",
458+
"sourceLanguages": [
459+
"swift"
460+
],
461+
"args": [
462+
"--input",
463+
"input.txt"
464+
],
465+
"cwd": "${workspaceFolder:adventofcode}\\2023\\swift\\08",
466+
"name": "Debug day08 (2023\\swift\\08)",
467+
"program": "${workspaceFolder:adventofcode}\\2023\\swift\\08\\.build\\debug\\day08.exe",
468+
"preLaunchTask": "swift: Build Debug day08 (2023\\swift\\08)"
469+
},
470+
{
471+
"type": "swift-lldb",
472+
"request": "launch",
473+
"sourceLanguages": [
474+
"swift"
475+
],
476+
"args": [
477+
"--input",
478+
"input.txt"
479+
],
480+
"cwd": "${workspaceFolder:adventofcode}\\2023\\swift\\08",
481+
"name": "Release day08 (2023\\swift\\08)",
482+
"program": "${workspaceFolder:adventofcode}\\2023\\swift\\08\\.build\\release\\day08.exe",
483+
"preLaunchTask": "swift: Build Release day08 (2023\\swift\\08)"
484+
},
485+
{
486+
"type": "swift-lldb",
487+
"request": "launch",
488+
"sourceLanguages": [
489+
"swift"
490+
],
491+
"args": [
492+
"--input",
493+
"input.txt"
494+
],
495+
"cwd": "${workspaceFolder:adventofcode}\\2023\\swift\\08",
496+
"name": "Debug day08b (2023\\swift\\08)",
497+
"program": "${workspaceFolder:adventofcode}\\2023\\swift\\08\\.build\\debug\\day08b.exe",
498+
"preLaunchTask": "swift: Build Debug day08b (2023\\swift\\08)"
499+
},
500+
{
501+
"type": "swift-lldb",
502+
"request": "launch",
503+
"sourceLanguages": [
504+
"swift"
505+
],
506+
"args": [
507+
"--input",
508+
"input.txt"
509+
],
510+
"cwd": "${workspaceFolder:adventofcode}\\2023\\swift\\08",
511+
"name": "Release day08b (2023\\swift\\08)",
512+
"program": "${workspaceFolder:adventofcode}\\2023\\swift\\08\\.build\\release\\day08b.exe",
513+
"preLaunchTask": "swift: Build Release day08b (2023\\swift\\08)"
454514
}
455515
]
456516
}

2023/swift/08/.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
.DS_Store
2+
/.build
3+
/Packages
4+
xcuserdata/
5+
DerivedData/
6+
.swiftpm/configuration/registries.json
7+
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
8+
.netrc

2023/swift/08/Package.resolved

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2023/swift/08/Package.swift

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// swift-tools-version: 5.10
2+
// The swift-tools-version declares the minimum version of Swift required to build this package.
3+
4+
import PackageDescription
5+
6+
let package = Package(
7+
name: "day08",
8+
dependencies: [
9+
.package(url: "https://github.com/apple/swift-argument-parser", from: "1.0.0"),
10+
],
11+
targets: [
12+
// Targets are the basic building blocks of a package, defining a module or a test suite.
13+
// Targets can depend on other targets in this package and products from dependencies.
14+
.executableTarget(
15+
name: "day08",
16+
dependencies: [
17+
.product(name: "ArgumentParser", package: "swift-argument-parser")
18+
],
19+
path: "Sources/a"),
20+
.executableTarget(
21+
name: "day08b",
22+
dependencies: [
23+
.product(name: "ArgumentParser", package: "swift-argument-parser"),
24+
],
25+
path: "Sources/b")
26+
]
27+
)

2023/swift/08/Sources/a/main.swift

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import ArgumentParser
2+
import Foundation
3+
4+
extension String {
5+
var length: Int {
6+
return count
7+
}
8+
9+
subscript (i: Int) -> String {
10+
return self[i ..< i + 1]
11+
}
12+
13+
subscript (r: Range<Int>) -> String {
14+
let range = Range(uncheckedBounds: (lower: max(0, min(length, r.lowerBound)),
15+
upper: min(length, max(0, r.upperBound))))
16+
let start = index(startIndex, offsetBy: range.lowerBound)
17+
let end = index(start, offsetBy: range.upperBound - range.lowerBound)
18+
return String(self[start ..< end])
19+
}
20+
}
21+
22+
@main
23+
struct Day08: ParsableCommand {
24+
@Option(help: "Specify the input")
25+
public var input: String
26+
27+
public func run() throws {
28+
guard let filecontent = try? String(contentsOfFile: input, encoding: .utf8)
29+
else {
30+
print("Failed to open file \(input)")
31+
return
32+
}
33+
34+
let lines = filecontent.components(separatedBy: .newlines)
35+
let instructions = lines[0]
36+
37+
var map = [String: [String]]()
38+
lines.dropFirst(2).forEach { line in
39+
let parts = line.components(separatedBy: "=")
40+
let key = parts[0].trimmingCharacters(in: .whitespacesAndNewlines)
41+
let trimmed = parts[1][2..<parts[1].length-1]
42+
let value = trimmed.components(separatedBy: ", ")
43+
map[key] = value
44+
}
45+
46+
var steps = 0
47+
var current = "AAA"
48+
var i = 0
49+
print(current)
50+
while current != "ZZZ" {
51+
let instruction = instructions[i]
52+
let step = map[current]!
53+
if instruction == "L" {
54+
current = step[0]
55+
} else {
56+
current = step[1]
57+
}
58+
print(current)
59+
steps += 1
60+
i += 1
61+
if i == instructions.length {
62+
i = 0
63+
}
64+
}
65+
66+
print(steps)
67+
}
68+
}

0 commit comments

Comments
 (0)