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 10 tar utgangspunkt i at vi er på fjelltur. I oppgave 1 får vi i oppdrag å finne alle stier som starter på 0 og ender på 9 i en gitt grid. Eksempelet gir oss en grid på 7 x 7 hvor en kan bevege seg horisontalt og vertikalt. Vi kan ikke bevege oss diagonalt og kun øke med 1 for hvert steg. Vi kan også ikke gå utenfor griden. En fullført sti vil inneholde alle tallene fra 0 til 9. En topp får score basert på stier som leder til toppen, og det målet er å summere scoren for alle toppene i griden. For dag 10 har jeg også valgt å løse oppgavene sammen ettersom de er veldig like og jeg bruker samme metode for begge oppgavene, med kun små endringer i input. Oppgave 2 tar istedenfor topper for seg stier fra 0 til 9 hvor en sti får score basert på ulike måter å komme seg til toppen. Altså kan en sti med samme slutt og start punkt får en score på 3 dersom en kan ta tre ulike veier på stien. Metoden for å løse de to oppgavene er slik:
private static int walk(List<String> lines, int x, int y, Set<String> seen, int startX, int startY){
int num = Character.digit(lines.get(y).charAt(x), 10);
if(num == 9 && (seen.add(startY + "," + startX + ": " + y + "," + x) || startX == -1)) return 1;
int count = 0;
int[][] directions = {{0,1}, {1,0}, {-1,0}, {0,-1}};
for(int[] direction: directions){
int newY = y + direction[0];
int newX = x + direction[1];
if(newY < 0 || newX < 0 || newY >= lines.size() || newX >= lines.getFirst().length()) continue;
if(Character.digit(lines.get(newY).charAt(newX), 10) == num + 1){
count += walk(lines, newX, newY, seen, startX, startY);
}
}
return count;
}
Metoden for å regne ut de to ulike oppgavenes score blir da slik:
Set<String> seen = new HashSet<>();
for(int y = 0; y < lines.size(); y++){
for(int x = 0; x < lines.getFirst().length(); x++){
if(lines.get(y).charAt(x) == '0'){
part1 += walk(lines, x, y, seen, x, y);
part2 += walk(lines, x, y, seen, -1, -1);
}
}
}