From d544a7b5c7fdb578d4454e274b54c05b6170e7c0 Mon Sep 17 00:00:00 2001
From: Eoghan Conlon <git@eoghanconlon.ie>
Date: Mon, 9 Dec 2024 11:40:18 +0000
Subject: [PATCH 1/2] Day02 files

Signed-off-by: Eoghan Conlon <git@eoghanconlon.ie>
---
 src/Day02.java | 174 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/Main.java  |  29 ++++++++-
 2 files changed, 202 insertions(+), 1 deletion(-)
 create mode 100644 src/Day02.java

diff --git a/src/Day02.java b/src/Day02.java
new file mode 100644
index 0000000..2556de3
--- /dev/null
+++ b/src/Day02.java
@@ -0,0 +1,174 @@
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class Day02 extends Input{
+    private Input input;
+
+    private ArrayList<int[]> sample;
+    private ArrayList<int[]> actual;
+
+    public Day02() throws IOException {
+        this.input = new Input();
+        this.input.init("in/Day02");
+    }
+
+    public int part1Sample(){
+        int safeReadings = 0;
+
+        this.sample = new ArrayList<>();
+
+        for(String s1: this.input.getSample_input()){
+            String[] teamp_arr = s1.split(" ");
+            int[] temp_intArr = new int[teamp_arr.length];
+            for(int i = 0; i < temp_intArr.length; i += 1){
+                temp_intArr[i] = Integer.parseInt(teamp_arr[i]);
+            }
+            this.sample.add(temp_intArr);
+        }
+
+        return p1_work(safeReadings, sample);
+    }
+
+    public int part1(){
+        int safeReadings = 0;
+
+        this.actual = new ArrayList<>();
+
+        for(String s1: this.input.getInput()){
+            String[] teamp_arr = s1.split(" ");
+            int[] temp_intArr = new int[teamp_arr.length];
+            for(int i = 0; i < temp_intArr.length; i += 1){
+                temp_intArr[i] = Integer.parseInt(teamp_arr[i]);
+            }
+            this.actual.add(temp_intArr);
+        }
+
+        return p1_work(safeReadings, actual);
+    }
+
+    private int p1_work(int safeReadings, ArrayList<int[]> actual) {
+        for(int[] readings : actual){
+            int i = 0;
+            int j = 1;
+            boolean increasing = readings[i] < readings[j];
+            boolean safe = true;
+            while(j < readings.length && safe){
+                int temp = readings[i] - readings[j];
+                if((increasing && ((temp < -3) || (temp > -1))) || (!increasing && ((temp < 1) || (temp > 3)))){
+                    safe = false;
+                }
+                j += 1;
+                i += 1;
+            }
+            if(safe){
+                safeReadings += 1;
+            }
+        }
+
+        return safeReadings;
+    }
+
+    public int part2Sample(){
+        int safeReadings = 0;
+
+        this.sample = new ArrayList<>();
+
+        for(String s1: this.input.getSample_input()){
+            String[] teamp_arr = s1.split(" ");
+            int[] temp_intArr = new int[teamp_arr.length];
+            for(int i = 0; i < temp_intArr.length; i += 1){
+                temp_intArr[i] = Integer.parseInt(teamp_arr[i]);
+            }
+            this.sample.add(temp_intArr);
+        }
+
+        for(int[] readings : this.sample){
+            safeReadings = getSafeReadings(safeReadings, readings);
+        }
+
+        return safeReadings;
+    }
+
+    public int part2(){
+        int safeReadings = 0;
+
+        this.actual = new ArrayList<>();
+
+        for(String s1: this.input.getInput()){
+            String[] teamp_arr = s1.split(" ");
+            int[] temp_intArr = new int[teamp_arr.length];
+            for(int i = 0; i < temp_intArr.length; i += 1){
+                temp_intArr[i] = Integer.parseInt(teamp_arr[i]);
+            }
+            this.actual.add(temp_intArr);
+        }
+
+        for(int[] readings : this.actual){
+            safeReadings = getSafeReadings(safeReadings, readings);
+        }
+
+        return safeReadings;
+    }
+
+    private int getSafeReadings(int safeReadings, int[] readings) {
+        int safe = 1;
+        int oldSafeRead = safeReadings;
+        while(safe >= 0 && oldSafeRead == safeReadings){
+            int danger = safe_p2(readings);
+            if(danger == -1){
+                safeReadings += 1;
+            } else {
+                safe -= 1;
+                int[] reading_cut = new int[readings.length - 1];
+                for(int i = 0, j = 0; i < readings.length; i += 1){
+                    if(i != danger){
+                        reading_cut[j] = readings[i];
+                        j += 1;
+                    }
+                }
+                if(safe_p2(reading_cut) == -1){
+                    safeReadings += 1;
+                } else {
+                    for(int i = 0, j = 0; i < readings.length; i += 1){
+                        if(i != danger - 1){
+                            reading_cut[j] = readings[i];
+                            j += 1;
+                        }
+                    }
+                    if(safe_p2(reading_cut) == -1){
+                        safeReadings += 1;
+                    } else {
+                        safe -= 1;
+                    }
+                }
+            }
+        }
+        return safeReadings;
+    }
+
+    public int safe_p2(int[] readings){
+        int safe = 0;
+        boolean increasing = readings[0] < readings[1];
+        int i = 0;
+        int j = 1;
+        while(j < readings.length){
+            int diff = readings[i] - readings[j];
+            if(increasing && ((diff < -3) || (diff > -1))){
+                break;
+            } else if (!increasing && ((diff < 1) || (diff > 3))) {
+                break;
+            } else {
+                j += 1;
+                i += 1;
+            }
+        }
+
+        if(j < readings.length){
+            safe = j;
+        } else {
+            safe = -1;
+        }
+
+        return safe;
+    }
+}
diff --git a/src/Main.java b/src/Main.java
index 7066f74..eb5a3a4 100644
--- a/src/Main.java
+++ b/src/Main.java
@@ -28,6 +28,33 @@ public class Main {
         System.out.printf("Part 1 sample is: %d (%dms)\n", sample_d1_p1_answer, day01_p1_sample);
         System.out.printf("Part 1 answer is: %d (%dms)\n", d1_p1_answer, day01_p1);
         System.out.printf("Part 2 sample answer is: %d (%dms)\n", sample_d1_p2_answer, day01_p2_sample);
-        System.out.printf("Part 2 answer is: %d (%dms)", d1_p2_answer, day01_p2);
+        System.out.printf("Part 2 answer is: %d (%dms)\n", d1_p2_answer, day01_p2);
+
+        System.out.println("\nDay 2:");
+        start = System.currentTimeMillis();
+        Day02 day02 = new Day02();
+        long day02_init = System.currentTimeMillis() - start;
+
+        start = System.currentTimeMillis();
+        int d2_p1_sample = day02.part1Sample();
+        long day02_p1_sample = System.currentTimeMillis() - start;
+
+        start = System.currentTimeMillis();
+        int d2_p1 = day02.part1();
+        long day02_p1 = System.currentTimeMillis() - start;
+
+        start = System.currentTimeMillis();
+        int d2_p2_sample = day02.part2Sample();
+        long day02_p2_sample = System.currentTimeMillis() - start;
+
+        start = System.currentTimeMillis();
+        int d2_p2 = day02.part2();
+        long day02_p2 = System.currentTimeMillis() - start;
+
+        System.out.printf("Day 2 init took %dms\n", day02_init);
+        System.out.printf("Part 1 sample = %d (%dms)\n", d2_p1_sample, day02_p1_sample);
+        System.out.printf("Part 1 answer = %d (%dms)\n", d2_p1, day02_p1);
+        System.out.printf("Part 2 sample = %d (%dms)\n", d2_p2_sample, day02_p2_sample);
+        System.out.printf("Part 2 answer = %d (%dms)\n", d2_p2, day02_p2);
     }
 }

From b7eff97777584e3f78a0c1957f6390c8216982b2 Mon Sep 17 00:00:00 2001
From: Eoghan Conlon <git@eoghanconlon.ie>
Date: Mon, 9 Dec 2024 12:58:11 +0000
Subject: [PATCH 2/2] Day 02 p2 complete

Signed-off-by: Eoghan Conlon <git@eoghanconlon.ie>
---
 src/Day02.java | 20 ++++++--------------
 1 file changed, 6 insertions(+), 14 deletions(-)

diff --git a/src/Day02.java b/src/Day02.java
index 2556de3..3b2af2f 100644
--- a/src/Day02.java
+++ b/src/Day02.java
@@ -120,25 +120,17 @@ public class Day02 extends Input{
             } else {
                 safe -= 1;
                 int[] reading_cut = new int[readings.length - 1];
-                for(int i = 0, j = 0; i < readings.length; i += 1){
-                    if(i != danger){
-                        reading_cut[j] = readings[i];
-                        j += 1;
-                    }
-                }
-                if(safe_p2(reading_cut) == -1){
-                    safeReadings += 1;
-                } else {
-                    for(int i = 0, j = 0; i < readings.length; i += 1){
-                        if(i != danger - 1){
-                            reading_cut[j] = readings[i];
-                            j += 1;
+                while(danger >= 0 && oldSafeRead == safeReadings){
+                    for(int a = 0, b = 0; a < readings.length; a += 1){
+                        if(a != danger){
+                            reading_cut[b] = readings[a];
+                            b += 1;
                         }
                     }
                     if(safe_p2(reading_cut) == -1){
                         safeReadings += 1;
                     } else {
-                        safe -= 1;
+                        danger -= 1;
                     }
                 }
             }