package main import "core:bytes" import "core:fmt" import "core:io" import "core:os" import "core:slice" import "core:sort" import "core:strconv" Elf :: struct { total_calories: int, } parse_input_file :: proc(filepath: string) -> [dynamic]Elf { data, ok := os.read_entire_file_from_filename(filepath) if !ok { panic("oh no, could not read file") } buf: bytes.Buffer bytes.buffer_init(&buf, data) defer bytes.buffer_destroy(&buf) elves := make([dynamic]Elf, 0, 100) line: string err: io.Error current_calories: int for ; err != .EOF; line, err = bytes.buffer_read_string(&buf, '\n') { if line == "\n" { append(&elves, Elf{total_calories = current_calories}) current_calories = 0 continue } current_calories += strconv.atoi(line) } return elves } task1 :: proc(elves: []Elf) -> int { highest_calories: int for elf in elves { if elf.total_calories > highest_calories { highest_calories = elf.total_calories } } return highest_calories } sum_calories :: proc(elves: []Elf) -> int { sum: int for elf in elves { sum += elf.total_calories } return sum } task2 :: proc(elves: []Elf) -> int { sorted_elves := slice.clone(elves) defer delete(sorted_elves) sort.quick_sort_proc(sorted_elves, proc(a, b: Elf) -> int { return b.total_calories - a.total_calories }) return sum_calories(sorted_elves[:3]) } main :: proc() { elves := parse_input_file("input.txt") defer delete(elves) result1 := task1(elves[:]) fmt.printf("Task 1 result: %v\n", result1) result2 := task2(elves[:]) fmt.printf("Task 2 result: %v\n", result2) }