14. des. 2024 - 4 minutter å lese

Advent of Code 2024 - Luke 14

Advent of Code 2024 - Luke 14

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.

Oppgave 1

Luke 14 går ut på å finne ut hvordan roboter vil ha beveget seg etter en gitt input. Robotene kan bevege seg i 4 retninger, nord, sør, øst og vest. Input blir gitt som start lokasjon og hvor mange felter en robot beveger seg på Y og X aksen i en grid per sekund. Vi ønsker å finne robotenes lokasjon etter 100 sekunder er gått. Derimot skal vi ikke telle roboter i midten av griden, altså for grid 7 x 7, ikke telle roboter i linjen X = 4, og Y = 4. Måten vi finner resultatet er å ta hver kvadrant etter å ha fjernet X = 4 og Y = 4, og finne antall roboter i hver kvadrant. Resultatet av dette skal ganges sammen. Jeg fant ut at jeg kunne bruke en robots lokasjon + sekunder gange måten den beveger seg på + vidden eller høyden for X eller Y, modulo vidden eller høyden. Da får vi hvor på X eller Y aksen de befinner seg med få linjer kode, og uten å bruke lang tid på å forflytte en etter en. Metodene jeg lagde for å få til dette blir slik:

private static void calculate(int[] quadrants, int[] p, int[] v){
    int seconds = 100;

    int[] loc = move(p,v,seconds);

    int newX = loc[0], newY = loc[1];

    if(newX < width / 2 && newY < height / 2) quadrants[0] += 1;
    else if(newX > width / 2 && newY < height / 2) quadrants[1] += 1;
    else if(newX < width / 2 && newY > height / 2) quadrants[2] += 1;
    else if(newX > width / 2 && newY > height / 2) quadrants[3] += 1;
}

private static int[] move(int[] p, int[] v, int seconds){

    int px = p[0], py = p[1],
        vx = v[0], vy = v[1];

    int newX = ((px + vx * seconds) % width + width) % width;
    int newY = ((py + vy * seconds) % height + height) % height;

    return new int[] {newX, newY};
}

Oppgave 2

For oppgave 2 ønsker vi å finne når de former et juletre. Her måtte jeg ty til å spørre etter råd, da jeg prøvde selv å finne ut av hva dette innebar, og prøvde ved å printe når så så mange var på linje. Problemet her er at resultatet kan være et liggende juletre eller stående, og det kan se forskjellig ut fra person til person. Løsningen ble derfor å sjekke for når alle roboter var på ulike posisjon, altså at ingen står på samme lokasjon. Dette viste seg å gi meg riktig svar. Jeg vil kalle det litt juks, men det er en løsning som fungerer. Metoden, sammen med print funksjon blir slik:

private static int tree(List<String> lines){
    boolean tree = false;
    int i = 2000;
    while(!tree){
        i++;
        Set<String> seen = new HashSet<>();
        for (String line : lines) {
            String[] s = line.split(" ");
            int[] p = parseLine(s[0]), v = parseLine(s[1]);
            int[] loc = move(p, v, i);
            if(!seen.add(loc[0] + "," + loc[1])) break;
        }
        if(seen.size() == 500) tree = true;
    }

    print(lines, i);
    return i;
}

private static void print(List<String> lines, int seconds){
    char[][] grid = new char[101][103];

    for(String line: lines){
        String[] s = line.split(" ");
        int[] p = parseLine(s[0]), v = parseLine(s[1]);
        int[] loc = move(p, v, seconds);
        grid[loc[0]][loc[1]] = '#';
    }

    Arrays.stream(grid).forEach(System.out::println);
}