owlgo 0.1.7

A lightweight CLI to assist in solving CP problems
const std = @import("std");
const stdin = std.fs.File.stdin();
const stdout = std.fs.File.stdout();

pub fn main() !void {
    var stdin_buff: [1024]u8 = undefined;
    var stdout_buff: [1024]u8 = undefined;

    var r = stdin.readerStreaming(&stdin_buff);
    var w = stdout.writerStreaming(&stdout_buff);

    var r_need = try nextInt(i16, &r.interface);
    var g_need = try nextInt(i16, &r.interface);
    var b_need = try lastInt(i16, &r.interface);

    const r_have = try nextInt(i16, &r.interface);
    const g_have = try nextInt(i16, &r.interface);
    const b_have = try lastInt(i16, &r.interface);

    var rg_avail = try nextInt(i16, &r.interface);
    var gb_avail = try lastInt(i16, &r.interface);

    r_need = @max(r_need - r_have, 0);
    g_need = @max(g_need - g_have, 0);
    b_need = @max(b_need - b_have, 0);

    rg_avail -= r_need;
    gb_avail -= b_need;

    if (rg_avail < 0 or gb_avail < 0 or rg_avail + gb_avail < g_need) {
        try print("-1\n", .{}, &w.interface);
        return;
    }

    try print("{d}\n", .{r_need + g_need + b_need}, &w.interface);
}

fn lastInt(comptime T: type, r: *std.Io.Reader) !T {
    const token = try r.takeDelimiterExclusive('\n');
    _ = try r.take(1);
    return try std.fmt.parseInt(T, token, 10);
}

fn nextInt(comptime T: type, r: *std.Io.Reader) !T {
    const token = try r.takeDelimiterExclusive(' ');
    _ = try r.take(1);
    return try std.fmt.parseInt(T, token, 10);
}

fn print(comptime fmt: []const u8, args: anytype, w: *std.Io.Writer) !void {
    try w.print(fmt, args);
    try w.flush();
}