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