Skip to content

Commit 4394395

Browse files
committed
Refactor Day 7 2016 to be more functional. Added pattern finding utility method and improved string operations efficiency.
1 parent d412709 commit 4394395

File tree

1 file changed

+12
-22
lines changed
  • src/main/java/com/sbaars/adventofcode/year16/days

1 file changed

+12
-22
lines changed

src/main/java/com/sbaars/adventofcode/year16/days/Day7.java

+12-22
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.*;
55
import java.util.regex.Matcher;
66
import java.util.regex.Pattern;
7+
import java.util.stream.IntStream;
78

89
public class Day7 extends Day2016 {
910
public Day7() {
@@ -33,31 +34,14 @@ public boolean supportsTLS() {
3334
}
3435

3536
public boolean supportsSSL() {
36-
Set<String> abas = new HashSet<>();
37-
for (String supernet : supernets) {
38-
for (int i = 0; i < supernet.length() - 2; i++) {
39-
if (isABA(supernet, i)) {
40-
abas.add(supernet.substring(i, i + 3));
41-
}
42-
}
43-
}
44-
45-
for (String aba : abas) {
46-
String bab = "" + aba.charAt(1) + aba.charAt(0) + aba.charAt(1);
47-
if (hypernets.stream().anyMatch(h -> h.contains(bab))) {
48-
return true;
49-
}
50-
}
51-
return false;
37+
return supernets.stream()
38+
.flatMap(s -> findPatterns(s, 3, IPv7::isABA))
39+
.map(aba -> new String(new char[]{aba.charAt(1), aba.charAt(0), aba.charAt(1)}))
40+
.anyMatch(bab -> hypernets.stream().anyMatch(h -> h.contains(bab)));
5241
}
5342

5443
private static boolean hasABBA(String s) {
55-
for (int i = 0; i < s.length() - 3; i++) {
56-
if (isABBA(s, i)) {
57-
return true;
58-
}
59-
}
60-
return false;
44+
return findPatterns(s, 4, IPv7::isABBA).findAny().isPresent();
6145
}
6246

6347
private static boolean isABBA(String s, int i) {
@@ -70,6 +54,12 @@ private static boolean isABA(String s, int i) {
7054
return s.charAt(i) == s.charAt(i + 2) &&
7155
s.charAt(i) != s.charAt(i + 1);
7256
}
57+
58+
private static java.util.stream.Stream<String> findPatterns(String s, int length, java.util.function.BiPredicate<String, Integer> matcher) {
59+
return IntStream.range(0, s.length() - length + 1)
60+
.filter(i -> matcher.test(s, i))
61+
.mapToObj(i -> s.substring(i, i + length));
62+
}
7363
}
7464

7565
@Override

0 commit comments

Comments
 (0)