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