42 lines
1.2 KiB
Zig
42 lines
1.2 KiB
Zig
|
const std = @import("std");
|
||
|
|
||
|
pub fn main() void {
|
||
|
const input = @embedFile("input");
|
||
|
|
||
|
std.debug.print("Part 1: {}\n", .{findDisctinctSubstrIdx(input, 4)});
|
||
|
std.debug.print("Part 2: {}\n", .{findDisctinctSubstrIdx(input, 14)});
|
||
|
}
|
||
|
|
||
|
fn findDisctinctSubstrIdx(input: []const u8, n: usize) usize {
|
||
|
// Loop through all the groups of 4
|
||
|
var i: usize = n;
|
||
|
group: while (i < input.len) : (i += 1) {
|
||
|
const slice = input[(i - n)..i];
|
||
|
|
||
|
// See if each one of them is unique in smaller groups.
|
||
|
// Ex.: is 1 in 234? -> is 2 in 34? -> is 3 in 4?
|
||
|
var j: usize = 0;
|
||
|
while (j < slice.len - 1) : (j += 1) {
|
||
|
const needle = slice[j];
|
||
|
const haystack = slice[(j + 1)..];
|
||
|
|
||
|
for (haystack) |blade| {
|
||
|
// We found a match, throw batch to garbage
|
||
|
|
||
|
if (needle == blade) {
|
||
|
// We know this character appears somewhere else in
|
||
|
// the haystack. As long as this letter is here, this
|
||
|
// n-letter work will be invalid. Skip ahead.
|
||
|
i += j;
|
||
|
continue :group;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// We found it, get out
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return i;
|
||
|
}
|