4. des. 2024 - 4 minutter å lese

Advent of Code 2024 - Luke 4

Advent of Code 2024 - Luke 4

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/Day4.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 4, word search. Vi skal finne ord i et slags todimensjonelt array, det er ihvertfall slik jeg ser på det. Som liten likte jeg disse oppgavene på skolen, men det er en stund siden jeg har gjort noe lignende. Det virker veldig intuitivt for oss mennesker, litt mindre for en maskin, men fremdeles ganske simpelt. Jeg valgte å opprette en metode med de ulike retningene lagret som 0,1, 0,-1, 1,1, 1,0, 1,-1, -1,1, -1,-1, -1,0, og sjekker om vi finner ordet “MAS” i en av disse retningene.

Metoden for å sjekke ulike retninger.

private static int directions(ArrayList<String> lines, int x, int y){
    int count = 0;
    int[][] directions = {{0,1}, {0,-1}, {1,1}, {1,0}, {1,-1}, {-1,1}, {-1,-1}, {-1,0}};
    String word = "MAS";
    int chars = word.length();

    for(int[] direction: directions){
        boolean match = true;
        int dirX = direction[0];
        int dirY = direction[1];
        if(0 > x + dirX * chars || x + dirX * chars >= lines.size()
                ||  0 > y + dirY * chars || y + dirY * chars >= lines.getFirst().length()) continue;
        for(int i = 1; i <= chars; i++){
            if(lines.get(x + dirX * i).charAt(y + dirY*i) != word.charAt(i-1)){
                match = false;
                break;
            };
        }

        if(match) count++;
    }
    return count;
}

I main kjører vi en double for loop for å sjekke hver bokstav for om den er X og om en retning gir ordet “XMAS”, og printer antallet ganger vi finner ordet.

int total = 0;

for(int i = 0; i < lines.size(); i++){
   String line = lines.get(i);
   for(int j = 0; j < line.length(); j++){
       if(line.charAt(j) == 'X'){
            total += directions(lines, i, j);
       }
   }
}

System.out.println(total);

Svaret vi får etter å ha gjennomført oppgaven er 2458.

Oppgave 2

For oppgave 2 er søket endret. Vi får beskjed om at vi ikke skal lete etter XMAS, men heller MAS i kryss. Oppgaven blir på en måte lettere, istedenfor alle retninger trenger vi nå bare å sjekke bokstavene rundt A, og kun nordvest, nordøst, sørøst og sørvest. For å sjekke dette valgte jeg å lage en metode hvor vi først sjekker at A er på en plassering/index som tillater at det kan være bokstaver rundt, og returnerer false hvis ikke. Videre tar vi å sjekker de to bokstavene nordvest og sørøst, hvis summen av de stemmer over med summen av “MS”, nemlig 160, samtidig som summen av bokstavene nordøst og sørvest også stemmer, så returnerer vi true.

Metoden for å sjekke om vi finner MAS i kryss.

private static boolean around(ArrayList<String> lines, int i, int j){
    if (i < 1 || j < 1 || i >= lines.size() - 1 || j >= lines.get(i).length() - 1) return false;
    int charTotals = 'M' + 'S';
    return(lines.get(i - 1).charAt(j - 1) + lines.get(i + 1).charAt(j + 1) == charTotals &&
            lines.get(i - 1).charAt(j + 1) + lines.get(i + 1).charAt(j - 1) == charTotals);
}

I main må vi da legge til en sjekk dersom bokstaven er A, en teller, og printe totalt antall.

int totalMas = 0;
    for(int i = 0; i < lines.size(); i++){
       String line = lines.get(i);
       for(int j = 0; j < line.length(); j++){
        //tidligere kode for om bokstaven er X
            if(line.charAt(j) == 'A'){
               if(around(lines, i, j)) totalMas++;
            }
        }
    }

System.out.println(totalMas);