func part1_is_invalid_id[s: str] : bool len := s->len() if len % 2 != 0 return false first := s->substr(0, len / 2) second := s->substr(len / 2, len / 2) return first->equal(second) func part1[ranges: Array] : void sum := 0 for i in 0..ranges->size parts := (ranges->nth(i) as str)->split("-") start := (parts->nth(0) as str)->parse_i64() end := (parts->nth(1) as str)->parse_i64() for n in (start)..end+1 if part1_is_invalid_id(n->to_str()) sum += n io.println_i64(sum) // had to cheat this one func part2_is_invalid_id[s: str] : bool len := s->len() if len < 2 return false for div in 1..(len / 2 + 1) if len % div == 0 u := s->substr(0, div) is_repeat := true for k in 1..(len / div) segment := s->substr(k * div, div) if !segment->equal(u) is_repeat = false if is_repeat return true return false func part2[ranges: Array] : void sum := 0 for i in 0..ranges->size parts := (ranges->nth(i) as str)->split("-") start := (parts->nth(0) as str)->parse_i64() end := (parts->nth(1) as str)->parse_i64() for n in (start)..end+1 if part2_is_invalid_id(n->to_str()) sum += n io.println_i64(sum) func main[] : i64 ~input, ok := io.read_text_file("input.txt") if !ok panic("failed to open input.txt") ranges := input->split(",") part1(ranges) part2(ranges)