Repo for my Advent of Code solutions.
package main

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

Pos :: [2]int;
Slope :: [2]int;

advancePos :: proc(pos: ^Pos, slope: Slope, maxPos: ^Pos) -> bool {
	if pos.y + slope.y >= maxPos.y do return true;
	
	pos^ = pos^ + slope;
	if pos.x > maxPos.x do pos.x = (pos.x % maxPos.x) - 1;
	//if pos.y > maxPos.y do pos.y = (pos.y % maxPos.y) - 1;
	
	return false;
}

Tile :: enum {
	Open,
	Tree,
}

Map :: struct {
	tiles: [dynamic][dynamic]Tile,
}

loadMap :: proc(s: string) -> (m: Map) {
	m.tiles = make([dynamic][dynamic]Tile, 0);
	
	lineIndex := 0;
	row := make([dynamic]Tile, 0);
	append(&m.tiles, row);
	rowPtr := &m.tiles[lineIndex];
	
	for r in s {
		if r == '\n' {
			lineIndex += 1;
			
			row = make([dynamic]Tile, 0);
			append(&m.tiles, row);
			rowPtr = &m.tiles[lineIndex];
		} else if r == '#' do append(rowPtr, Tile.Tree);
		else if r == '.' do append(rowPtr, Tile.Open);
	}
	
	return;
}

main :: proc() {
	input, err := os.read_entire_file("input.txt");
	inputStr := string(input);
	
	fileMap := loadMap(inputStr);
	for row in fileMap.tiles {
		for col in row {
			if col == .Open do fmt.printf(".");
			else if col == .Tree do fmt.printf("#");
		}
		fmt.println("");
	}
	
	count1 := checkSlope(&fileMap, Slope { 1, 1 });
	count2 := checkSlope(&fileMap, Slope { 3, 1 });
	count3 := checkSlope(&fileMap, Slope { 5, 1 });
	count4 := checkSlope(&fileMap, Slope { 7, 1 });
	count5 := checkSlope(&fileMap, Slope { 1, 2 });
	
	part1 := count2;
	part2 := count1 * count2 * count3 * count4 * count5;
	
	fmt.println(part1, part2);
}

checkSlope :: proc(fileMap: ^Map, slope: Slope) -> (count: int = 0) {
	currentPos := Pos { 0, 0 };
	maxPos := Pos { len(fileMap.tiles[0]) - 1, len(fileMap.tiles) - 1 };
	//fmt.println("Max: ", maxPos);
	
	for !advancePos(&currentPos, slope, &maxPos) {
		//fmt.println(currentPos);
		if fileMap.tiles[currentPos.y][currentPos.x] == .Tree do count += 1;
	}
	
	return count;
}