summaryrefslogtreecommitdiff
path: root/day6/part1/main.ha
blob: eb57bf0458242a6dfad1d29613f99ee78028629f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
use errors;
use fmt;
use io;
use os;
use strconv::{stoi};
use strings::{dupall, freeall, fromutf8_unsafe, split};

fn solve(problems: []([32]int, str)) (u64 | errors::invalid) = {
	let result = 0u64;

	for (let (numbers, operation) .. problems) {
		let problem_result = 1u64;

		if (operation == "*") {
			for (let number .. numbers) {
				if (number == 0) break;
				problem_result *= number: u64;
			};
		} else if (operation == "+") {
			problem_result = 0;

			for (let number .. numbers) {
				if (number == 0) break;
				problem_result += number: u64;
			};
		} else return errors::invalid;

		result += problem_result;
	};

	return result;
};

export fn main() void = {
	let handle = os::open("input.txt")!;
	defer io::close(handle)!;

	let buf = io::drain(handle)!;
	defer free(buf);

	let lines = split(fromutf8_unsafe(buf), "\n")!;
	delete(lines[len(lines) - 1]);
	defer free(lines);

	let problems: []([32]int, str) = [];
	defer free(problems);

	for (let i = 0z; i < len(lines); i += 1) {
		let values = split(lines[i], " ")!;
		defer free(values);

		let value_offset = 0z;

		for (let j = 0z; j < len(values); j += 1) {
			if (values[j] == "") {
				value_offset += 1;
				continue;
			};

			if (i == 0) {
				append(problems, ([0...], " "))!;
				problems[j - value_offset].0[i] = stoi(values[j])!;
			} else if (i == len(lines) - 1) {
				problems[j - value_offset].1 = values[j];
			} else {
				problems[j - value_offset].0[i] = stoi(values[j])!;
			};
		};
	};

	let answer = solve(problems)!;

	fmt::printfln("Answer: {}", answer)!;
};