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