91 lines
2.4 KiB
Plaintext
91 lines
2.4 KiB
Plaintext
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;
|
|
}
|
|
|
|
main :: () {
|
|
content := read_entire_file("day2.input");
|
|
solve_first(content);
|
|
solve_second(content);
|
|
}
|
|
|
|
solve_first :: (input: string) {
|
|
solve(input, split_into_halves);
|
|
}
|
|
|
|
solve_second :: (input: string) {
|
|
solve(input, split_into_even_chunks);
|
|
}
|
|
|
|
solve :: (input: string, chunking_fn: (string) -> [..]Chunk, 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 chunking_fn(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);
|
|
}
|
|
|
|
split_into_halves :: (s: string) -> [..]Chunk {
|
|
result: [..]Chunk;
|
|
if s.count % 2 != 0 return result;
|
|
|
|
chunk_len := s.count / 2;
|
|
chunks := Chunk.{original=s};
|
|
chunk_i := 0;
|
|
for chunk_i: 0..1 {
|
|
array_add(*chunks.chunks, string.{data=s.data + (chunk_i * chunk_len), count = chunk_len});
|
|
}
|
|
array_add(*result, chunks);
|
|
|
|
return result;
|
|
}
|
|
|
|
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";
|