243 lines
8.2 KiB
Java
243 lines
8.2 KiB
Java
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.stream.Collectors;
|
|
|
|
class day17 {
|
|
|
|
public static void main(String[] args) {
|
|
|
|
List<int[]> points = new ArrayList<>();
|
|
List<int[]> pointsPart2 = new ArrayList<>();
|
|
|
|
char[][] input = {{'.', '.', '#', '.', '.', '#', '.', '.'},
|
|
{'#', '.', '#', '.', '.', '.', '#', '.'},
|
|
{'.', '.', '#', '.', '.', '.', '.', '.'},
|
|
{'#', '#', '.', '.', '.', '.', '#', '#'},
|
|
{'#', '.', '.', '#', '.', '#', '#', '#'},
|
|
{'.', '#', '.', '.', '#', '.', '.', '.'},
|
|
{'#', '#', '#', '.', '.', '#', '.', '.'},
|
|
{'.', '.', '.', '.', '#', '.', '.', '#'}};
|
|
|
|
/*char[][] input = {{'.', '#', '.'},
|
|
{'.', '.', '#'},
|
|
{'#', '#', '#'}};*/
|
|
|
|
//Part 1
|
|
|
|
//initialise
|
|
for (int i = 0; i < input.length; i++) {
|
|
for (int j = 0; j < input[0].length; j++) {
|
|
int[] newPoint = {j, i, 0, 0};
|
|
int[] newPointPart2 = {j, i, 0, 0, 0};
|
|
if (input[i][j] == '#') {
|
|
newPoint[3] = 1;
|
|
newPointPart2[4] = 1;
|
|
}
|
|
points.add(newPoint);
|
|
pointsPart2.add(newPointPart2);
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
points = step(points);
|
|
pointsPart2 = stepPart2(pointsPart2);
|
|
}
|
|
|
|
int counter = 0;
|
|
for (int[] p : points) {
|
|
if (p[3] == 1) counter++;
|
|
//System.out.printf("x: %d | y: %d | z: %d | State: %d \n", p[0], p[1], p[2], p[3]);
|
|
}
|
|
System.out.println("Part 1: " + counter);
|
|
|
|
counter = 0;
|
|
for (int[] p : pointsPart2) {
|
|
if (p[4] == 1) counter++;
|
|
//System.out.printf("x: %d | y: %d | z: %d | State: %d \n", p[0], p[1], p[2], p[3]);
|
|
}
|
|
System.out.println("Part 2: " + counter);
|
|
|
|
}
|
|
|
|
static List<int[]> step(List<int[]> points) {
|
|
|
|
List<int[]> newPoints = new ArrayList<>();
|
|
List<int[]> pointsToCheck = new ArrayList<>();
|
|
|
|
for (int[] p : points) {
|
|
|
|
int active = 0;
|
|
|
|
for (int x = -1; x <= 1; x++) {
|
|
for (int y = -1; y <= 1; y++) {
|
|
for (int z = -1; z <= 1; z++) {
|
|
|
|
if (!(x == 0 && y == 0 && z == 0)) {
|
|
|
|
int[] potentialNeighboor = {p[0] + x, p[1] + y, p[2] + z, 0};
|
|
int index = contains(potentialNeighboor, points);
|
|
if (index != -1) {
|
|
int[] foundPoint = points.get(index);
|
|
if (foundPoint[3] == 1) {
|
|
active++;
|
|
}
|
|
} else {
|
|
if (contains(potentialNeighboor, pointsToCheck) == -1) pointsToCheck.add(potentialNeighboor);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
int[] newPoint = {p[0], p[1], p[2], p[3]};
|
|
|
|
if (p[3] == 1) {
|
|
if (active != 2 && active != 3) newPoint[3] = 0;
|
|
} else {
|
|
if (active == 3) newPoint[3] = 1;
|
|
}
|
|
|
|
newPoints.add(newPoint);
|
|
|
|
}
|
|
|
|
for (int[] p : pointsToCheck) {
|
|
|
|
int active = 0;
|
|
|
|
for (int x = -1; x <= 1; x++) {
|
|
for (int y = -1; y <= 1; y++) {
|
|
for (int z = -1; z <= 1; z++) {
|
|
|
|
if (!(x == 0 && y == 0 && z == 0)) {
|
|
|
|
int[] potentialNeighboor = {p[0] + x, p[1] + y, p[2] + z, 0};
|
|
int index = contains(potentialNeighboor, points);
|
|
if (index != -1) {
|
|
int[] foundPoint = points.get(index);
|
|
if (foundPoint[3] == 1) active++;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
int[] newPoint = {p[0], p[1], p[2], p[3]};
|
|
|
|
if (active == 3){
|
|
newPoint[3] = 1;
|
|
//System.out.printf("x: %d | y: %d | z: %d | State: %d \n", newPoint[0], newPoint[1], newPoint[2], newPoint[3]);
|
|
}
|
|
|
|
newPoints.add(newPoint);
|
|
|
|
}
|
|
|
|
return newPoints;
|
|
|
|
}
|
|
|
|
static List<int[]> stepPart2(List<int[]> points) {
|
|
|
|
System.out.println(points.size());
|
|
|
|
List<int[]> newPoints = new ArrayList<>();
|
|
List<int[]> pointsToCheck = new ArrayList<>();
|
|
|
|
for (int[] p : points) {
|
|
|
|
int active = 0;
|
|
|
|
for (int x = -1; x <= 1; x++) {
|
|
for (int y = -1; y <= 1; y++) {
|
|
for (int z = -1; z <= 1; z++) {
|
|
for (int w = -1; w <= 1; w++) {
|
|
|
|
if (!(x == 0 && y == 0 && z == 0 && w == 0)) {
|
|
int[] potentialNeighboor = {p[0] + x, p[1] + y, p[2] + z, p[3] + w, 0};
|
|
int index = containsPart2(potentialNeighboor, points);
|
|
if (index != -1) {
|
|
int[] foundPoint = points.get(index);
|
|
if (foundPoint[4] == 1) active++;
|
|
} else {
|
|
if (containsPart2(potentialNeighboor, pointsToCheck) == -1) pointsToCheck.add(potentialNeighboor);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int[] newPoint = {p[0], p[1], p[2], p[3], p[4]};
|
|
|
|
if (p[4] == 1) {
|
|
if (active != 2 && active != 3) newPoint[4] = 0;
|
|
} else {
|
|
if (active == 3) newPoint[4] = 1;
|
|
}
|
|
|
|
newPoints.add(newPoint);
|
|
|
|
}
|
|
|
|
for (int[] p : pointsToCheck) {
|
|
|
|
int active = 0;
|
|
|
|
for (int x = -1; x <= 1; x++) {
|
|
for (int y = -1; y <= 1; y++) {
|
|
for (int z = -1; z <= 1; z++) {
|
|
for (int w = -1; w <= 1; w++) {
|
|
if (!(x == 0 && y == 0 && z == 0 && w == 0)) {
|
|
|
|
int[] potentialNeighboor = {p[0] + x, p[1] + y, p[2] + z, p[3] + w, 0};
|
|
int index = containsPart2(potentialNeighboor, points);
|
|
if (index != -1) {
|
|
int[] foundPoint = points.get(index);
|
|
if (foundPoint[4] == 1) active++;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int[] newPoint = {p[0], p[1], p[2], p[3], p[4]};
|
|
|
|
if (active == 3) newPoint[4] = 1;
|
|
newPoints.add(newPoint);
|
|
|
|
}
|
|
|
|
return newPoints;
|
|
|
|
}
|
|
|
|
static int contains(int[] p, List<int[]> points) {
|
|
for (int[] search : points) {
|
|
if (search[0] == p[0] && search[1] == p[1] && search[2] == p[2]) {
|
|
return points.indexOf(search);
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
static int containsPart2(int[] p, List<int[]> points) {
|
|
for (int[] search : points) {
|
|
if (search[0] == p[0] && search[1] == p[1] && search[2] == p[2] && search[3] == p[3]) {
|
|
return points.indexOf(search);
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
} |