Skip to content

Commit 89a0848

Browse files
committed
Add day 20 solution
1 parent 3a4c211 commit 89a0848

File tree

8 files changed

+5292
-0
lines changed

8 files changed

+5292
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package eu.happycoders.adventofcode2022.day20;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/**
7+
* Advent of Code 2022 – Object-Oriented Solutions in Java.
8+
*
9+
* <p>Puzzle solver for day 20.
10+
*
11+
* @author <a href="mailto:sven@happycoders.eu">Sven Woltmann</a>
12+
*/
13+
class Day20Solver {
14+
15+
private static final long DECRYPTION_KEY = 811_589_153L;
16+
17+
static long solveTask1(String input) {
18+
List<Long> numbers = ListParser.parse(input);
19+
File file = new File(numbers);
20+
file.mix();
21+
return file.getGroveCoordinates();
22+
}
23+
24+
static long solveTask2(String input) {
25+
List<Long> numbers = new ArrayList<>(ListParser.parse(input));
26+
27+
numbers.replaceAll(value -> value * DECRYPTION_KEY);
28+
29+
File file = new File(numbers);
30+
for (int i = 0; i < 10; i++) {
31+
file.mix();
32+
}
33+
return file.getGroveCoordinates();
34+
}
35+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package eu.happycoders.adventofcode2022.day20;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/**
7+
* Advent of Code 2022 – Object-Oriented Solutions in Java.
8+
*
9+
* <p>The file to be decrypted.
10+
*
11+
* @author <a href="mailto:sven@happycoders.eu">Sven Woltmann</a>
12+
*/
13+
class File {
14+
15+
private final List<Node> nodesInOriginalOrder = new ArrayList<>();
16+
private final int size;
17+
private final Node zeroNode;
18+
19+
File(List<Long> numbers) {
20+
size = numbers.size();
21+
22+
// Store all numbers in a doubly-linked list.
23+
// And remember the original order of the nodes and the zero node.
24+
Node tempZeroNode = null;
25+
for (int i = 0; i < size; i++) {
26+
Long number = numbers.get(i);
27+
Node node = new Node(number);
28+
29+
nodesInOriginalOrder.add(node);
30+
31+
if (number == 0) {
32+
tempZeroNode = node;
33+
}
34+
35+
if (i > 0) {
36+
Node previousNode = nodesInOriginalOrder.get(i - 1);
37+
previousNode.setNext(node);
38+
node.setPrevious(previousNode);
39+
}
40+
}
41+
42+
this.zeroNode = tempZeroNode;
43+
44+
// Make the list circular
45+
Node firstNode = nodesInOriginalOrder.get(0);
46+
Node lastNode = nodesInOriginalOrder.get(size - 1);
47+
firstNode.setPrevious(lastNode);
48+
lastNode.setNext(firstNode);
49+
}
50+
51+
void mix() {
52+
for (int i = 0; i < size; i++) {
53+
Node node = nodesInOriginalOrder.get(i);
54+
move(node);
55+
}
56+
}
57+
58+
private void move(Node node) {
59+
long distance = node.value() % (size - 1);
60+
if (distance == 0) {
61+
return;
62+
}
63+
64+
Node previous = node.previous();
65+
Node next = node.next();
66+
67+
// Remove node from current position
68+
previous.setNext(next);
69+
next.setPrevious(previous);
70+
71+
if (distance < 0) {
72+
for (long i = 0; i > distance; i--) {
73+
next = previous;
74+
previous = previous.previous();
75+
}
76+
} else {
77+
for (long i = 0; i < distance; i++) {
78+
previous = next;
79+
next = next.next();
80+
}
81+
}
82+
83+
// Insert node at new position
84+
previous.setNext(node);
85+
node.setPrevious(previous);
86+
node.setNext(next);
87+
next.setPrevious(node);
88+
}
89+
90+
long getGroveCoordinates() {
91+
Node node = zeroNode;
92+
93+
long sum = 0;
94+
for (int i = 0; i < 3; i++) {
95+
node = skipNodes(node, 1000);
96+
sum += node.value();
97+
}
98+
99+
return sum;
100+
}
101+
102+
private Node skipNodes(Node node, int numberOfNodes) {
103+
int remainder = numberOfNodes % size;
104+
for (int i = 0; i < remainder; i++) {
105+
node = node.next();
106+
}
107+
return node;
108+
}
109+
110+
@Override
111+
public String toString() {
112+
StringBuilder result = new StringBuilder();
113+
Node node = nodesInOriginalOrder.get(0);
114+
for (int i = 0; i < size; i++) {
115+
if (result.length() > 0) {
116+
result.append(", ");
117+
}
118+
result.append(node.value());
119+
node = node.next();
120+
}
121+
return result.toString();
122+
}
123+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package eu.happycoders.adventofcode2022.day20;
2+
3+
import java.util.List;
4+
5+
/**
6+
* Advent of Code 2022 – Object-Oriented Solutions in Java.
7+
*
8+
* <p>Parses the input into a list of Longs.
9+
*
10+
* @author <a href="mailto:sven@happycoders.eu">Sven Woltmann</a>
11+
*/
12+
class ListParser {
13+
14+
static List<Long> parse(String input) {
15+
return input.lines().map(Long::parseLong).toList();
16+
}
17+
}

0 commit comments

Comments
 (0)