Skip to content

Commit e01e3b5

Browse files
committed
Try to work with multi-level delta
1 parent 523b259 commit e01e3b5

File tree

1 file changed

+37
-30
lines changed

1 file changed

+37
-30
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package com.sbaars.adventofcode.util;
22

33
import java.util.ArrayList;
4-
import java.util.Collections;
54
import java.util.List;
65
import java.util.Optional;
76
import java.util.function.ToLongFunction;
8-
import java.util.stream.Collectors;
97
import java.util.stream.Stream;
108

119
import static com.sbaars.adventofcode.util.AOCUtils.connectedPairs;
10+
import static java.util.Collections.indexOfSubList;
11+
import static java.util.stream.Collectors.toCollection;
1212

1313
/**
1414
* The solver looks for patterns in an infinite stream of numeric data, to find the result further in the repetition.
@@ -30,41 +30,37 @@ public static <A> long solve(Stream<A> s, ToLongFunction<A> res, long target, in
3030
}
3131

3232
private static Optional<Long> findPattern(List<Long> nums, long target, int minSize) {
33-
return findCycleDeltaPattern(nums, target, minSize)
34-
.or(() -> findDevelopingDeltaPattern(nums, target, minSize, 1))
35-
.or(() -> findDevelopingDeltaPattern(nums, target, minSize, 2))
36-
.or(() -> findDevelopingDeltaPattern(nums, target, minSize, 3))
37-
.or(() -> findDevelopingDeltaPattern(nums, target, minSize, 4));
38-
}
39-
40-
private static Optional<Long> findCycleDeltaPattern(List<Long> nums, long target, int minSize) {
41-
List<Long> deltas = connectedPairs(nums).map(p -> p.b() - p.a()).collect(Collectors.toCollection(ArrayList::new));
42-
deltas.add(0, nums.get(0)); // baseline delta
43-
target++; // Adjust target to cover baseline
44-
if (deltas.size() >= minSize + 1 && deltas.subList(0, minSize).equals(deltas.subList(deltas.size() - minSize, deltas.size()))) {
45-
long deltaPerRepetition = deltas.subList(0, deltas.size() - minSize).stream().mapToLong(e -> e).sum();
46-
int elementsPerRepetition = deltas.size() - minSize;
47-
long timesApplied = target / elementsPerRepetition;
48-
int remainder = Math.toIntExact(target % elementsPerRepetition);
49-
long applyRemainder = nums.subList(0, remainder).stream().mapToLong(e -> e).sum();
50-
return Optional.of((deltaPerRepetition * timesApplied) + applyRemainder);
33+
if (nums.size() < minSize) {
34+
return Optional.empty();
5135
}
52-
return Optional.empty();
36+
return findDevelopingDeltaPattern(nums, target, minSize, 2);
37+
// return findCycleDeltaPattern(nums, target, minSize)
38+
// .or(() -> findDevelopingDeltaPattern(nums, target, minSize, 1));
5339
}
5440

41+
// private static Optional<Long> findCycleDeltaPattern(List<Long> nums, long target, int minSize) {
42+
// List<Long> deltas = connectedPairs(nums).map(p -> p.b() - p.a()).collect(toCollection(ArrayList::new));
43+
// deltas.add(0, nums.get(0)); // baseline delta
44+
// target++; // Adjust target to cover baseline
45+
// if (deltas.size() >= minSize + 1 && deltas.subList(0, minSize).equals(deltas.subList(deltas.size() - minSize, deltas.size()))) {
46+
// long deltaPerRepetition = deltas.subList(0, deltas.size() - minSize).stream().mapToLong(e -> e).sum();
47+
// int elementsPerRepetition = deltas.size() - minSize;
48+
// long timesApplied = target / elementsPerRepetition;
49+
// int remainder = Math.toIntExact(target % elementsPerRepetition);
50+
// long applyRemainder = nums.subList(0, remainder).stream().mapToLong(e -> e).sum();
51+
// return Optional.of((deltaPerRepetition * timesApplied) + applyRemainder);
52+
// }
53+
// return Optional.empty();
54+
// }
55+
5556
private static Optional<Long> findDevelopingDeltaPattern(List<Long> nums, long target, int minSize, int level) {
56-
List<Long> deltas = nums;
57-
for (int i = 0; i < level; i++) {
58-
deltas = connectedPairs(deltas).map(p -> p.b() - p.a()).collect(Collectors.toCollection(ArrayList::new));
59-
if (i == 0) {
60-
deltas.add(0, nums.get(0)); // baseline delta
61-
target++; // Adjust target to cover baseline
62-
}
63-
}
57+
List<Long> deltas = deltaAtLevel(nums, level);
58+
target++;
6459
if (deltas.size() >= minSize * 2) {
6560
System.out.println(deltas.get(deltas.size() - 1));
66-
int subListIndex = Collections.indexOfSubList(deltas, deltas.subList(deltas.size() - minSize, deltas.size()));
61+
int subListIndex = indexOfSubList(deltas, deltas.subList(deltas.size() - minSize, deltas.size()));
6762
if (subListIndex < deltas.size() - (minSize * 2) + 1) {
63+
System.out.println("Found pattern");
6864
List<Long> repeating = deltas.subList(subListIndex, deltas.size() - minSize);
6965
long deltaPerRepetition = repeating.stream().mapToLong(e -> e).sum();
7066
int elementsPerRepetition = repeating.size();
@@ -79,4 +75,15 @@ private static Optional<Long> findDevelopingDeltaPattern(List<Long> nums, long t
7975
return Optional.empty();
8076
}
8177

78+
private static List<Long> deltaAtLevel(List<Long> nums, int level) {
79+
List<Long> deltas = nums;
80+
for (int i = 0; i < level; i++) {
81+
deltas = connectedPairs(deltas).map(p -> p.b() - p.a()).collect(toCollection(ArrayList::new));
82+
if (i == 0) {
83+
deltas.add(0, nums.get(0));
84+
}
85+
}
86+
return deltas;
87+
}
88+
8289
}

0 commit comments

Comments
 (0)