Repository navigation
Expand file tree
/
Copy pathSolution2.java
More file actions
93 lines (78 loc) · 2.86 KB
/
Copy pathSolution2.java
File metadata and controls
93 lines (78 loc) · 2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import java.util.StringTokenizer;
public class Solution2 extends Solution {
public Solution2() {
super(2);
}
public static void main(String[] args) {
Solution2 solution = new Solution2();
solution.testPartTwo();
}
private boolean hasRepeatedDigitsTwice(long number) {
String s = String.valueOf(number);
int n = s.length();
// must have even number of digits
if (n % 2 != 0) return false;
String left = s.substring(0, n / 2);
String right = s.substring(n / 2);
return left.equals(right);
}
@Override
String solvePartOne(String inputData) {
StringTokenizer sb = new StringTokenizer(inputData, ",\n");
long sum = 0;
while (sb.hasMoreTokens()) {
String token = sb.nextToken();
System.out.println(token);
Long lowerBound = Long.parseLong(token.split("-")[0]);
Long upperBound = Long.parseLong(token.split("-")[1]);
System.out.println("In range: " + lowerBound + " to " + upperBound);
for (long i = lowerBound; i <= upperBound; i++) {
if (hasRepeatedDigitsTwice(i)) {
System.out.println("+" + i);
sum += i;
}
}
}
return Long.toString(sum);
}
private boolean hasRepeatedDigits(long number) {
String s = String.valueOf(number);
int n = s.length();
// Try every possible pattern length
for (int len = 1; len <= n / 2; len++) {
// total length must be divisible by pattern length
if (n % len != 0) continue;
String pattern = s.substring(0, len);
int repeatCount = n / len;
// Build repeated pattern
StringBuilder sb = new StringBuilder();
for (int i = 0; i < repeatCount; i++) {
sb.append(pattern);
}
// If equal and repeated at least twice then invalid
if (sb.toString().equals(s) && repeatCount >= 2) {
return true;
}
}
return false;
}
@Override
String solvePartTwo(String inputData) {
StringTokenizer sb = new StringTokenizer(inputData, ",\n");
long sum = 0;
while (sb.hasMoreTokens()) {
String token = sb.nextToken();
System.out.println(token);
Long lowerBound = Long.parseLong(token.split("-")[0]);
Long upperBound = Long.parseLong(token.split("-")[1]);
System.out.println("In range: " + lowerBound + " to " + upperBound);
for (long i = lowerBound; i <= upperBound; i++) {
if (hasRepeatedDigits(i)) {
System.out.println("+" + i);
sum += i;
}
}
}
return Long.toString(sum);
}
}