1
1
package com .sbaars .adventofcode .util ;
2
2
3
3
import java .util .ArrayList ;
4
- import java .util .Collections ;
5
4
import java .util .List ;
6
5
import java .util .Optional ;
7
6
import java .util .function .ToLongFunction ;
8
- import java .util .stream .Collectors ;
9
7
import java .util .stream .Stream ;
10
8
11
9
import static com .sbaars .adventofcode .util .AOCUtils .connectedPairs ;
10
+ import static java .util .Collections .indexOfSubList ;
11
+ import static java .util .stream .Collectors .toCollection ;
12
12
13
13
/**
14
14
* 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
30
30
}
31
31
32
32
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 ();
51
35
}
52
- return Optional .empty ();
36
+ return findDevelopingDeltaPattern (nums , target , minSize , 2 );
37
+ // return findCycleDeltaPattern(nums, target, minSize)
38
+ // .or(() -> findDevelopingDeltaPattern(nums, target, minSize, 1));
53
39
}
54
40
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
+
55
56
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 ++;
64
59
if (deltas .size () >= minSize * 2 ) {
65
60
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 ()));
67
62
if (subListIndex < deltas .size () - (minSize * 2 ) + 1 ) {
63
+ System .out .println ("Found pattern" );
68
64
List <Long > repeating = deltas .subList (subListIndex , deltas .size () - minSize );
69
65
long deltaPerRepetition = repeating .stream ().mapToLong (e -> e ).sum ();
70
66
int elementsPerRepetition = repeating .size ();
@@ -79,4 +75,15 @@ private static Optional<Long> findDevelopingDeltaPattern(List<Long> nums, long t
79
75
return Optional .empty ();
80
76
}
81
77
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
+
82
89
}
0 commit comments