11. des. 2024 - 3 minutter å lese

Advent of Code 2024 - Luke 11

Advent of Code 2024 - Luke 11

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)

I luke 11 går oppgaven ut på at vi har et antall steiner med formler for hva som skjer med disse steinene for hvert blink, eller iterasjon. Reglene er som følger:

  • En stein med verdi 0 vil bli 1.
  • En stein med verdi som har en lengde som er partall (eksempel 2024), deles i to (20 og 24). Dersom en stein ville blitt 010 for eksempel, blir den kun 10.
  • Alle andre ganges med 2024.

Vi skal da finne antallet steiner etter 25 blink, eller 25 iterasjoner. Jeg laget 3 metoder, en for å endre steinene etter reglene, en for reglene, og en for å fjerne ledende 0’er. Oppgave 2 er lik, men vi vil ha antallet etter 75 blink istedenfor som gjør at vi cacher hva som skjer med en stein som har hvert spesifikt tall.

private static void rules(List<Long> stones) {
    List<Long> oldStones = new ArrayList<>(stones);
    List<Long> newStones = new ArrayList<>();

    for (long val : oldStones) {
        if (val == 0) {
            newStones.add(1L);
        } else if (Long.toString(val).length() % 2 == 0) {
            String numString = Long.toString(val);

            String num1 = removeZero(numString.substring(0, numString.length() / 2));
            String num2 = removeZero(numString.substring(numString.length() / 2));

            newStones.add(parseLong(num1));
            newStones.add(parseLong(num2));
        } else {
            newStones.add(val * 2024);
        }
    }

    stones.clear();
    stones.addAll(newStones);
}

private static String removeZero(String number) {
    String cleaned = number.replaceAll("^0+", "");
    return cleaned.isEmpty() ? "0" : cleaned;
}

private static Map<Long, Long> transform(long val) {
    Map<Long, Long> result = new HashMap<>();
    if (val == 0) {
        result.put(1L, 1L);
    } else {
        String numString = Long.toString(val);
        if (numString.length() % 2 == 0) {
            String num1 = removeZero(numString.substring(0, numString.length() / 2));
            String num2 = removeZero(numString.substring(numString.length() / 2));
            long v1 = parseLong(num1);
            long v2 = parseLong(num2);
            result.put(v1, result.getOrDefault(v1, 0L) + 1);
            result.put(v2, result.getOrDefault(v2, 0L) + 1);
        } else {
            long newVal = val * 2024;
            result.put(newVal, 1L);
        }
    }
    return result;
}

Oppgave 2, med cache:

private static final Map<Long, Map<Long, Long>> cache = new HashMap<>();

private static Map<Long, Long> rulesWithCache(Map<Long, Long> stones) {
    Map<Long, Long> newMap = new HashMap<>();

    for (Map.Entry<Long, Long> entry : stones.entrySet()) {
        long val = entry.getKey();
        long count = entry.getValue();

        Map<Long, Long> resultForVal;
        if (cache.containsKey(val)) {
            resultForVal = cache.get(val);
        } else {
            resultForVal = transform(val);
            cache.put(val, resultForVal);
        }

        for (Map.Entry<Long, Long> resEntry : resultForVal.entrySet()) {
            long newVal = resEntry.getKey();
            long newValCount = resEntry.getValue() * count;
            newMap.put(newVal, newMap.getOrDefault(newVal, 0L) + newValCount);
        }
    }

    return newMap;
}