65 lines
1.6 KiB
Plaintext
65 lines
1.6 KiB
Plaintext
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)
|