Skip to content

Commit d943f03

Browse files
committed
aoc 2017 day 9
1 parent c349296 commit d943f03

39 files changed

+155
-1
lines changed

adventofcode/README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@
406406
[20162402tests]: src/test/java/org/ck/adventofcode/year2016/Day24Test.java
407407
[20162501tests]: src/test/java/org/ck/adventofcode/year2016/Day25Test.java
408408

409-
# 2017 (16/16)
409+
# 2017 (18/18)
410410

411411
| # | Name | Solution | Test |
412412
|---------:|---------------------------------------------------------------------|:------------------------------------:|:---------------------------------:|
@@ -426,6 +426,8 @@
426426
| 20170702 | [Day 7: Recursive Circus - Part 2][20170702] | ✅[💾][20170702solution] | ✅[💾][20170702tests] |
427427
| 20170801 | [Day 8: I Heard You Like Registers][20170801] | ✅[💾][20170801solution] | ✅[💾][20170801tests] |
428428
| 20170802 | [Day 8: I Heard You Like Registers - Part 2][20170802] | ✅[💾][20170802solution] | ✅[💾][20170802tests] |
429+
| 20170901 | [Day 9: Stream Processing][20170901] | ✅[💾][20170901solution] | ✅[💾][20170901tests] |
430+
| 20170902 | [Day 9: Stream Processing - Part 2][20170902] | ✅[💾][20170902solution] | ✅[💾][20170902tests] |
429431

430432
[20170101]: https://adventofcode.com/2017/day/1
431433
[20170102]: https://adventofcode.com/2017/day/1#part2
@@ -443,6 +445,8 @@
443445
[20170702]: https://adventofcode.com/2017/day/7#part2
444446
[20170801]: https://adventofcode.com/2017/day/8
445447
[20170802]: https://adventofcode.com/2017/day/8#part2
448+
[20170901]: https://adventofcode.com/2017/day/9
449+
[20170902]: https://adventofcode.com/2017/day/9#part2
446450

447451
[20170101solution]: src/main/java/org/ck/adventofcode/year2017/Day01.java
448452
[20170102solution]: src/main/java/org/ck/adventofcode/year2017/Day01.java
@@ -460,6 +464,8 @@
460464
[20170702solution]: src/main/java/org/ck/adventofcode/year2017/Day07.java
461465
[20170801solution]: src/main/java/org/ck/adventofcode/year2017/Day08.java
462466
[20170802solution]: src/main/java/org/ck/adventofcode/year2017/Day08.java
467+
[20170901solution]: src/main/java/org/ck/adventofcode/year2017/Day09.java
468+
[20170902solution]: src/main/java/org/ck/adventofcode/year2017/Day09.java
463469

464470
[20170101tests]: src/test/java/org/ck/adventofcode/year2017/Day01Test.java
465471
[20170102tests]: src/test/java/org/ck/adventofcode/year2017/Day01Test.java
@@ -477,6 +483,8 @@
477483
[20170702tests]: src/test/java/org/ck/adventofcode/year2017/Day07Test.java
478484
[20170801tests]: src/test/java/org/ck/adventofcode/year2017/Day08Test.java
479485
[20170802tests]: src/test/java/org/ck/adventofcode/year2017/Day08Test.java
486+
[20170901tests]: src/test/java/org/ck/adventofcode/year2017/Day09Test.java
487+
[20170902tests]: src/test/java/org/ck/adventofcode/year2017/Day09Test.java
480488

481489
# 2019 (29/30)
482490

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package org.ck.adventofcode.year2017;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Scanner;
6+
import java.util.function.ToIntFunction;
7+
import org.ck.adventofcode.util.AOCSolution;
8+
import org.ck.codechallengelib.annotation.Solution;
9+
10+
@Solution(
11+
id = 20170901,
12+
name = "Day 9: Stream Processing",
13+
url = "https://adventofcode.com/2017/day/9",
14+
category = "2017")
15+
@Solution(
16+
id = 20170902,
17+
name = "Day 9: Stream Processing - Part 2",
18+
url = "https://adventofcode.com/2017/day/9#part2",
19+
category = "2017")
20+
public class Day09 extends AOCSolution {
21+
@Override
22+
protected void runPartOne(final Scanner in) {
23+
run(in, result -> count(result.result(), 1));
24+
}
25+
26+
@Override
27+
protected void runPartTwo(final Scanner in) {
28+
run(in, ParseResult::garbageCount);
29+
}
30+
31+
private void run(final Scanner in, final ToIntFunction<ParseResult> getResult) {
32+
final String line = in.nextLine();
33+
34+
print(getResult.applyAsInt(parse(line, 1)));
35+
}
36+
37+
private int count(final List<?> result, final int value) {
38+
int count = value;
39+
40+
for (Object o : result) {
41+
if (o instanceof List<?> list) {
42+
count += count(list, value + 1);
43+
}
44+
}
45+
46+
return count;
47+
}
48+
49+
private static ParseResult parse(final String line, final int start) {
50+
final List<Object> result = new ArrayList<>();
51+
int index = start;
52+
int garbageCount = 0;
53+
54+
while (line.charAt(index) != '}') {
55+
if (line.charAt(index) == '{') {
56+
final ParseResult parseResult = parse(line, index + 1);
57+
58+
result.add(parseResult.result());
59+
garbageCount += parseResult.garbageCount();
60+
index = parseResult.newIndex() + 1;
61+
} else if (line.charAt(index) == ',') {
62+
++index;
63+
} else if (line.charAt(index) == '<') {
64+
final ParseResult parseResult = parseGarbage(line, index + 1);
65+
66+
garbageCount += parseResult.garbageCount();
67+
index = parseResult.newIndex() + 1;
68+
}
69+
}
70+
71+
return new ParseResult(result, index, garbageCount);
72+
}
73+
74+
private static ParseResult parseGarbage(final String line, final int start) {
75+
int index = start;
76+
int garbageCount = 0;
77+
78+
while (line.charAt(index) != '>') {
79+
if (line.charAt(index) == '!') {
80+
index += 2;
81+
} else {
82+
++garbageCount;
83+
++index;
84+
}
85+
}
86+
87+
return new ParseResult(null, index, garbageCount);
88+
}
89+
90+
private record ParseResult(List<Object> result, int newIndex, int garbageCount) {}
91+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.ck.adventofcode.year2017;
2+
3+
import org.ck.adventofcode.util.BaseAOCTest;
4+
import org.junit.jupiter.params.ParameterizedTest;
5+
import org.junit.jupiter.params.provider.ValueSource;
6+
7+
class Day09Test extends BaseAOCTest {
8+
@ParameterizedTest
9+
@ValueSource(strings = {"01", "01a", "01b", "01c", "01d", "01e", "01f", "01g", "01h"})
10+
void testOne(String name) throws Exception {
11+
runTest(new Day09()::partOne, "day09/%s".formatted(name));
12+
}
13+
14+
@ParameterizedTest
15+
@ValueSource(strings = {"02", "02a", "02b", "02c", "02d", "02e", "02f", "02g", "02h"})
16+
void testTwo(String name) throws Exception {
17+
runTest(new Day09()::partTwo, "day09/%s".formatted(name));
18+
}
19+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
12505

adventofcode/src/test/resources/org/ck/adventofcode/year2017/day09/01.txt

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
6
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{{}}}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
5

0 commit comments

Comments
 (0)