Skip to content

Commit f706393

Browse files
committed
feat: Event 2018 day 12
1 parent 5d9257f commit f706393

File tree

1 file changed

+112
-0
lines changed
  • core/src/main/java/com/vuryss/aoc/solutions/event2018

1 file changed

+112
-0
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package com.vuryss.aoc.solutions.event2018;
2+
3+
import com.vuryss.aoc.solutions.SolutionInterface;
4+
import java.lang.Override;
5+
import java.lang.String;
6+
import java.lang.SuppressWarnings;
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
10+
@SuppressWarnings("unused")
11+
public class Day12 implements SolutionInterface {
12+
@Override
13+
public Map<String, String> part1Tests() {
14+
return Map.of(
15+
"""
16+
initial state: #..#.#..##......###...###
17+
18+
...## => #
19+
..#.. => #
20+
.#... => #
21+
.#.#. => #
22+
.#.## => #
23+
.##.. => #
24+
.#### => #
25+
#.#.# => #
26+
#.### => #
27+
##.#. => #
28+
##.## => #
29+
###.. => #
30+
###.# => #
31+
####. => #
32+
""",
33+
"325"
34+
);
35+
}
36+
37+
@Override
38+
public Map<String, String> part2Tests() {
39+
return Map.of();
40+
}
41+
42+
@Override
43+
public String part1Solution(String input, boolean isTest) {
44+
return sumPots(input, 20);
45+
}
46+
47+
@Override
48+
public String part2Solution(String input, boolean isTest) {
49+
return sumPots(input, 50_000_000_000L);
50+
}
51+
52+
private String sumPots(String input, long generations) {
53+
var parts = input.trim().split("\n\n");
54+
var initialState = parts[0].split(" ")[2];
55+
var rules = new HashMap<String, Character>();
56+
57+
for (var line: parts[1].split("\n")) {
58+
var parts2 = line.split(" => ");
59+
rules.put(parts2[0], parts2[1].charAt(0));
60+
}
61+
62+
char[] state = new char[2000];
63+
System.arraycopy(initialState.toCharArray(), 0, state, 1000, initialState.length());
64+
65+
int firstPlant = 1000, lastPlant = 1000 + initialState.length();
66+
char[] newState;
67+
long[] increments = new long[] { 999, 999, 999 };
68+
long sum, lastSum = 0;
69+
70+
for (var i = 0L; i < generations; i++) {
71+
newState = new char[2000];
72+
73+
for (var j = firstPlant - 2; j < lastPlant + 2; j++) {
74+
var key = new StringBuilder();
75+
76+
for (var k = j - 2; k <= j + 2; k++) {
77+
key.append(state[k] == '\0' ? '.' : state[k]);
78+
}
79+
80+
newState[j] = rules.getOrDefault(key.toString(), '.');
81+
82+
if (newState[j] == '#') {
83+
if (j < firstPlant) firstPlant = j;
84+
if (j > lastPlant) lastPlant = j;
85+
}
86+
}
87+
88+
state = newState;
89+
sum = sumPots(state, firstPlant, lastPlant);
90+
increments[(int) i % 3] = sum - lastSum;
91+
lastSum = sum;
92+
93+
if (increments[0] == increments[1] && increments[1] == increments[2]) {
94+
return String.valueOf((generations - i - 1) * increments[0] + sum);
95+
}
96+
}
97+
98+
return String.valueOf(sumPots(state, firstPlant, lastPlant));
99+
}
100+
101+
private long sumPots(char[] state, int firstPlant, int lastPlant) {
102+
long sum = 0;
103+
104+
for (var i = firstPlant; i <= lastPlant; i++) {
105+
if (state[i] == '#') {
106+
sum += i - 1000;
107+
}
108+
}
109+
110+
return sum;
111+
}
112+
}

0 commit comments

Comments
 (0)