diff --git a/2025/day02/main.go b/2025/day02/main.go index c3c2c7f..673c202 100644 --- a/2025/day02/main.go +++ b/2025/day02/main.go @@ -14,45 +14,83 @@ func main() { log.Fatalf("failed to read file: %v", err) } - invalidSum := 0 + invalidSum1 := int64(0) + invalidSum2 := int64(0) for rStr := range strings.SplitSeq(string(input), ",") { r, err := parseRange(rStr) if err != nil { log.Fatalf("failed to parse range: %v", err) } - for _, x := range r.findInvalid() { - invalidSum += x + for _, x := range r.findInvalid(false) { + invalidSum1 += x + } + for _, x := range r.findInvalid(true) { + invalidSum2 += x } } - fmt.Printf("part1: %d\n", invalidSum) + fmt.Printf("part1: %d\n", invalidSum1) + fmt.Printf("part2: %d\n", invalidSum2) } type idRange struct { - start int - end int + start int64 + end int64 } -func (r *idRange) findInvalid() []int { - var invalid []int +func (r *idRange) findInvalid(part2 bool) []int64 { + var invalid []int64 for n := r.start; n <= r.end; n++ { - if isRepeatedSeq(strconv.Itoa(n)) { - invalid = append(invalid, n) + if part2 { + if isRepeatedSeq(strconv.FormatInt(n, 10)) { + invalid = append(invalid, n) + } + } else { + if isDoubleSeq(strconv.FormatInt(n, 10)) { + invalid = append(invalid, n) + } } } return invalid } -func isRepeatedSeq(id string) bool { +func isDoubleSeq(id string) bool { if len(id)%2 != 0 { return false } half := len(id) / 2 - fmt.Printf("%s: %s | %s\n", id, id[0:half], id[half:]) return id[0:half] == id[half:] } +func isRepeatedSeq(id string) bool { + for i := range len(id) { + if i == 0 || len(id)%i != 0 { + continue + } + + var parts []string + for s := 0; s <= len(id)-i; s += i { + parts = append(parts, id[s:s+i]) + } + + allMatch := true + for p := range parts { + if p == 0 { + continue + } + if parts[p-1] != parts[p] { + allMatch = false + } + } + + if allMatch { + return true + } + } + return false +} + func parseRange(rStr string) (idRange, error) { parts := strings.Split(rStr, "-") start, err := strconv.Atoi(strings.TrimSpace(parts[0])) @@ -63,5 +101,5 @@ func parseRange(rStr string) (idRange, error) { if err != nil { return idRange{}, fmt.Errorf("failed to parse end %q: %w", parts[1], err) } - return idRange{start: start, end: end}, nil + return idRange{start: int64(start), end: int64(end)}, nil }