master
Raw Download raw file
 1const std = @import("std");
 2const io = std.io;
 3const fmt = std.fmt;
 4
 5const BitCount = struct {
 6    zeros: u16,
 7    ones: u16,
 8};
 9
10const rll = 12;
11
12pub fn main() !void {
13    const stdin = io.getStdIn().reader();
14
15    var buf: [128]u8 = undefined;
16    var sum: [rll]BitCount = undefined;
17    for (sum) |_,i| {
18        sum[i] = BitCount{
19            .zeros = 0,
20            .ones = 0,
21        };
22    }
23
24    // Read from stdin, line by line
25    // TODO: sense rll to work with example or source input
26    while (try stdin.readUntilDelimiterOrEof(&buf, '\n')) |line| {
27        for (line) |char, i| {
28            if (char == '1') {
29                sum[i].ones += 1;
30            } else if (char == '0') {
31                sum[i].zeros += 1;
32            } else {
33                std.debug.print("PARSING ERROR: 0x{d}", .{char});
34            }
35        }
36    }
37    var gamma_binary: [rll]u8 = undefined;
38    var epsilon_binary: [rll]u8 = undefined;
39    for (sum) |_,i| {
40        if (sum[i].zeros > sum[i].ones){
41            gamma_binary[i] = '0';
42            epsilon_binary[i] = '1';
43        } else {
44            gamma_binary[i] = '1';
45            epsilon_binary[i] = '0';
46        }
47    }
48    const gamma = fmt.parseUnsigned(u32, gamma_binary[0..gamma_binary.len], 2) catch |err| {
49        std.debug.print("PARSE ERR: {} {s}\n", .{ err, gamma_binary });
50        return err;
51    };
52    const epsilon = fmt.parseUnsigned(u32, epsilon_binary[0..epsilon_binary.len], 2) catch |err| {
53        std.debug.print("PARSE ERR: {} {s}\n", .{ err, gamma_binary });
54        return err;
55    };
56    std.debug.print("gamma:   0b{s} {d}\n", .{gamma_binary, gamma});
57    std.debug.print("epsilon: 0b{s} {d}\n", .{epsilon_binary, epsilon});
58    std.debug.print("power:   {d}\n", .{epsilon * gamma});
59}