13. des. 2024 - 2 minutter å lese

Advent of Code 2024 - Luke 13

Advent of Code 2024 - Luke 13

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 (og 2)

Luke 13, i likhet med luke 11, har ganske like oppgave 1 og 2, hvor bare kjøringene krever forskjellig. For luke 13 oppgave 1, skal vi finne færrest mulig trykk på knappene på en arkademaskin for å få tak i prisen. Hvor knapp A koster 3 mynter og knapp B koster 1 mynt. Jeg valgte å brute force oppgave 1. Jeg laget da en metode som går gjennom og sjekker ulike kombinasjoner og returnerer billigste. For oppgave 2 googlet jeg lineær algebra for å finne en løsning og fant frem til en formel som jeg implementerte i Java. Løsningen for oppgave 2 ville funket for oppgave 1, eneste forskjell er at vi legger til 10000000000000 ettersom oppgaven ber oss om dette.

private static int bruteForce(int[]a, int[]b, int[]p){
    int best = 777;

    int ax = a[0], ay = a[1],
            bx = b[0], by = b[1],
            px = p[0], py = p[1];

    for(int j = 1; j <= 100; j++){
        for(int k = 1; k <= 100; k++){
            int nx = ax * j + bx * k;
            int ny = ay * j + by * k;
            if(px == nx && py == ny) best = Math.min(best, 3*j+k);
        }
    }
    if(best < 777) return best;
    return 0;
}

private static long linearAlgebra(int[]a, int[]b, int[]p) {
    long m = 10000000000000L;
    long ax = a[0], ay = a[1],
        bx = b[0], by = b[1],
        px = p[0] + m, py = p[1] + m;

    long det = ax*by - ay*bx;
    if (det == 0) return 0;
    long az = px * by - py * bx;
    long bz = py * ax - px * ay;
    if(az % det != 0 || bz % det != 0) return 0;

    return(az/det * 3 + bz/det);
}