diff options
| author | Julian Hurst <julian.hurst@digdash.com> | 2024-12-03 18:47:51 +0100 |
|---|---|---|
| committer | Julian Hurst <julian.hurst@digdash.com> | 2024-12-03 18:47:57 +0100 |
| commit | 190f522242b2e91eb3213e828a26886aa7847f3a (patch) | |
| tree | 04122a22aa1e92d6f3efe21436d2e75650c1c4c1 /two/2.ha | |
| parent | 92524aa912db99becc1b3446d5b68b9cc089c721 (diff) | |
| download | aoc24-190f522242b2e91eb3213e828a26886aa7847f3a.tar.gz | |
Refactor and add tests
Folders need to have 'sensible' names for hare test to detect them.
Diffstat (limited to 'two/2.ha')
| -rw-r--r-- | two/2.ha | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/two/2.ha b/two/2.ha new file mode 100644 index 0000000..aea9ea8 --- /dev/null +++ b/two/2.ha @@ -0,0 +1,62 @@ +use fmt; +use bufio; +use os; +use strings; +use strconv; +use io; + +export fn main() void = { + do(os::stdin); +}; + +fn do(h: io::handle) int = { + const sc = bufio::newscanner(h); + defer bufio::finish(&sc); + + let safereports = 0; + for (const line => bufio::scan_line(&sc)!) { + const spl = strings::split(line, " "); + defer free(spl); + let safe = true; + let inc: (bool | void) = void; + for (let i = 1z; i < len(spl); i += 1) { + const s1 = strconv::stoi(spl[i-1])!; + const s2 = strconv::stoi(spl[i])!; + const diff = if (s1 < s2) { + match (inc) { + case void => + inc = true; + case let inc: bool => + if (!inc) { + safe = false; + break; + }; + }; + yield s2 - s1; + } else { + match (inc) { + case void => + inc = false; + case let inc: bool => + if (inc) { + safe = false; + break; + }; + }; + yield s1 - s2; + }; + if (diff <= 0 || diff > 3) { + safe = false; + break; + }; + }; + if (safe) { + fmt::printfln("{}: Safe", line)!; + safereports += 1; + } else { + fmt::printfln("{}: Unsafe", line)!; + }; + }; + fmt::printfln("{} reports are safe", safereports)!; + return safereports; +}; |
