🍯 Glaze

package main

import "core:fmt"
import "core:os"

parse_input_file :: proc(filepath: string) -> []u8 {
	data, ok := os.read_entire_file_from_filename(filepath)
	if !ok {
		panic("oh no, could not read file")
	}

	return data
}

is_uniq :: proc(message: []u8) -> bool {
	for i := 0; i < len(message); i += 1 {
		for j := i + 1; j < len(message); j += 1 {
			if message[i] == message[j] {
				return false
			}
		}
	}
	return true
}

task1 :: proc(datastream: []u8) -> int {
	marker: int
	message: [4]u8
	for char, index in datastream {
		for i := 0; i < 3; i += 1 {
			message[i] = message[i + 1]
		}
		message[3] = char

		if index > 2 {
			if is_uniq(message[:]) {
				marker = index + 1
				break
			}
		}
	}
	return marker
}

task2 :: proc(datastream: []u8) -> int {
	marker: int
	message: [14]u8
	for char, index in datastream {
		for i := 0; i < 13; i += 1 {
			message[i] = message[i + 1]
		}
		message[13] = char

		if index > 12 {
			if is_uniq(message[:]) {
				marker = index + 1
				break
			}
		}
	}
	return marker
}

main :: proc() {
	datastream := parse_input_file("input.txt")
	defer delete(datastream)

	result1 := task1(datastream)
	fmt.printf("Task 1 result: %d\n", result1)

	result2 := task2(datastream)
	fmt.printf("Task 2 result: %d\n", result2)
}