2. des. 2024 - 3 minutter å lese

Advent of Code 2024 - Luke 2

Advent of Code 2024 - Luke 2

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);