🍯 Glaze

package main

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

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

	games := make([dynamic]Game, 0, 100)

	for i := 0; i < len(data); i += 4 {
		current := data[i:i + 4]
		append(&games, Game{rune(current[0]), rune(current[2])})
	}

	return games
}

Game :: [2]rune

// rock 0, paper 1, scissors 2
losing_moves := []int{1, 2, 0}
winning_moves := []int{2, 0, 1}

get_score :: proc(game: Game) -> int {
	score: int
	elf_shape := int(game[0]) - 'A'
	player_shape := int(game[1]) - 'X'

	if elf_shape == player_shape {
		score = 3
	} else {
		if losing_moves[elf_shape] == player_shape {
			score = 6
		}
	}
	score += player_shape + 1

	return score
}

task1 :: proc(games: []Game) -> int {
	total_score: int
	for game in games {
		score := get_score(game)
		total_score += score
	}
	return total_score
}

task2 :: proc(games: []Game) -> int {
	total_score: int
	for game in games {
		move: rune
		elf_shape := int(game[0]) - 'A'
		switch game[1] {
		// Lose
		case 'X':
			move = rune(winning_moves[elf_shape] + 'X')
		// Draw
		case 'Y':
			move = rune(elf_shape + 'X')
		// Win
		case 'Z':
			move = rune(losing_moves[elf_shape] + 'X')
		}
		score := get_score({game[0], move})
		total_score += score
	}
	return total_score
}

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

	result1 := task1(games[:])
	fmt.printf("Task 1 result: %v\n", result1)

	result2 := task2(games[:])
	fmt.printf("Task 2 result: %v\n", result2)
}