Hi
Nach jedem aufruf von Evolve wird der Zustand eines Fisches um 1 veringert.
Ist der Zustand -1 bekommt er Nachwuchs mit dem Zustand 8 und der eigene Zustand wird auf 6 gesetzt.
Eine Liste von Fischen mit ihrem Start Zustand ist bereits gegeben. Ziel ist es die Population nach x Tagen zu berechnen.
Mit 256 Tagen bekomme ich aber einen OutOfMemoryError in der LaternFishGroup.evolve() Methode.
[CODE title="input"]4,1,4,1,3,3,1,4,3,3,2,1,1,3,5,1,3,5,2,5,1,5,5,1,3,2,5,3,1,3,4,2,3,2,3,3,2,1,5,4,1,1,1,2,1,4,4,4,2,1,2,1,5,1,5,1,2,1,4,4,5,3,3,4,1,4,4,2,1,4,4,3,5,2,5,4,1,5,1,1,1,4,5,3,4,3,4,2,2,2,2,4,5,3,5,2,4,2,3,4,1,4,4,1,4,5,3,4,2,2,2,4,3,3,3,3,4,2,1,2,5,5,3,2,3,5,5,5,4,4,5,5,4,3,4,1,5,1,3,4,4,1,3,1,3,1,1,2,4,5,3,1,2,4,3,3,5,4,4,5,4,1,3,1,1,4,4,4,4,3,4,3,1,4,5,1,2,4,3,5,1,1,2,1,1,5,4,2,1,5,4,5,2,4,4,1,5,2,2,5,3,3,2,3,1,5,5,5,4,3,1,1,5,1,4,5,2,1,3,1,2,4,4,1,1,2,5,3,1,5,2,4,5,1,2,3,1,2,2,1,2,2,1,4,1,3,4,2,1,1,5,4,1,5,4,4,3,1,3,3,1,1,3,3,4,2,3,4,2,3,1,4,1,5,3,1,1,5,3,2,3,5,1,3,1,1,3,5,1,5,1,1,3,1,1,1,1,3,3,1[/CODE]
Kann ich den Code irgendwie Effizienter gestalten?
Nach jedem aufruf von Evolve wird der Zustand eines Fisches um 1 veringert.
Ist der Zustand -1 bekommt er Nachwuchs mit dem Zustand 8 und der eigene Zustand wird auf 6 gesetzt.
Day 6 - Advent of Code 2021
adventofcode.com
Eine Liste von Fischen mit ihrem Start Zustand ist bereits gegeben. Ziel ist es die Population nach x Tagen zu berechnen.
Mit 256 Tagen bekomme ich aber einen OutOfMemoryError in der LaternFishGroup.evolve() Methode.
Java:
public class LanternFish {
private int state;
public LanternFish(int state) {
this.state = state;
}
public Optional<LanternFish> evolve() {
if (--state < 0) {
state = 6;
return Optional.of(new LanternFish(8));
}
return Optional.empty();
}
}
Java:
public class LanternFishGroup {
private List<LanternFish> fishes;
public LanternFishGroup(List<Integer> initialStates) {
fishes = initialStates.stream()
.map(LanternFish::new)
.toList();
}
public void evolve() {
List<LanternFish> nextGen = new ArrayList<>(fishes);
for (LanternFish fish : fishes) {
Optional<LanternFish> evolve = fish.evolve();
evolve.ifPresent(nextGen::add);
}
fishes = nextGen;
}
public int countOfFishes() {
return fishes.size();
}
}
Java:
public class LanternFishPopulation {
private LanternFishGroup fishGroup;
public LanternFishPopulation(String path) {
List<Integer> initialStates = FileUtils.stringStreamFromRessourceFile(path)
.flatMap(s -> Arrays.stream(s.split(",")))
.map(Integer::parseInt)
.toList();
fishGroup = new LanternFishGroup(initialStates);
}
public int challenge1() {
for (int i = 0; i < 80; i++) {
fishGroup.evolve();
}
return fishGroup.countOfFishes();
}
public int challenge2() {
for (int i = 0; i < 256; i++) {
fishGroup.evolve();
}
return fishGroup.countOfFishes();
}
}
[CODE title="input"]4,1,4,1,3,3,1,4,3,3,2,1,1,3,5,1,3,5,2,5,1,5,5,1,3,2,5,3,1,3,4,2,3,2,3,3,2,1,5,4,1,1,1,2,1,4,4,4,2,1,2,1,5,1,5,1,2,1,4,4,5,3,3,4,1,4,4,2,1,4,4,3,5,2,5,4,1,5,1,1,1,4,5,3,4,3,4,2,2,2,2,4,5,3,5,2,4,2,3,4,1,4,4,1,4,5,3,4,2,2,2,4,3,3,3,3,4,2,1,2,5,5,3,2,3,5,5,5,4,4,5,5,4,3,4,1,5,1,3,4,4,1,3,1,3,1,1,2,4,5,3,1,2,4,3,3,5,4,4,5,4,1,3,1,1,4,4,4,4,3,4,3,1,4,5,1,2,4,3,5,1,1,2,1,1,5,4,2,1,5,4,5,2,4,4,1,5,2,2,5,3,3,2,3,1,5,5,5,4,3,1,1,5,1,4,5,2,1,3,1,2,4,4,1,1,2,5,3,1,5,2,4,5,1,2,3,1,2,2,1,2,2,1,4,1,3,4,2,1,1,5,4,1,5,4,4,3,1,3,3,1,1,3,3,4,2,3,4,2,3,1,4,1,5,3,1,1,5,3,2,3,5,1,3,1,1,3,5,1,5,1,1,3,1,1,1,1,3,3,1[/CODE]
Kann ich den Code irgendwie Effizienter gestalten?