-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday10.d
118 lines (105 loc) · 2.75 KB
/
day10.d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
module day10;
import std.algorithm;
import std.array;
import std.conv;
import std.math;
import std.range;
import std.stdio;
import std.string;
void main() {
string[] input = File("input/day10.txt")
.byLine()
.map!(to!string)
.map!strip
.filter!(line => line.length > 0)
.array();
// writeln(input);
char[] illegals = [];
string[] autocompletes = [];
foreach(line; input) {
// writeln(line);
bool corrupted = false;
char[] chars = [];
foreach (c; line) {
if (c.isOpeningBracket()) {
chars ~= [c];
} else if (c.isClosingBracket()) {
char top = chars[$-1];
chars = chars[0..$-1];
char matchingTop = top.matchingBracket();
if (matchingTop != c) {
// writeln("Expected " ~ matchingTop ~ ", but found " ~ c ~ " instead.");
illegals ~= [c];
corrupted = true;
break;
}
}
}
if (!corrupted) {
// writeln(line, " is incomplete, chars were ", chars);
autocompletes ~= [chars.retro.map!((c) => c.to!char.matchingBracket()).array().to!string];
}
}
// pt 1
writeln(illegals.map!((c) => c.to!char.corruptionScore).sum);
// pt 2
long[] scores = autocompletes.map!((l) {
long score = 0;
foreach (c; l) {
score *= 5;
score += c.to!char.autocompleteScore;
}
return score;
}).array();
writeln(scores.sort()[$ / 2]);
}
int autocompleteScore(char c) {
switch (c) {
case ')': return 1;
case ']': return 2;
case '}': return 3;
case '>': return 4;
default:
throw new Exception("Character not a bracket: " ~ c);
}
}
int corruptionScore(char c) {
switch (c) {
case ')': return 3;
case ']': return 57;
case '}': return 1197;
case '>': return 25_137;
default: throw new Exception("Character not a bracket: " ~ c);
}
}
char isOpeningBracket(char c) {
switch(c) {
case '(': return true;
case '[': return true;
case '{': return true;
case '<': return true;
default: return false;
}
}
char isClosingBracket(char c) {
switch (c) {
case ')': return true;
case ']': return true;
case '}': return true;
case '>': return true;
default: return false;
}
}
char matchingBracket(char c) {
switch (c) {
case '(': return ')';
case ')': return '(';
case '[': return ']';
case ']': return '[';
case '{': return '}';
case '}': return '{';
case '<': return '>';
case '>': return '<';
default: throw new Exception("Character not a bracket: " ~ c);
}
}