|
|
@@ -5,6 +5,8 @@ import (
|
|
|
"fmt"
|
|
|
"log"
|
|
|
"os"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
)
|
|
|
|
|
|
func getRanges(data []byte) [][]int {
|
|
|
@@ -22,6 +24,42 @@ func getRanges(data []byte) [][]int {
|
|
|
return ranges
|
|
|
}
|
|
|
|
|
|
+func parts(ranges [][]int) (int, int) {
|
|
|
+ invalid := make(map[int]int)
|
|
|
+ invalidRest := make(map[int]int)
|
|
|
+ for _, r := range ranges {
|
|
|
+ for i := r[0]; i <= r[1]; i++ {
|
|
|
+ s := strconv.Itoa(i)
|
|
|
+ if len(s)%2 == 0 {
|
|
|
+ half := len(s) / 2
|
|
|
+ if s[:half] == s[half:] {
|
|
|
+ invalid[i]++
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(s) > 1 {
|
|
|
+ ds := s + s
|
|
|
+ if strings.Contains(ds[1:len(ds)-2], s) {
|
|
|
+ invalidRest[i]++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ var part1 int
|
|
|
+ for key, value := range invalid {
|
|
|
+ part1 += key * value
|
|
|
+ }
|
|
|
+
|
|
|
+ var part2 int
|
|
|
+ for key, value := range invalidRest {
|
|
|
+ part2 += key * value
|
|
|
+ }
|
|
|
+
|
|
|
+ return part1, part1 + part2
|
|
|
+}
|
|
|
+
|
|
|
func main() {
|
|
|
if len(os.Args) < 2 {
|
|
|
log.Fatal("You need to specify a file!")
|
|
|
@@ -33,5 +71,7 @@ func main() {
|
|
|
}
|
|
|
|
|
|
ranges := getRanges(data)
|
|
|
- fmt.Println(ranges)
|
|
|
+ part1, part2 := parts(ranges)
|
|
|
+ fmt.Println("Part1:", part1)
|
|
|
+ fmt.Println("Part2:", part2)
|
|
|
}
|