Skip to content

Commit 7767bce

Browse files
authored
Create Day21.java
1 parent 9d9c605 commit 7767bce

File tree

1 file changed

+190
-0
lines changed

1 file changed

+190
-0
lines changed

Day21.java

+190
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
2+
import java.util.Arrays;
3+
import java.util.HashMap;
4+
import java.util.List;
5+
import java.util.Map;
6+
7+
public class Day21 {
8+
9+
static int part1(Map<String, String> rules, char[][] grid) {
10+
StringBuilder b = new StringBuilder();
11+
int newSize = grid.length;
12+
int size = 0;
13+
for (int i = 0; i < 18; i++) {
14+
if (grid.length % 2 == 0) {
15+
newSize = grid.length / 2 * 3;
16+
size = 2;
17+
}
18+
else if (grid.length % 3 == 0) {
19+
newSize = grid.length / 3 * 4;
20+
size = 3;
21+
}
22+
23+
char[][] newGrid = new char[newSize][newSize];
24+
25+
int x1 = 0;
26+
for (int x = 0; x < grid.length; x += size) {
27+
int y1 = 0;
28+
for (int y = 0; y < grid.length; y += size) {
29+
b.setLength(0);
30+
if (size == 3) {
31+
b.append(grid[x][y]).append(grid[x][y + 1]).append(grid[x][y + 2]).append('/');
32+
b.append(grid[x + 1][y]).append(grid[x + 1][y + 1]).append(grid[x + 1][y + 2]).append('/');
33+
b.append(grid[x + 2][y]).append(grid[x + 2][y + 1]).append(grid[x + 2][y + 2]);
34+
}
35+
else if (size == 2) {
36+
b.append(grid[x][y]).append(grid[x][y + 1]).append('/');
37+
b.append(grid[x + 1][y]).append(grid[x + 1][y + 1]);
38+
}
39+
40+
String rule = rules.get(b.toString());
41+
char[] ruleChars = rule.toCharArray();
42+
if (size == 3) {
43+
newGrid[x1][y1] = ruleChars[0];
44+
newGrid[x1 + 1][y1] = ruleChars[1];
45+
newGrid[x1 + 2][y1] = ruleChars[2];
46+
newGrid[x1 + 3][y1] = ruleChars[3];
47+
newGrid[x1][y1 + 1] = ruleChars[5];
48+
newGrid[x1 + 1][y1 + 1] = ruleChars[6];
49+
newGrid[x1 + 2][y1 + 1] = ruleChars[7];
50+
newGrid[x1 + 3][y1 + 1] = ruleChars[8];
51+
newGrid[x1][y1 + 2] = ruleChars[10];
52+
newGrid[x1 + 1][y1 + 2] = ruleChars[11];
53+
newGrid[x1 + 2][y1 + 2] = ruleChars[12];
54+
newGrid[x1 + 3][y1 + 2] = ruleChars[13];
55+
newGrid[x1][y1 + 3] = ruleChars[15];
56+
newGrid[x1 + 1][y1 + 3] = ruleChars[16];
57+
newGrid[x1 + 2][y1 + 3] = ruleChars[17];
58+
newGrid[x1 + 3][y1 + 3] = ruleChars[18];
59+
}
60+
else if (size == 2) {
61+
newGrid[x1][y1] = ruleChars[0];
62+
newGrid[x1 + 1][y1] = ruleChars[1];
63+
newGrid[x1 + 2][y1] = ruleChars[2];
64+
newGrid[x1][y1 + 1] = ruleChars[4];
65+
newGrid[x1 + 1][y1 + 1] = ruleChars[5];
66+
newGrid[x1 + 2][y1 + 1] = ruleChars[6];
67+
newGrid[x1][y1 + 2] = ruleChars[8];
68+
newGrid[x1 + 1][y1 + 2] = ruleChars[9];
69+
newGrid[x1 + 2][y1 + 2] = ruleChars[10];
70+
}
71+
y1 += size + 1;
72+
}
73+
x1 += size + 1;
74+
}
75+
76+
grid = newGrid;
77+
}
78+
79+
int count = 0;
80+
for (int x = 0; x < grid.length; x++) {
81+
for (int y = 0; y < grid.length; y++) {
82+
if (grid[x][y] == '#') {
83+
count++;
84+
}
85+
}
86+
}
87+
return count;
88+
}
89+
90+
static Map<String, String> convertRules(List<String> rows) {
91+
StringBuilder b = new StringBuilder();
92+
Map<String, String> rules = new HashMap<>(rows.size());
93+
for (String row : rows) {
94+
String[] rule = row.split(" => ");
95+
rules.put(rule[0], rule[1]);
96+
97+
// ABC
98+
// DEF
99+
// GHI
100+
101+
// ABC/DEF/GHI
102+
// IHG/FED/CBA
103+
// GHI/DEF/ABC
104+
// CBA/FED/IHG
105+
106+
// ADG/BEH/CFI
107+
// IFC/HEB/GDA
108+
// GDA/HEB/IFC
109+
// CFI/BEH/ADG
110+
111+
String[] keys = rule[0].split("/");
112+
if (keys.length == 3) {
113+
b.setLength(0);
114+
b.append(rule[0]).reverse();
115+
rules.put(b.toString(), rule[1]);
116+
b.setLength(0);
117+
b.append(keys[2]).append('/').append(keys[1]).append('/').append(keys[0]);
118+
rules.put(b.toString(), rule[1]);
119+
rules.put(b.reverse().toString(), rule[1]);
120+
b.setLength(0);
121+
b.append(keys[0].charAt(0)).append(keys[1].charAt(0)).append(keys[2].charAt(0)).append('/')
122+
.append(keys[0].charAt(1)).append(keys[1].charAt(1)).append(keys[2].charAt(1)).append('/')
123+
.append(keys[0].charAt(2)).append(keys[1].charAt(2)).append(keys[2].charAt(2));
124+
rules.put(b.toString(), rule[1]);
125+
rules.put(b.reverse().toString(), rule[1]);
126+
b.setLength(0);
127+
b.append(keys[2].charAt(0)).append(keys[1].charAt(0)).append(keys[0].charAt(0)).append('/')
128+
.append(keys[2].charAt(1)).append(keys[1].charAt(1)).append(keys[0].charAt(1)).append('/')
129+
.append(keys[2].charAt(2)).append(keys[1].charAt(2)).append(keys[0].charAt(2));
130+
rules.put(b.toString(), rule[1]);
131+
rules.put(b.reverse().toString(), rule[1]);
132+
}
133+
else {
134+
// AB
135+
// DE
136+
137+
// AB/DE
138+
// ED/BA
139+
// AD/BE
140+
// EB/DA
141+
// DE/AB
142+
// BA/ED
143+
// DA/EB
144+
// BE/AD
145+
146+
b.setLength(0);
147+
b.append(rule[0]).reverse();
148+
rules.put(b.toString(), rule[1]);
149+
b.setLength(0);
150+
b.append(keys[0].charAt(0)).append(keys[1].charAt(0)).append('/')
151+
.append(keys[0].charAt(1)).append(keys[1].charAt(1));
152+
rules.put(b.toString(), rule[1]);
153+
rules.put(b.reverse().toString(), rule[1]);
154+
b.setLength(0);
155+
b.append(keys[1]).append('/').append(keys[0]);
156+
rules.put(b.toString(), rule[1]);
157+
rules.put(b.reverse().toString(), rule[1]);
158+
b.setLength(0);
159+
b.append(keys[1].charAt(0)).append(keys[0].charAt(0)).append('/')
160+
.append(keys[1].charAt(1)).append(keys[0].charAt(1));
161+
rules.put(b.toString(), rule[1]);
162+
rules.put(b.reverse().toString(), rule[1]);
163+
}
164+
}
165+
return rules;
166+
}
167+
168+
static String printGrid(char[][] grid) {
169+
StringBuilder b = new StringBuilder();
170+
for (char[] aGrid : grid) {
171+
b.append(aGrid).append('\n');
172+
}
173+
return b.toString();
174+
}
175+
176+
public static void main(String[] args) {
177+
Map<String, String> input = convertRules(Util.readInput("day21.input"));
178+
char[][] grid = new char[][] {
179+
".#.".toCharArray(),
180+
"..#".toCharArray(),
181+
"###".toCharArray()
182+
};
183+
184+
Map<String, String> testInput = convertRules(Arrays.asList(
185+
"../.# => ##./#../...",
186+
".#./..#/### => #..#/..../..../#..#"));
187+
188+
System.out.println(part1(input, grid));
189+
}
190+
}

0 commit comments

Comments
 (0)