sample :: "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124"; // sample :: "11-22"; Chunk :: struct { chunks: [..]string; original: string; } solve_second :: (input: string, enable_debug_logging := false) { duplicate_sum := 0; int_sb: String_Builder; for range: split(input, ",") { if enable_debug_logging print("%\n", range); found, left_str, right_str := split_from_left(range, #char "-"); assert(found); left := parse_int(*left_str); right := parse_int(*right_str); for i: left..right { print_to_builder(*int_sb, "%", i); i_str := builder_to_string(*int_sb); for split_into_even_chunks(i_str) { if all_equal(array_view(it.chunks, 0)) { if enable_debug_logging print_vars(it); duplicate_sum += i; break; } } } } print_vars(duplicate_sum); } main :: () { content := read_entire_file("day2.input"); solve_second(content); } split_into_even_chunks :: (s: string) -> [..]Chunk { result: [..]Chunk; for chunk_len: 1..s.count / 2 { if s.count % chunk_len != 0 continue; chunks := Chunk.{original=s}; num_chunks := s.count / chunk_len; chunk_i := 0; for chunk_i: 0..num_chunks - 1 { array_add(*chunks.chunks, string.{data=s.data + (chunk_i * chunk_len), count = chunk_len}); } array_add(*result, chunks); } return result; } all_equal :: (strs: []string) -> bool { for i: 0..strs.count - 2 { if strs[i] != strs[i + 1] return false; } return true; } #import "Basic"; #import "File"; #import "String"; #import "Print_Vars";