summaryrefslogtreecommitdiff
path: root/three/3.ha
blob: 9668423d15cc63a739e0369cef2bd4b617f88d05 (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
use fmt;
use io;
use os;
use regex;
use strings;
use strconv;

export fn main() void = {
	do(os::stdin);
};

fn do(h: io::handle) int = {
	const in = io::drain(h)!;
	const sin = strings::trim(strings::fromutf8_unsafe(in));
	const re = regex::compile(`mul\([0-9]+,[0-9]+\)`)!;
	defer regex::finish(&re);

	const results = regex::findall(&re, sin);
	defer regex::result_freeall(results);
	let sum = 0;
	for (const result .. results) {
		for (let r .. result) {
			const idx1 = strings::index(r.content, ',');
			const idx2 = strings::index(r.content, ')');
			const arg1 = strings::sub(r.content, 4, idx1: size);
			const arg2 = strings::sub(r.content, idx1: size + 1, idx2: size);

			const a1 = strconv::stoi(arg1)!;
			const a2 = strconv::stoi(arg2)!;
			sum += a1 * a2;
			fmt::printfln("{} * {} = {}", a1, a2, a1 * a2)!;
		};
	};
	fmt::printfln("{}", sum)!;
	return sum;
};