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; };