Skip to content

Commit c6ac7ac

Browse files
committed
AoC 2017 Day 11 - java
1 parent 9bd32d4 commit c6ac7ac

File tree

2 files changed

+107
-1
lines changed

2 files changed

+107
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
| | 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 |
7474
| ---| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
7575
| python3 | [](src/main/python/AoC2017_01.py) | [](src/main/python/AoC2017_02.py) | [](src/main/python/AoC2017_03.py) | [](src/main/python/AoC2017_04.py) | [](src/main/python/AoC2017_05.py) | [](src/main/python/AoC2017_06.py) | | [](src/main/python/AoC2017_08.py) | | | | | [](src/main/python/AoC2017_13.py) | | [](src/main/python/AoC2017_15.py) | [](src/main/python/AoC2017_16.py) | | | | [](src/main/python/AoC2017_20.py) | | | | | |
76-
| java | [](src/main/java/AoC2017_01.java) | [](src/main/java/AoC2017_02.java) | [](src/main/java/AoC2017_03.java) | [](src/main/java/AoC2017_04.java) | [](src/main/java/AoC2017_05.java) | [](src/main/java/AoC2017_06.java) | [](src/main/java/AoC2017_07.java) | [](src/main/java/AoC2017_08.java) | [](src/main/java/AoC2017_09.java) | [](src/main/java/AoC2017_10.java) | | [](src/main/java/AoC2017_12.java) | [](src/main/java/AoC2017_13.java) | | [](src/main/java/AoC2017_15.java) | [](src/main/java/AoC2017_16.java) | [](src/main/java/AoC2017_17.java) | [](src/main/java/AoC2017_18.java) | [](src/main/java/AoC2017_19.java) | [](src/main/java/AoC2017_20.java) | | | | | |
76+
| java | [](src/main/java/AoC2017_01.java) | [](src/main/java/AoC2017_02.java) | [](src/main/java/AoC2017_03.java) | [](src/main/java/AoC2017_04.java) | [](src/main/java/AoC2017_05.java) | [](src/main/java/AoC2017_06.java) | [](src/main/java/AoC2017_07.java) | [](src/main/java/AoC2017_08.java) | [](src/main/java/AoC2017_09.java) | [](src/main/java/AoC2017_10.java) | [](src/main/java/AoC2017_11.java) | [](src/main/java/AoC2017_12.java) | [](src/main/java/AoC2017_13.java) | | [](src/main/java/AoC2017_15.java) | [](src/main/java/AoC2017_16.java) | [](src/main/java/AoC2017_17.java) | [](src/main/java/AoC2017_18.java) | [](src/main/java/AoC2017_19.java) | [](src/main/java/AoC2017_20.java) | | | | | |
7777
| bash | [](src/main/bash/AoC2017_01.sh) | [](src/main/bash/AoC2017_02.sh) | | [](src/main/bash/AoC2017_04.sh) | [](src/main/bash/AoC2017_05.sh) | | | | | | | | | | | | | | | | | | | | |
7878
| c++ | [](src/main/cpp/2017/01/AoC2017_01.cpp) | [](src/main/cpp/2017/02/AoC2017_02.cpp) | [](src/main/cpp/2017/03/AoC2017_03.cpp) | [](src/main/cpp/2017/04/AoC2017_04.cpp) | [](src/main/cpp/2017/05/AoC2017_05.cpp) | | | | | | | | [](src/main/cpp/2017/13/AoC2017_13.cpp) | | | | | [](src/main/cpp/2017/18/AoC2017_18.cpp) | | | | | | | |
7979
| julia | [](src/main/julia/AoC2017_01.jl) | [](src/main/julia/AoC2017_02.jl) | [](src/main/julia/AoC2017_03.jl) | [](src/main/julia/AoC2017_04.jl) | | | | | | | | | [](src/main/julia/AoC2017_13.jl) | | | | | | | | | | | | |

src/main/java/AoC2017_11.java

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import static java.util.stream.Collectors.toList;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.Arrays;
5+
import java.util.Deque;
6+
import java.util.EnumSet;
7+
import java.util.List;
8+
9+
import com.github.pareronia.aoc.geometry3d.Position3D;
10+
import com.github.pareronia.aoc.geometry3d.Vector3D;
11+
import com.github.pareronia.aocd.Aocd;
12+
import com.github.pareronia.aocd.Puzzle;
13+
14+
import lombok.Getter;
15+
import lombok.RequiredArgsConstructor;
16+
17+
public final class AoC2017_11 extends AoCBase {
18+
19+
private static final Position3D ORIGIN = Position3D.of(0, 0, 0);
20+
21+
final List<Heading> path;
22+
23+
private AoC2017_11(final List<String> inputs, final boolean debug) {
24+
super(debug);
25+
assert inputs.size() == 1;
26+
this.path = Arrays.stream(inputs.get(0).split(","))
27+
.map(Heading::fromValue)
28+
.collect(toList());
29+
}
30+
31+
public static AoC2017_11 create(final List<String> input) {
32+
return new AoC2017_11(input, false);
33+
}
34+
35+
public static AoC2017_11 createDebug(final List<String> input) {
36+
return new AoC2017_11(input, true);
37+
}
38+
39+
private Deque<Position3D> positions() {
40+
final Deque<Position3D> positions = new ArrayDeque<>(List.of(ORIGIN));
41+
this.path.stream()
42+
.map(Heading::asVector3D)
43+
.map(v -> positions.getLast().translate(v))
44+
.forEach(positions::add);
45+
return positions;
46+
}
47+
48+
private int steps(final Position3D p) {
49+
return p.manhattanDistance(ORIGIN) / 2;
50+
}
51+
52+
@Override
53+
public Integer solvePart1() {
54+
return steps(positions().getLast());
55+
}
56+
57+
@Override
58+
public Integer solvePart2() {
59+
return positions().stream().mapToInt(this::steps).max().getAsInt();
60+
}
61+
62+
public static void main(final String[] args) throws Exception {
63+
assert AoC2017_11.createDebug(TEST1).solvePart1().equals(3);
64+
assert AoC2017_11.createDebug(TEST2).solvePart1().equals(0);
65+
assert AoC2017_11.createDebug(TEST3).solvePart1().equals(2);
66+
assert AoC2017_11.createDebug(TEST4).solvePart1().equals(3);
67+
68+
final Puzzle puzzle = Aocd.puzzle(2017, 11);
69+
final List<String> input = puzzle.getInputData();
70+
puzzle.check(
71+
() -> lap("Part 1", create(input)::solvePart1),
72+
() -> lap("Part 2", create(input)::solvePart2)
73+
);
74+
}
75+
76+
private static final List<String> TEST1 = splitLines("ne,ne,ne");
77+
private static final List<String> TEST2 = splitLines("ne,ne,sw,sw");
78+
private static final List<String> TEST3 = splitLines("ne,ne,s,s");
79+
private static final List<String> TEST4 = splitLines("se,sw,se,sw,sw");
80+
81+
@RequiredArgsConstructor
82+
@Getter
83+
private enum Heading {
84+
NORTH ("n", 0, -1, 1),
85+
NORTHEAST ("ne", 1, -1, 0),
86+
SOUTHEAST ("se", 1, 0, -1),
87+
SOUTH ("s", 0, 1, -1),
88+
SOUTHWEST ("sw", -1, 1, 0),
89+
NORTHWEST ("nw", -1, 0, 1);
90+
91+
private final String value;
92+
private final int q;
93+
private final int r;
94+
private final int s;
95+
96+
public static Heading fromValue(final String value) {
97+
return EnumSet.allOf(Heading.class).stream()
98+
.filter(h -> h.value.equals(value))
99+
.findFirst().orElseThrow();
100+
}
101+
102+
public Vector3D asVector3D() {
103+
return Vector3D.of(q, r, s);
104+
}
105+
}
106+
}

0 commit comments

Comments
 (0)