Full kode finner du her.
Main metode
For alle oppgavene i 2024 bruker jeg Java, og dette vil være metoden jeg bruker for å hente input for de ulike oppgavene. Input blir lagret i en txt fil og hentes via denne metoden.
public static void main(String[] args){
ArrayList<String> lines = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(
new FileReader("2024/inputs/Day2.txt"))){
String line = reader.readLine();
while(line != null){
lines.add(line);
line = reader.readLine();
}
} catch (IOException e){
e.printStackTrace();
}
}
Oppgave 1
Oppgave 1 på dag 2 besto av å sjekke rapporter for “farlige” rapporter. En rapport skal markeres som farlig dersom forskjellen mellom to tall er større enn 3 eller mindre enn 1, og dersom en liste ikke er i rekkefølge. For å løse denne oppgaven valgte jeg å ganske enkelt gå gjennom tallene i hver rapport i en for løkke, og bryte ut av løkken dersom listen ble markert som farlig. Vi returnerer false dersom loop’en brytes og true dersom den holder hele veien.
Metoden for å gå gjennom en rapport og sjekke om denne er safe eller ikke.
private static boolean isSafe(List<Integer> report){
int previous = report.getFirst();
int direction = 0;
for(int i = 1; i < report.size(); i++){
int number = report.get(i);
int difference = Math.abs(number - previous);
if(direction == 0) direction = previous > number ? -1 : 1;
if(difference < 1 || difference > 3) { direction = 0; break;}
if(previous > number && direction == 1) { direction = 0; break;}
if(previous < number && direction == -1) { direction = 0; break;}
previous = number;
}
return direction != 0;
}
I main metoden legger vi til denne logikken for å gå gjennom listen med all rapporter og telle antall sikre.
int safe = 0;
for (String line : lines) {
List<Integer> report = new ArrayList<>();
String[] numbersString = line.split(" ");
for(String numString: numbersString){
report.add(parseInt(numString));
}
if(isSafe(report)){
safe++;
reallySafe++;
}
}
System.out.println(safe);
Oppgave 2
For oppgave 2 er oppgaven å sjekke om en rapport kan være sikker dersom vi fjerner et tall fra rapporten. Måten jeg valgte å løse dette på er å lage en loop som sjekker om en liste vil være safe dersom vi fjerner tallet på index i. Vi bruker metoden fra oppgave 1 til å sjekke om den nye listen er safe.
private static boolean isReallySafe(List<Integer> report){
for(int i = 0; i < report.size(); i++){
List<Integer> testReport = new ArrayList<>();
testReport.addAll(report.subList(0, i));
testReport.addAll(report.subList(i + 1, report.size()));
if(isSafe(testReport)){
return true;
}
}
return false;
}
I main metoden legger vi til denne logikken for å sjekke for å telle antall som vil bli safe dersom vi fjerner et tall. En alternativ løsning til hva jeg har gjort for å få mer innsyn, og klarere se forskjell kan være å istedenfor å legge til på totalSafe når safe er true, er å kun legge til når reallySafe er true, og så legge de sammen i etterkant.
int reallySafe = 0;
//fra tidligere start
for (String line : lines) {
List<Integer> report = new ArrayList<>();
String[] numbersString = line.split(" ");
for(String numString: numbersString){
report.add(parseInt(numString));
}
if(isSafe(report)){
safe++;
//fra tidligere slutt
reallySafe++;
} else if (isReallySafe(report)){
reallySafe++;
}
}
System.out.println(reallySafe);