6D2XXW3FQUKFRBRWDCV4CR62HKSOX45FAF4JBPKJV5KZN6USLESAC 20x3x1115x27x56x29x730x15x919x29x2110x4x151x26x41x5x1810x15x2310x14x203x5x1829x23x307x4x1022x24x2930x1x219x2x511x9x2223x15x1011x11x1030x28x522x5x46x26x2016x12x3010x20x525x14x2416x17x2211x28x261x11x101x24x1513x17x2130x3x1320x25x1722x12x522x20x249x2x146x18x827x28x2411x17x11x4x125x20x1324x23x2322x1x2518x19x55x23x138x16x420x21x91x7x118x30x173x30x96x16x1822x25x279x20x2616x21x235x24x1715x17x1526x15x1022x16x320x24x248x18x1023x19x161x21x2423x23x914x20x625x5x516x3x129x29x2011x4x2610x23x2429x25x1627x27x229x7x226x21x1825x11x1914x13x315x28x1714x3x1229x8x1930x14x2020x23x48x16x54x11x1820x8x2421x13x2114x26x2927x4x1727x4x255x28x623x24x1129x22x530x20x623x2x1011x4x727x23x610x20x198x20x225x29x2216x13x22x11x146x12x43x13x616x5x1825x3x2821x1x520x16x1928x30x2726x7x1825x27x2411x19x721x19x172x12x2720x5x148x5x86x24x87x28x203x20x285x20x3013x29x126x29x519x28x255x19x1111x20x224x23x119x25x123x10x63x14x1028x16x1223x12x223x12x1920x28x109x10x2516x21x161x18x209x4x263x25x817x16x289x28x1627x3x1217x24x1213x21x107x17x136x10x97x29x2511x19x301x24x520x16x2324x28x216x29x1925x2x1912x5x2625x29x1216x28x2226x26x159x13x510x29x71x24x1622x2x26x16x133x12x284x12x1314x27x2114x23x267x5x188x30x2715x9x1826x16x53x29x1719x7x1816x18x126x15x3024x30x2113x20x74x12x1027x20x1128x29x2120x14x3028x12x319x1x84x8x621x14x227x19x2117x24x1415x18x1118x7x2625x28x2927x26x918x12x1724x28x2513x24x1426x9x289x3x309x2x98x1x2918x30x1018x14x526x8x3012x1x130x5x2826x17x2110x10x1020x7x2713x17x621x13x172x16x87x9x915x26x411x28x2510x6x1921x6x2915x5x628x9x1614x3x1012x29x522x19x1925x15x2230x6x2811x23x1320x25x1426x1x136x14x1516x25x1728x4x1310x24x254x13x109x15x1615x24x622x9x1911x11x84x19x1224x5x427x12x137x27x162x6x929x27x1518x26x2319x16x1514x5x259x16x304x6x413x10x101x8x2923x5x1719x20x2011x27x2427x15x515x11x1221x11x31x13x2217x8x813x14x1417x22x79x5x82x6x325x9x1511x8x139x25x123x16x1212x16x816x24x174x6x2622x29x1114x17x1928x2x2724x22x1922x20x3023x28x416x12x1422x24x2229x1x2826x29x163x25x3027x3x1322x24x2625x3x27x24x210x5x328x8x2925x6x412x17x1424x3x523x27x726x23x3011x10x1923x7x1126x14x1514x3x2512x24x142x14x129x12x169x2x283x8x222x6x92x30x225x1x920x11x214x11x127x14x1224x8x2613x21x2318x17x2313x6x1720x20x1913x17x297x24x2423x8x619x10x283x8x2115x20x1811x27x111x24x2813x20x1118x19x2227x22x1228x3x213x4x2926x5x614x29x257x4x75x17x72x8x122x30x2422x21x281x28x1311x20x425x29x199x23x430x6x1125x18x1028x10x243x5x2019x28x1027x19x226x20x419x21x62x12x308x26x2711x27x1014x13x174x3x212x20x2122x30x32x23x23x16x1222x28x223x23x298x25x159x30x410x11x124x8x2010x7x277x22x427x13x175x28x530x15x1310x8x178x21x58x17x2625x16x49x7x2513x11x206x30x915x14x1230x1x235x20x2422x7x626x11x2329x7x513x24x2822x20x1018x3x115x19x2328x28x207x26x29x12x2015x4x61x17x213x22x179x4x2025x19x59x11x2214x1x1714x5x1630x5x1819x6x1228x16x2213x4x2529x23x181x27x312x14x410x25x1915x19x3011x30x411x22x2613x25x217x13x2711x30x2415x1x1417x18x426x11x316x22x2813x20x91x18x325x11x1220x21x122x27x48x28x237x13x2717x9x2627x27x2011x20x1226x21x1129x14x1227x25x128x29x2521x23x285x18x1819x5x47x6x3027x8x1112x24x1216x25x2226x11x2925x22x1715x23x2317x9x630x10x1621x3x518x27x228x21x1416x18x174x18x29x1x149x1x95x27x128x16x303x19x1916x26x241x6x915x14x311x7x198x19x317x26x266x18x1119x12x429x20x1620x17x236x6x520x30x1918x25x182x26x23x1x114x25x183x1x611x14x1817x23x2725x29x96x25x2020x10x917x5x1829x14x814x25x2610x15x2923x19x1122x2x24x5x513x23x2519x13x1920x18x630x7x2826x18x1729x18x1030x29x112x26x2418x17x2629x28x153x12x2024x10x830x15x628x23x1514x28x1110x27x1914x8x2124x1x231x3x276x15x68x25x2613x10x256x9x810x29x2926x23x514x24x125x6x2217x11x181x27x2618x25x2320x15x62x21x282x10x1312x25x142x14x2330x5x2329x19x2129x10x2514x22x1617x11x2612x17x308x17x720x25x2820x11x3015x1x1213x3x2416x23x2327x3x326x3x2718x5x1212x26x719x27x1220x10x2830x12x253x14x1021x26x124x26x267x21x303x29x1229x28x55x20x727x11x215x20x416x15x1519x13x77x17x1527x24x159x17x2820x21x1414x29x2923x26x1327x23x2118x13x626x16x2118x26x279x3x1230x18x2412x11x295x15x11x16x314x28x112x18x119x18x1918x28x212x3x1422x16x528x18x2824x16x187x4x1019x26x1924x17x725x9x625x17x720x22x203x3x723x19x1521x27x211x23x119x19x422x4x186x15x515x25x223x11x2027x16x627x8x510x10x1922x14x17x1x298x11x1727x9x2728x9x2417x7x326x23x87x6x3025x28x21x30x253x18x1828x27x1514x14x110x25x2918x12x920x28x1626x27x228x26x121x2x1225x16x1421x19x512x9x2216x5x45x4x1625x29x34x29x1315x16x298x11x2430x11x2017x21x1412x24x1010x12x63x26x3015x14x2520x12x2113x11x1615x13x35x17x296x3x239x26x1130x1x814x10x3018x30x1013x19x1916x19x1728x7x1028x29x43x21x104x28x247x28x92x4x925x27x136x12x154x18x2020x1x165x13x2411x11x1012x9x231x9x3017x28x249x5x2721x15x1617x4x148x14x413x10x717x12x149x19x192x7x218x24x2319x5x1211x23x2113x3x15x27x1512x25x2513x21x169x17x111x15x214x26x1711x5x1523x10x1512x17x2127x15x14x29x145x24x2510x10x1218x12x911x24x2324x23x328x12x1529x9x1411x25x85x12x226x26x299x21x28x8x251x16x3017x29x209x22x137x18x163x3x2326x25x3015x23x2420x23x520x16x1023x7x820x18x268x27x630x23x237x7x2421x11x151x30x2526x27x2230x28x1320x13x133x1x1516x7x17x25x1512x7x1816x9x2316x12x1829x5x217x7x721x17x59x9x1726x16x1029x29x2317x26x105x19x171x10x114x21x2013x6x413x13x323x4x184x16x316x30x112x11x215x30x1520x30x2218x12x1623x5x166x14x159x4x1130x23x2120x7x127x18x615x6x518x22x1916x10x2226x20x259x25x2529x21x109x21x247x18x2114x3x1518x19x194x29x1714x10x92x26x1413x3x244x4x176x27x242x18x314x25x230x14x1711x6x144x10x1815x4x227x7x1013x24x17x12x625x22x2619x2x1823x29x22x15x412x6x916x14x299x17x321x9x1223x18x2210x8x429x2x719x27x154x24x2725x20x148x23x191x24x196x20x1015x8x518x28x517x23x229x16x1330x24x426x3x1312x22x1829x17x2926x4x1615x7x209x15x3012x7x1828x19x1811x23x2324x20x120x3x241x26x114x10x65x27x2413x21x1220x20x56x28x911x26x1126x29x1221x4x1120x11x1722x27x2019x11x212x11x1113x5x712x10x2521x28x115x30x1728x19x14x19x1211x4x124x10x3011x18x522x20x123x7x2720x26x413x27x2623x14x134x19x726x27x1620x5x2018x5x819x21x122x8x129x4x124x10x1524x9x2010x3x829x30x32x8x2416x7x182x11x2323x15x1621x12x624x28x96x1x1314x29x2027x24x1316x26x85x6x1721x8x128x19x211x14x1618x2x929x28x1022x26x2718x26x2322x24x228x26x127x29x1230x13x111x25x513x30x183x13x2222x10x112x7x718x17x89x22x2630x18x1610x2x37x27x133x20x169x21x161x18x1521x30x304x25x233x11x75x6x1227x1x2013x15x2423x29x213x5x2422x16x1528x14x329x24x92x20x430x10x423x7x2022x12x213x19x114x28x285x4x728x12x252x16x2623x20x75x21x299x21x169x6x109x6x424x14x2928x11x610x22x121x30x2013x17x82x25x2419x21x328x8x146x29x2827x10x2830x11x1217x2x1014x19x172x11x426x1x213x4x423x20x182x17x2128x7x153x3x2724x17x3028x28x2021x5x2913x12x1924x29x2919x10x619x12x1421x4x1727x16x14x17x3023x23x1823x15x2726x2x1112x8x815x23x2630x17x1517x17x1524x4x309x9x1014x25x2025x11x1920x7x19x21x37x19x910x6x1926x12x3021x9x2015x11x630x21x910x18x1722x9x88x30x2628x12x2717x17x711x13x85x3x2124x1x291x28x218x28x108x29x1426x26x2717x10x2522x30x327x9x1321x21x430x29x1622x7x2024x10x216x29x1728x15x1719x19x229x8x626x23x2425x4x2716x12x211x6x1819x14x89x29x1323x30x1910x16x14x21x2823x25x2519x9x1630x11x1224x3x928x19x418x12x97x1x2528x7x124x3x1230x24x2227x24x269x30x3029x10x84x6x1810x1x1510x4x2623x20x166x3x1430x8x1625x14x2011x9x315x23x258x30x2222x19x1825x1x1227x25x725x23x313x20x85x30x718x19x2720x23x31x17x2121x21x2713x1x247x30x2021x9x1823x26x622x9x2917x6x2128x28x2919x25x269x27x215x26x811x19x110x1x1829x4x821x2x2214x12x8
const std = @import("std");const Str = []const u8;const PATH = "input/day02.txt";pub fn first(allocator: ?std.mem.Allocator) !usize {_ = allocator;const input = @embedFile(PATH);return try wrapPaper(input);}pub fn second(allocator: ?std.mem.Allocator) !usize {_ = allocator;const input = @embedFile(PATH);return try wrapRibbon(input);}fn wrapPaper(input: Str) !usize {var lines = std.mem.tokenize(u8, input, "\n");var total: usize = 0;while (lines.next()) |line| {var lwh = std.mem.tokenize(u8, line, "x");const l = try std.fmt.parseUnsigned(usize, lwh.next().?, 10);const w = try std.fmt.parseUnsigned(usize, lwh.next().?, 10);const h = try std.fmt.parseUnsigned(usize, lwh.next().?, 10);const size = 2 * l * w + 2 * w * h + 2 * h * l + std.math.min3(l * w, w * h, h * l);total += size;}return total;}fn wrapRibbon(input: Str) !usize {var lines = std.mem.tokenize(u8, input, "\n");var total: usize = 0;while (lines.next()) |line| {var lwh = std.mem.tokenize(u8, line, "x");const l = try std.fmt.parseUnsigned(usize, lwh.next().?, 10);const w = try std.fmt.parseUnsigned(usize, lwh.next().?, 10);const h = try std.fmt.parseUnsigned(usize, lwh.next().?, 10);const max = std.math.max3(l, w, h);const ribbon = blk: {var rr: usize = undefined;if (l == max) {rr = w + w + h + h;} else if (w == max) {rr = l + l + h + h;} else if (h == max) {rr = l + l + w + w;} else unreachable;break :blk rr;};const bow = l * w * h;total += ribbon + bow;}return total;}test "2x3x4" {try std.testing.expectEqual(@as(usize, 58), try wrapPaper("2x3x4"));try std.testing.expectEqual(@as(usize, 34), try wrapRibbon("2x3x4"));}test "1x1x10" {try std.testing.expectEqual(@as(usize, 43), try wrapPaper("1x1x10"));try std.testing.expectEqual(@as(usize, 14), try wrapRibbon("1x1x10"));}test "day02a" {try std.testing.expectEqual(@as(usize, 1606483), try first(std.testing.allocator));}test "day02b" {try std.testing.expectEqual(@as(usize, 3842356), try second(std.testing.allocator));}