1
1
package com .sbaars .adventofcode .util ;
2
2
3
3
import java .util .ArrayList ;
4
+ import java .util .Collections ;
4
5
import java .util .List ;
5
6
import java .util .Optional ;
6
7
import java .util .function .ToLongFunction ;
8
+ import java .util .stream .Collectors ;
7
9
import java .util .stream .Stream ;
8
10
9
11
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,37 +30,32 @@ 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
- if (nums .size () < minSize ) {
34
- return Optional .empty ();
35
- }
36
- return findDevelopingDeltaPattern (nums , target , minSize , 2 );
37
- // return findCycleDeltaPattern(nums, target, minSize)
38
- // .or(() -> findDevelopingDeltaPattern(nums, target, minSize, 1));
33
+ return findCycleDeltaPattern (nums , target , minSize )
34
+ .or (() -> findDevelopingDeltaPattern (nums , target , minSize ));
39
35
}
40
36
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
- // }
37
+ private static Optional <Long > findCycleDeltaPattern (List <Long > nums , long target , int minSize ) {
38
+ List <Long > deltas = connectedPairs (nums ).map (p -> p .b () - p .a ()).collect (Collectors . toCollection (ArrayList ::new ));
39
+ deltas .add (0 , nums .get (0 )); // baseline delta
40
+ target ++; // Adjust target to cover baseline
41
+ if (deltas .size () >= minSize + 1 && deltas .subList (0 , minSize ).equals (deltas .subList (deltas .size () - minSize , deltas .size ()))) {
42
+ long deltaPerRepetition = deltas .subList (0 , deltas .size () - minSize ).stream ().mapToLong (e -> e ).sum ();
43
+ int elementsPerRepetition = deltas .size () - minSize ;
44
+ long timesApplied = target / elementsPerRepetition ;
45
+ int remainder = Math .toIntExact (target % elementsPerRepetition );
46
+ long applyRemainder = nums .subList (0 , remainder ).stream ().mapToLong (e -> e ).sum ();
47
+ return Optional .of ((deltaPerRepetition * timesApplied ) + applyRemainder );
48
+ }
49
+ return Optional .empty ();
50
+ }
55
51
56
- private static Optional <Long > findDevelopingDeltaPattern (List <Long > nums , long target , int minSize , int level ) {
57
- List <Long > deltas = deltaAtLevel (nums , level );
58
- target ++;
52
+ private static Optional <Long > findDevelopingDeltaPattern (List <Long > nums , long target , int minSize ) {
53
+ List <Long > deltas = connectedPairs (nums ).map (p -> p .b () - p .a ()).collect (Collectors .toCollection (ArrayList ::new ));
54
+ deltas .add (0 , nums .get (0 )); // baseline delta
55
+ target ++; // Adjust target to cover baseline
59
56
if (deltas .size () >= minSize * 2 ) {
60
- System .out .println (deltas .get (deltas .size () - 1 ));
61
- int subListIndex = indexOfSubList (deltas , deltas .subList (deltas .size () - minSize , deltas .size ()));
57
+ int subListIndex = Collections .indexOfSubList (deltas , deltas .subList (deltas .size () - minSize , deltas .size ()));
62
58
if (subListIndex < deltas .size () - (minSize * 2 ) + 1 ) {
63
- System .out .println ("Found pattern" );
64
59
List <Long > repeating = deltas .subList (subListIndex , deltas .size () - minSize );
65
60
long deltaPerRepetition = repeating .stream ().mapToLong (e -> e ).sum ();
66
61
int elementsPerRepetition = repeating .size ();
@@ -74,16 +69,4 @@ private static Optional<Long> findDevelopingDeltaPattern(List<Long> nums, long t
74
69
}
75
70
return Optional .empty ();
76
71
}
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
-
89
72
}
0 commit comments