68 lines
1.1 KiB
Go
68 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
|
)
|
|
|
|
func main() {
|
|
inp := h.StdinToString()
|
|
part1(inp)
|
|
part2(inp)
|
|
}
|
|
|
|
func part1(inp string) {
|
|
var res int
|
|
ranges := getRanges(inp)
|
|
for _, rng := range ranges {
|
|
for wrk := rng.beg; wrk <= rng.end; wrk++ {
|
|
sWrk := h.Itoa(wrk)
|
|
hlf := len(sWrk) / 2
|
|
if sWrk[:hlf] == sWrk[hlf:] {
|
|
res += wrk
|
|
}
|
|
}
|
|
}
|
|
fmt.Println("# Part 1")
|
|
fmt.Println(res)
|
|
}
|
|
|
|
func part2(inp string) {
|
|
var res int
|
|
ranges := getRanges(inp)
|
|
for _, rng := range ranges {
|
|
for wrk := rng.beg; wrk <= rng.end; wrk++ {
|
|
sWrk := h.Itoa(wrk)
|
|
cnt := len(sWrk)
|
|
for i := 0; i < cnt/2; i++ {
|
|
ch := i + 1
|
|
if cnt%ch != 0 { // Must be divisible
|
|
continue
|
|
}
|
|
if strings.Repeat(sWrk[:ch], cnt/ch) == sWrk {
|
|
res += wrk
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
fmt.Println("# Part 2")
|
|
fmt.Println(res)
|
|
}
|
|
|
|
type Range struct {
|
|
beg, end int
|
|
}
|
|
|
|
func getRanges(inp string) []Range {
|
|
ret := []Range{}
|
|
segs := strings.Split(inp, ",")
|
|
for i := range segs {
|
|
pts := strings.Split(segs[i], "-")
|
|
ret = append(ret, Range{beg: h.Atoi(pts[0]), end: h.Atoi(pts[1])})
|
|
}
|
|
return ret
|
|
}
|