diff --git a/2025/day02/go.mod b/2025/day02/go.mod new file mode 100644 index 0000000..379f572 --- /dev/null +++ b/2025/day02/go.mod @@ -0,0 +1,3 @@ +module tangled.org/seth.computer/advent-of-code/2025/day02 + +go 1.26.2 diff --git a/2025/day02/input.txt b/2025/day02/input.txt new file mode 100644 index 0000000..0acf68b --- /dev/null +++ b/2025/day02/input.txt @@ -0,0 +1 @@ +245284-286195,797927-983972,4949410945-4949555758,115-282,8266093206-8266228431,1-21,483873-655838,419252-466133,6190-13590,3876510-4037577,9946738680-9946889090,99954692-100029290,2398820-2469257,142130432-142157371,9797879567-9798085531,209853-240025,85618-110471,35694994-35766376,4395291-4476150,33658388-33694159,680915-772910,4973452995-4973630970,52-104,984439-1009605,19489345-19604283,22-42,154149-204168,7651663-7807184,287903-402052,2244-5558,587557762-587611332,307-1038,16266-85176,422394377-422468141 diff --git a/2025/day02/main.go b/2025/day02/main.go new file mode 100644 index 0000000..c3c2c7f --- /dev/null +++ b/2025/day02/main.go @@ -0,0 +1,67 @@ +package main + +import ( + "fmt" + "log" + "os" + "strconv" + "strings" +) + +func main() { + input, err := os.ReadFile("input.txt") + if err != nil { + log.Fatalf("failed to read file: %v", err) + } + + invalidSum := 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 + } + } + + fmt.Printf("part1: %d\n", invalidSum) +} + +type idRange struct { + start int + end int +} + +func (r *idRange) findInvalid() []int { + var invalid []int + for n := r.start; n <= r.end; n++ { + if isRepeatedSeq(strconv.Itoa(n)) { + invalid = append(invalid, n) + } + } + return invalid +} + +func isRepeatedSeq(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 parseRange(rStr string) (idRange, error) { + parts := strings.Split(rStr, "-") + start, err := strconv.Atoi(strings.TrimSpace(parts[0])) + if err != nil { + return idRange{}, fmt.Errorf("failed to parse start %q: %w", parts[0], err) + } + end, err := strconv.Atoi(strings.TrimSpace(parts[1])) + if err != nil { + return idRange{}, fmt.Errorf("failed to parse end %q: %w", parts[1], err) + } + return idRange{start: start, end: end}, nil +}