I2F5R3WUAQR4YWAZPUJ6FVZYMFLOEO7I2BQFW4JFKTDHPR5ERBYQC const std = @import("std");const path = "../data/day03/input.txt";const retSize = u24;const lineSize = getLineSize();fn first() anyerror!retSize {const input = @embedFile(path);var lines = std.mem.split(u8, input, "\n");var ones: [lineSize]retSize = undefined;var zeros: [lineSize]retSize = undefined;while (lines.next()) |line| {for (line) |bit, idx| {if (bit == '0') {zeros[idx] += 1;} else {ones[idx] += 1;}}}var gammaRate: [lineSize]u8 = undefined;var epsilonRate: [lineSize]u8 = undefined;for (ones) |val, i| {if (val > zeros[i]) {gammaRate[i] = '1';epsilonRate[i] = '0';} else {gammaRate[i] = '0';epsilonRate[i] = '1';}}const gr = try std.fmt.parseUnsigned(retSize, &gammaRate, 2);const er = try std.fmt.parseUnsigned(retSize, &epsilonRate, 2);return gr * er;}fn second() anyerror!retSize {const input = @embedFile(path);var lines = std.mem.tokenize(u8, input, "\n");var buffer: [1000 * lineSize * 100]u8 = undefined;var fba = std.heap.FixedBufferAllocator.init(&buffer);const allocator = fba.allocator();var oxigen: std.BufSet = std.BufSet.init(allocator);defer oxigen.deinit();var co2: std.BufSet = std.BufSet.init(allocator);defer co2.deinit();while (lines.next()) |line| {try oxigen.insert(line);try co2.insert(line);}const ox = try getOxigenRating(&oxigen);const co = try getCO2Rating(&co2);return ox * co;}fn getOxigenRating(oxigen: *std.BufSet) anyerror!retSize {var idx: usize = 0;while (oxigen.count() > 1) : (idx += 1) {var ones: retSize = 0;var zeros: retSize = 0;// count ones and zerosvar it = oxigen.iterator();while (it.next()) |line| {if (line.*[idx] == '1') {ones += 1;} else if (line.*[idx] == '0') {zeros += 1;} else unreachable;}it = oxigen.iterator(); // reset iteratorwhile (it.next()) |line| {if (ones >= zeros) {if (line.*[idx] != '1') {oxigen.remove(line.*);}} else {if (line.*[idx] != '0') {oxigen.remove(line.*);}}}}return try std.fmt.parseUnsigned(retSize, oxigen.iterator().next().?.*, 2);}fn getCO2Rating(co2: *std.BufSet) anyerror!retSize {var idx: usize = 0;while (co2.count() > 1) : (idx += 1) {var ones: retSize = 0;var zeros: retSize = 0;// count ones and zerosvar it = co2.iterator();while (it.next()) |line| {if (line.*[idx] == '1') {ones += 1;} else if (line.*[idx] == '0') {zeros += 1;} else unreachable;}it = co2.iterator(); // reset iteratorwhile (it.next()) |line| {if (zeros <= ones) {if (line.*[idx] != '0') {co2.remove(line.*);}} else {if (line.*[idx] != '1') {co2.remove(line.*);}}}}return try std.fmt.parseUnsigned(retSize, co2.iterator().next().?.*, 2);}fn getLineSize() usize {const input = @embedFile(path);var ret: usize = 0;for (input) |bit, idx| {if (bit == '\n') {ret = idx;break;}}return ret;}pub fn main() anyerror!void {var timer = try std.time.Timer.start();_ = try first();const f = timer.lap() / 1000;_ = try second();const s = timer.lap() / 1000;std.debug.print("Day 2 \t\tfirst: {d}µs \t\tsecond: {d}µs\n", .{ f, s });}test "first" {try std.testing.expectEqual(@as(retSize, 3847100), try first());}test "second" {try std.testing.expectEqual(@as(retSize, 4105235), try second());}
011110111101110010010001111011111111110011010100111100000011010101001001010101000010100111101000110110101110001001101000101100100110101001100110101110000110011111111100110010000101000011111001101000110001100111011101011011011011111100000100010100101100110010000110101000001101010100110011111101101100100101000011101000100111111010010000011111000110110100101010011010000000101110100111010000001000001111001010001011101011100001110010001100100100111110011110000011101011101100111011000000101011101000000100001000101011110101000111011010111011100011101011110101011000001110110010100011101110001101011001000101100100010000101100100010001100100101001010011010110001111001110110111101111101000010011000110100111000011010000100000000010110100000001001110101101001111010100001101011110000110100101111010000010110111010110100011110010110001100001111001110001110111001110101010111000110101111001101010011010011000001110101101100010001111101110011101000010101100110011001010101011101111111101110010011010010110000101111100101111001011110100110111100110000100000111000011010011111101001101110110001110111101011001111010101110010000110001100101110011011000111111100001001011110010000100101110110111101001000011001011011110101100000001011010110000011110011001100110000110010111000110111110000001000011110101001001111101010001111000111100010100010001001010100001101101001000011000011101010101101101101011000000010001000011101110101000001011110001000101001000110000000100010111011001111111111001101110101001101100100101000011110010001010101111011010000000011011101101101001010010000110001111110011000110011100111000110111100010110001101010100010100101010100001011010111001010001100100010100111011010010010111011100011011101110110111011111101000101110001101001001100111101100101010100001010101100101000101101000000011110000101110001000111000011100000000101100111110000100101001010100111111000101110000101111100010110011101110011001000100111001001000000001111010100100010011101010101001010110010000110011110111101000010000100000101010110010011010001001001111001011011000011101100110100101101010110010111100110000100100010010001100010011010101110011000010101111110010001011010001001011001010100000001010000110010010000111101111110011101100110100110010100100010100010001100010001101101111111110110001111101000101000101101111000100110100001000111011011000111000101000011001110110110000111111111010000000001010000010101010001000001001101001100101001001000101101111110111101101001100001110111011101000111101010100000000110011011011000110100001100110111010000011100001010000010111110111011100111100001011001111011001000011011100111110011011010110000010001000010100011110011110111100001101110011100101011111110000100111011010000000111011111111001010010100111100000101111000110010011111110111101001100011000001111001100010100101000001010111111101110010110001001101001001100101101001011000110101101110011001101111101010100111010001011100111000001100000111001110011110010010000101010010110001111010001101000010110001010110101110011111111000100000101001111101011101000001010100000011001011110000011100000011001110110101010110011000110011000111111000100000110000001010101010001001101001011101011011100011110000111011011000111101110100000001010110100011110100101101000010000011011011101011110110100001101011010111100000000011000010000111001111011001100100110110010010000011110111101001001011010110110101001100000110000111101110110011010011101001010010010011110100110101011010101100101011101110010110010000000011010001101001101010011110010101100001100100000110000010010111101100101110000111000001110100111111010011100000011101110000011111011110101011011110100011110010001100011100011010010111101010011001110100100110001011100111001001101110010001001000101111100100101011010001100101100001010000101001000100000011101011101000000001100101110001101111001110000111010010000110101001101101100110011000100110000110000000110010000111100001001000101110110000000111110011101111101110010010110010001110101111011010000001000000110010100111100111010111001100101111001110111001111100011100011000010100100101101101100001001110111110100011101111001000010111000100110001110010001110101111101000000111010001010111000000000111010001111100011100000110010100010000101000010001101110000100111111110001110000001101111001111111000100011111111001101000001011111111110100001011111011000001001111101101101011110100101010110010101111110011011100100100001101011110000100001011100001011101101000010110001011110111110101000101011011011110001010000001000111000010100101001001000001110010110100010011111100101101100111011001000110101111101010000100011101011000001110000010001000111101110000011000010010010110100101011000000010010100110001101010101010000110111111010010001111001000110100101001010001000001001111110010110001011011111100000001011011110111111001001111110010000100100101111011001000111001111010001010101100100100101000111110000100101110111000101001001001010110100100101101111111011100111001110011011111001100101010101100000011010001110111001110010100000111110011100000101001000010000111101001010100011111011101001001100110010010100110101010010001110010011101000101001111100010011010111111110110001110010010010000101100110011111111011101000011000101100000111100111101010011100111010011110010011011000011111100011110011000101100000101111110000011100100001011000010011001111000011101111000110101110010100010101001010100010001110011001101001011010000101111111011100000000110000111000011100000000101011101000101100001011100100000011100001011011110111011111110010010111000010110000110001110111100011001010110000110000001010111100001111001100111100001011000111011111111101001001000000001001101100011111101010100001101110001110100111011000111011010000111110100010100000011010001110101101100000011110011111000010010101001101111011100101101101101111110000100001011000000010100001110001001011011011000011101110111110101101010010111110101000010111111000000101010101110101100110101100110001011011010110010000010110010000101001001000011110011101010111111011000101101111001100101000110101001110100000001110010000001111011011110101110110101000001111001100100011011011111111001100111101110101010010011000010110000011110111010000011110100101010010001110000011001100100110010100110100110110000110001100111010100000111011100110001000100011000010010101111111110011100011100000001001110111101101000110011001011010001000110000111000000000001001001100100011100101111011101000111001001010001011111001100100101011101000100011001110101100111100110010110000100111011100011110000011010011000101111100010100011111101001111000111010110011001110000101101011011010011000111110001101100000100001110110101111000111100001110100101011110111011101110110010101111110111101101110100011001000111111111011001101110001100010000110011110000011010110101011110111100100001110000110101101110000010001100011001101100100000110110100111110111101110001100010101000011110001110001011001011001011001111001111010011001110011011010001011011110111000000100101110111001110000111010101010110101110001011111011001011111101110010101010110110111010101100101010111111000010000011101100111010000100001111101001101111010001000000011010110111011010001110111000011001000110001111010111101001001110000000100111100001000111010000110000100011110110101101011001011110100011101011001110101010100110010011001100101001111100110110100000101001101001011101110101000001010001100101010100010011011100011100001000101011111111001100110101110101011111101111100001000001010001100010100111010100111000101110001001010100001001111110110110110101000110110000110011110111110100111110001011000001110110101010011010110001110111110010001100101111000001111100101110011001010111101010010111111000011001100101011100001101100100001110110110000000001000101001011111111110111000100010000101010110011111001101011010111100010001000011011010010110011001010111101010011011011011110000001010101011111001011101100010000010000111001100111111001010011111000111010001100011110010111011101010110000111010101100010011110011100100101000111011010000111000101010111100101001100011010110011011000011110010011110101111000101111111010101111101111010110100100101000101011111100100001001000000100010101001001100000110100100001100011110001101110110110110011000100011001000101111001110111111011010110101110110010100110111001110101011011110110000011000111101101100011010010111000100101010001100000010011111001010101010101110011110101100000100110110010101000000100110101010010110111111000001001001011111011010000111001111011001110011101110110010001111001111001111110101010101111101111111101110011101010010011000110101001111010101110000101000010000110111110000111001010111011010110011111001011101101011101011110000010000010101011010011011100011000111000100011011111011111110000001010000100000100101010111101110000111000001100110000111111011010110100110000000000000000101001000000110010110101011011001100101101101110010110100011101111000000111011100101110100100010010111000001110110011000011101111110000010110110111000000011001101110010100000110011000110000011100111110000011110110011111010101010010010001011101111000110001010000011101111010000011000111001001001111101010100011001000000010011001111001001011000010000011001111111100010101001010000100011111111101101011011001000011001010011111011011001010001110110110010110000000000000011110110000000011101001101011010000101101011100110001101010010100000000100100100010001100110011111111100001010001100011111000100000110011011010010011010001100011111101011011010101001110111000110110000110110011110110000010011011101010011100100000110111001111011111001101111010010011000111100101111111010110011000001000100011000110101110100011001101010100011011101001011110011110010111110000110001101111011101001100110100001101011011010001000101010101011100111110110000001100100000010101100010011111001010101011100000101100010111100010110100010100100110001100111001001011101010010101101111000111100100111111011001000100111011111111001100001010001111011011110100100111111010101101011111110110101101100000100101111011110001000101101001110001111111010110011100110110110011100111111100000000000010001100100001101101000101110100001011010100011000100110011110110000000110100010110001010101000110000110110001001000001000101011111100111000011110101101111010101010101001111110111001111101001110010011001010111101000101010100100000111100011001011110010000000001000110001100010001101010001000010101101111111111001001011101001011100000100111100110000000101101010011101000101000111111000101100001100000100010010100101011010100010111000100110001001111010101001001111011000100011011000001100011110101111111011111110101001001010010000001111000000000101000111001010100001000111111101010001010011001111001110010000101101001001000110110111001101011011111100100010101010001000001001101100011110001101000101000011111101100111100110000010111010100101011010011110000000101000001011001000001001011010011100000100000011010101111110011100001101110110100011101111011001110010011100100111010101001100000101010000101001101001100101110111101101100110000101100010111011000011010010010011000111111110010101100011000001010010111100110010101011001010010110011110011001101111011100001010001111001100000110100011101011101010011111111110100011011011101010011111010001110001100010101101010101010011100001010001111010011000011110100010001111000101111101101010011110100000111110001101110010010100000001010011000100101100111000111111011111000011010000011001000110001011111100101110001000110101001011111100001111010001101000100101000101001100000110101010010010011111111101001000101110110011111100100110101010101011101010101010100000111001000101000001100010010101011000101000100100001111110111100011101100000000001011110001110011001111000001000011001100111011101100010000001111000001111100000101101010111011011111110010011111010001101011010100000111111011110000100110110111110000100101101110001011000001101100001101011100010010000110100110010101110111111100101011101101001101011011111110011100011001110010011100000001011100101110100110010001011100011111001010100111100101111111000010