-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSolution1.java
206 lines (189 loc) · 7 KB
/
Solution1.java
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
// --- Day 11: Seating System ---
// Your plane lands with plenty of time to spare. The final leg of your journey
// is a ferry that goes directly to the tropical island where you can finally
// start your vacation. As you reach the waiting area to board the ferry, you
// realize you're so early, nobody else has even arrived yet!
// By modeling the process people use to choose (or abandon) their seat in the
// waiting area, you're pretty sure you can predict the best place to sit. You
// make a quick map of the seat layout (your puzzle input).
// The seat layout fits neatly on a grid. Each position is either floor (.), an
// empty seat (L), or an occupied seat (#). For example, the initial seat layout
// might look like this:
// L.LL.LL.LL
// LLLLLLL.LL
// L.L.L..L..
// LLLL.LL.LL
// L.LL.LL.LL
// L.LLLLL.LL
// ..L.L.....
// LLLLLLLLLL
// L.LLLLLL.L
// L.LLLLL.LL
// Now, you just need to model the people who will be arriving shortly.
// Fortunately, people are entirely predictable and always follow a simple set
// of rules. All decisions are based on the number of occupied seats adjacent to
// a given seat (one of the eight positions immediately up, down, left, right,
// or diagonal from the seat). The following rules are applied to every seat
// simultaneously:
// If a seat is empty (L) and there are no occupied seats adjacent to it, the
// seat becomes occupied.
// If a seat is occupied (#) and four or more seats adjacent to it are also
// occupied, the seat becomes empty.
// Otherwise, the seat's state does not change.
// Floor (.) never changes; seats don't move, and nobody sits on the floor.
// After one round of these rules, every seat in the example layout becomes
// occupied:
// #.##.##.##
// #######.##
// #.#.#..#..
// ####.##.##
// #.##.##.##
// #.#####.##
// ..#.#.....
// ##########
// #.######.#
// #.#####.##
// After a second round, the seats with four or more occupied adjacent seats
// become empty again:
// #.LL.L#.##
// #LLLLLL.L#
// L.L.L..L..
// #LLL.LL.L#
// #.LL.LL.LL
// #.LLLL#.##
// ..L.L.....
// #LLLLLLLL#
// #.LLLLLL.L
// #.#LLLL.##
// This process continues for three more rounds:
// #.##.L#.##
// #L###LL.L#
// L.#.#..#..
// #L##.##.L#
// #.##.LL.LL
// #.###L#.##
// ..#.#.....
// #L######L#
// #.LL###L.L
// #.#L###.##
// #.#L.L#.##
// #LLL#LL.L#
// L.L.L..#..
// #LLL.##.L#
// #.LL.LL.LL
// #.LL#L#.##
// ..L.L.....
// #L#LLLL#L#
// #.LLLLLL.L
// #.#L#L#.##
// #.#L.L#.##
// #LLL#LL.L#
// L.#.L..#..
// #L##.##.L#
// #.#L.LL.LL
// #.#L#L#.##
// ..L.L.....
// #L#L##L#L#
// #.LLLLLL.L
// #.#L#L#.##
// At this point, something interesting happens: the chaos stabilizes and
// further applications of these rules cause no seats to change state! Once
// people stop moving around, you count 37 occupied seats.
// Simulate your seating area by applying the seating rules repeatedly until no
// seats change state. How many seats end up occupied?
// input.get(i-1)[j-1] input.get(i-1)[j] input.get(i-1)[j+1]
// input.get(i)[j-1] x input.get(i)[j+1]
// input.get(i+1)[j-1] input.get(i+1)[j] input.get(i+1)[j+1]
public class Solution1 {
public static void main(String[] args) {
System.out.println(getOccupiedSeats(getInput()));
}
static List<char[]> getInput() {
List<char[]> input = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) {
input = br.lines().map(String::toCharArray).collect(Collectors.toList());
} catch (Exception e) {
System.out.println(e);
}
return input;
}
private static int getOccupiedSeats(List<char[]> input) {
final int MAX_COLUMNS = input.get(0).length;
final int MAX_ROWS = input.size();
boolean occupiedAdjacent = false;
int occupiedAdjacentCount = 0;
boolean stabilized;
do {
List<char[]> mutated = new ArrayList<>();
for (int i = 0; i < MAX_ROWS; i++) { // deep copied array
char[] tempArr = new char[MAX_COLUMNS];
for (int j = 0; j < MAX_COLUMNS; j++)
tempArr[j] = input.get(i)[j];
mutated.add(tempArr);
}
stabilized = true;
for (int i = 0; i < MAX_ROWS; i++) {
for (int j = 0; j < MAX_COLUMNS; j++) {
int tempK = i == MAX_ROWS - 1 ? 0 : 1;
int tempN = j == MAX_COLUMNS - 1 ? 0 : 1;
if (input.get(i)[j] == 'L') {
for (int k = i == 0 ? 0 : -1; k <= tempK; k++) { // row relative
for (int n = j == 0 ? 0 : -1; n <= tempN; n++) { // column relative
if (n == 0 && k == 0)
continue;
if (input.get(i + k)[j + n] == '#') {
occupiedAdjacent = true;
break;
}
}
if (occupiedAdjacent)
break;
}
if (!occupiedAdjacent) {
mutated.get(i)[j] = '#';
stabilized = false;
} else
occupiedAdjacent = !occupiedAdjacent;
} else if (input.get(i)[j] == '#') {
for (int k = i == 0 ? 0 : -1; k <= tempK; k++) { // row relative
for (int n = j == 0 ? 0 : -1; n <= tempN; n++) { // column relative
if (n == 0 && k == 0)
continue;
if (input.get(i + k)[j + n] == '#')
occupiedAdjacentCount++;
if (occupiedAdjacentCount >= 4)
break;
}
if (occupiedAdjacentCount >= 4) {
occupiedAdjacentCount = 0;
mutated.get(i)[j] = 'L';
stabilized = false;
break;
}
}
occupiedAdjacentCount = 0; // reset counter
}
}
}
input = new ArrayList<>(mutated); // we don't deep copy because mutated dies here
} while (!stabilized);
return countOccupiedSeats(input);
}
static int countOccupiedSeats(final List<char[]> input) {
int occupied = 0;
for (char[] arr : input) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == '#')
occupied++;
System.out.print(arr[i]);
}
System.out.println();
}
return occupied;
}
}