Initial commit

This commit is contained in:
Kienan Stewart 2020-12-11 16:13:51 -05:00
commit 59f432a8ef
21 changed files with 7266 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
zig-cache/

200
day1/input-part1 Normal file
View File

@ -0,0 +1,200 @@
1322
1211
1427
1428
1953
1220
1629
1186
1354
1776
1906
1849
1327
1423
401
1806
1239
1934
1256
1223
1504
1365
1653
1706
1465
1810
1089
1447
1983
1505
1763
1590
1843
1534
1886
1842
1878
1785
1121
1857
1496
1696
1863
1944
1692
1255
1572
1767
1509
1845
1479
1935
1507
1852
1193
1797
1573
1317
1266
1707
1819
925
1976
1908
1571
1646
1625
1719
1980
1970
1566
1679
1484
1818
1985
1794
1699
1530
1645
370
1658
1345
1730
1340
1281
1722
1623
1148
1545
1728
1325
1164
1462
1893
1736
160
1543
1371
1930
1162
2010
1302
1967
1889
1547
1335
1416
1359
1622
1682
1701
1939
1697
1436
1367
1119
1741
1466
1997
1856
1824
1323
1478
1963
1832
1748
1260
1244
1834
1990
1567
1147
1588
1694
1487
1151
1347
1315
1502
546
730
1742
1869
1277
1224
1169
1708
1661
174
1207
1801
1880
1390
1747
1215
1684
1498
1965
1933
1693
1129
1578
1189
1251
1727
1440
1178
746
1564
944
1822
1225
1523
1575
1185
37
1866
1766
1737
1800
1633
1796
1161
1932
1583
1395
1288
1991
229
1875
1540
1876
1191
1858
1713
1725
1955
1250
1987
1724

94
day1/main.zig Normal file
View File

@ -0,0 +1,94 @@
const std = @import("std");
pub fn main() !void {
var allocator = std.heap.GeneralPurposeAllocator(.{}){};
var f = std.fs.File { .handle = try std.os.open("input-part1", std.os.O_RDONLY, 0) };
var buffer : [1024]u8 = undefined;
var expenses = std.ArrayList(u32).init(&allocator.allocator);
defer expenses.deinit();
var byte_buffer = std.ArrayList(u8).init(&allocator.allocator);
defer byte_buffer.deinit();
var read = try f.read(&buffer);
std.log.info("Read {} bytes", .{read});
while (read != 0) {
for (buffer) | v, k | {
if (std.ascii.isDigit(v)) {
try byte_buffer.append(v);
}
if (v == '\n') {
var x = atoi(byte_buffer.items[0..]);
//std.log.debug("{}", .{x});
try expenses.append(x);
// Set the position back to zero, without freeing existing memory
byte_buffer.deinit();
byte_buffer = std.ArrayList(u8).init(&allocator.allocator);
}
}
read = try f.read(&buffer);
//std.log.info("Read {} bytes", .{read});
}
//std.log.info("{}", .{expenses.items.len});
part1(expenses.items[0..]);
part2(expenses.items[0..]);
}
fn part2(expenses : []u32) void {
var i : u32 = 0;
var elements : [3]u32 = undefined;
while (i < expenses.len) : (i += 1) {
var j : u32 = 0;
while (j < expenses.len) : (j += 1) {
var k : u32 = 0;
while (k < expenses.len) : (k += 1) {
if (k == j or k == 1) {
continue;
}
if (expenses[i] + expenses[j] + expenses[k] == 2020) {
elements[0] = expenses[i];
elements[1] = expenses[j];
elements[2] = expenses[k];
}
}
}
}
std.log.info("{} and {} and {} sum to {} and multiply to {}",
.{elements[0], elements[1], elements[2], elements[0] + elements[1] + elements[2],
elements[0] * elements[1] * elements[2]});
}
fn part1(expenses : []u32) void {
var i : u32 = 0;
var elements : [2]u32 = undefined;
while (i < expenses.len) : (i += 1) {
var j : u32 = 0;
while (j < expenses.len) : (j += 1) {
if (i == j) {
continue;
}
if (expenses[i] + expenses[j] == 2020) {
elements[0] = expenses[i];
elements[1] = expenses[j];
}
}
}
std.log.info("{} and {} sum to {} and multiply to {}",
.{elements[0], elements[1], elements[0] + elements[1],
elements[0] * elements[1]});
}
fn atoi(a: []u8) u32 {
var i : u32 = 0;
for(a) |v, k| {
if (! std.ascii.isDigit(v)) {
std.log.warn("Byte {x} is not a digit", .{v});
continue;
}
// 48 is '0' in ascii
std.debug.assert(v >= 48 and v < 58);
i += @as(u32, (v - 48) * std.math.pow(u32, 10, @intCast(u32, a.len - k - 1)));
}
//std.log.debug("{x} --> {}", .{a, i});
return i;
}

1000
day2/input Normal file

File diff suppressed because it is too large Load Diff

129
day2/main.zig Normal file
View File

@ -0,0 +1,129 @@
const std = @import("std");
pub const Policy = struct {
min: u32 = 0,
max: u32 = 0,
value: u8,
password: []u8,
pub fn matches_policy_one(self: *Policy, s: []u8) bool {
var c : u32 = 0;
for(s) | v | {
if (@as(u8, v) == self.value) {
c += 1;
}
}
var valid = (c >= self.min and c <= self.max);
//std.log.debug("{} is {} for Policy {}-{} of {c} [{} found]",
// .{s, valid, self.min, self.max, self.value, c});
return valid;
}
pub fn matches_policy_two(self: *Policy, s: []u8) bool {
var n_matches : u32 = 0;
if (s[self.min-1] == self.value) {
n_matches += 1;
}
if (s[self.max-1] == self.value) {
n_matches += 1;
}
return n_matches == 1;
}
};
pub fn main() !void {
var allocator = std.heap.GeneralPurposeAllocator(.{}){};
var f = std.fs.File { .handle = try std.os.open("input", std.os.O_RDONLY, 0) };
var buffer : [1024]u8 = undefined;
var byte_buffer = std.ArrayList(u8).init(&allocator.allocator);
defer byte_buffer.deinit();
const stdout = std.io.getStdOut().writer();
var n_valid : u32 = 0;
var read = try f.read(&buffer);
std.log.info("Read {} bytes", .{read});
while (read != 0) {
for (buffer) | v, k | {
// We're through the read part of the buffer
if (k >= read) {
break;
}
if (v == '\n') {
var p = parse_policy(byte_buffer.items[0..]);
if (p.matches_policy_two(p.password)) {
n_valid += 1;
}
try stdout.print("{}-{} {c}: {}\n", .{p.min, p.max, p.value, p.password});
//std.log.debug("{}", .{x});
// Set the position back to zero, without freeing existing memory
byte_buffer.deinit();
byte_buffer = std.ArrayList(u8).init(&allocator.allocator);
continue;
}
try byte_buffer.append(v);
}
read = try f.read(&buffer);
std.log.info("Read {} bytes", .{read});
}
std.log.info("{} valid items", .{n_valid});
//part1(expenses.items[0..]);
//part2(expenses.items[0..]);
}
fn parse_policy(line: []u8) Policy {
var min : u32 = 0;
var max : u32 = 0;
var char : u8 = 0;
var pass : []u8 = undefined;
var start : usize = 0;
var got_min = false;
var got_max = false;
for (line) | v, k | {
if (v == '-') {
min = atoi(line[start..k]);
start = k + 1;
got_min = true;
}
if (v == ' ' and !got_max) {
max = atoi(line[start..k]);
start = k + 1;
got_max = true;
}
if (v == ':') {
char = line[start..k][0];
start = k + 2;
}
if (k == line.len-1) {
pass = line[start..];
}
}
return Policy {
.min = min,
.max = max,
.value = char,
.password = pass,
};
}
fn part2() void {
}
fn part1() void {
}
fn atoi(a: []u8) u32 {
var i : u32 = 0;
for(a) |v, k| {
if (! std.ascii.isDigit(v)) {
std.log.warn("Byte {x} is not a digit", .{v});
continue;
}
// 48 is '0' in ascii
std.debug.assert(v >= 48 and v < 58);
i += @as(u32, (v - 48) * std.math.pow(u32, 10, @intCast(u32, a.len - k - 1)));
}
//std.log.debug("{x} --> {}", .{a, i});
return i;
}

323
day3/input Normal file
View File

@ -0,0 +1,323 @@
..#...##...###.........#..#..#.
#.###........#..##.#......#...#
#.#.###..#.#..#.#............#.
.##............#......#...#.#..
..#..#.....##..##..##..........
...#...........###.#.##........
....#.#...#..#..##............#
....#....##...##..##........#..
.#..#..#....#...#..##.....##...
.#.###..#......####........##..
..#...###....#......#.....##.##
..#...#.......#......#..##....#
#...##....#.#..#.......#....#..
.#......#..#...........#....##.
.##.#......#.#.#.....##........
.....#.................#.#..#.#
....#..#........##......#..#.#.
..#...#..##.......#..##...#..#.
..#.......#.............#.#....
.#.................#.........#.
..#..#.#.#.#............##.#..#
.#.#.##.#.....#.....#..#......#
..#.#..#.#..........##........#
.........#...#.....#.#...#####.
##..#.....##.##........#...##..
.#.....#....##.#..#....##...##.
.##.....#.#....#.#.....#......#
.....#..#.##.....#.#....#.#..##
#......##..##....##...###..#...
.......#..#...........#......#.
#...#......#........#..#.......
##..#.....##.....#...#...#....#
.###..##..#.#........#..#.#....
#.#...#...#......##........#.#.
......#....#.#........##...#..#
.#.....#..#.#.....#......##....
.....#.....#.#.#....###.....#..
#.......##.#......#.#.#....###.
.......#..#..#...#.#.##........
.#......##..#.........###..#...
....#..##.......##.###...###...
.##............#..#.##.....#.##
..##.#.......##....#.......##.#
#..###............#.#...#...#.#
...##.#.#.#..#.##........#.#...
.#.....#...##.#..###..##.##...#
..............#.#.#.........#..
.....#...........#.#...#....#..
.....#...##.##.#....#.###..#...
#..###.........#......#.#.#....
.....#..#...##...###.#....#....
#..........#.#.#....#..#......#
###...................#......#.
........####......#.#..........
.......#.....#...#.......#...#.
.....#.....................#...
...#.#...#...#...........#.....
..#.........#...#....###..#....
.....#.#..##......##........##.
..#.............#............#.
.#....##.......#..#............
.#............#.#..#.##....#...
.####...##.#....#.....#...#....
##..#....#.#.#...........#..#.#
...#..#...........#...#..#....#
.....##.....#..#...#.........#.
...##........#....##........#..
.##.#...#...#..#.....#....##.#.
#.#...#.#.#.#.#..#....#....#...
#..#.#...#..#........#....#.#..
....#.#.....#......##...#....#.
.###.##...#....##.#...###..#..#
###..#...##..#......#.........#
..#.#......##.......#.....#...#
..#...#........#.........#.#...
#....#..#.........###.#......##
...#..#....#...#.......##.#.#..
....#.......#....###...##.#....
..#.....#.#.....###..#####....#
##......#....#.....##..#..#...#
#...........#..#..#....#....#..
.#...#.##.#.#.#....#......#..#.
.......#.#....#....#...#.#..#..
..#.#..#.##..##...##..#..#.....
...##.##.................#.#...
.....#...#......##.#....#.....#
......#..##.#..#.#.........#...
.............##.#......#.......
..#.#.....#...#.#.....#..#.....
.........#..#.#......#..#......
#..#.#.##..........#.##......##
......#.......#.....#..#.#...#.
.#....#....#.#.....#.......#...
#..#..##..................#....
............#...........##.#...
####...#..##.#....#.##..#......
#...#...#.....#.#...#.#........
.......##.........#.....#.....#
.....#...........##......#.####
.##....#.#.##......###.#.##....
........#.####.......#.#...#...
.#.#...##.#.#.#.........##.....
....#............###.##....#...
...##........##.#...#....#..###
..#.#.........#....##.#........
..#..##..#...##..#.##...#.....#
.#......#..#..#.........#......
..#........##.#......#.....#...
.##.......#....#.#......#......
#........#....#.####...#.#.....
##......#.............#....###.
..#....####.#.#.#.#...##......#
#.#.#.....#...#.......#...##...
........#...#....#..#......#.#.
#..#...#.#.##.....#.#....#....#
#...#....#......#.........##.##
..##.#..##............#........
#.........####.........#.......
#.##.........#..##....#.#.#.#..
.###......##..#.#.....#.#...##.
...#.........#.#...##.##....#..
#..#......#....##..#.#...#...##
...#.......#.#.#.....#..##...#.
....................###........
#...........###......#.#...##.#
.................#.#...###....#
...#..###..#.##...#..#....##...
###..#..#.#...#.....#.#.......#
.........#..#.#.....#.........#
.##..#.........#.#.....##......
.....#..........#.#.##....#....
........#.##.....#...##...#....
#.#.#...#......##....#.###.....
.#.##.....##.....#....#.##.#.##
.#...#.....##.#.##....#.....#.#
...#.....#........#............
##...####..#....#..##...#......
#.......#...#.#...#........#..#
......#.....#....#..#..#.#.....
..............##.....#.##....##
.#..##.........###..#..........
......#......#............#..#.
#.....###...###..........#.....
...###...........#....##..#....
.....................#...#.##..
###....#.#....#...#....#.#..##.
..#.............#.#....#..#.#..
.......#..###....#...#...#...#.
.##..#....##..............##...
...#...#..#..#.##.#....##...#..
#..#....##......#....###..####.
.##...#.#....#..#..#....#....#.
.#.##..#..#.........#.#......##
#..#.................#.....#...
..#............#........#...#..
##.##.......#.#....#..#....##.#
..##...#.#.....#......#........
......#.##.........##...#......
......##.#......#.##....##.#..#
.#.#......####.#.#.#.#..#......
..#.#....#...###....#.#...###..
.#.#...#....##..###.#..#.......
..#.....##..#............#..#.#
.#...#....#.....#....#..#.#.#..
..#....#..#......##...##......#
....#.......#.##.#.........#..#
#............#...##.....#..##..
......#..#..........#.#..#.....
...........#.#..#...##.#...#..#
.........###..#......##.###.#..
.....#....#......#...#....##...
..#.......#..#.#.#......#......
.#....#.....#.#.#.##...#....##.
....#.##.##.......#..#.....#...
.#.....#......#.......#..#.....
....###.....##.....##..#.#...#.
#.......#.#....#.#.#....#......
#...#..#.#......#...##.#.......
....##.##....#..#.......#..#.#.
.#.##.#.#..#.....#.#.......##..
..#..#..#..#.###...............
#.#......##....##.#.#.....#.#..
..##...#.........#.#..#.##..#..
.........####...#.....##.#.....
..#...................#.###....
..#.....#..#....#..#...........
.....###.#.........#.#.........
#..#..#........#..#......#..#..
###..##...#.......#........#.#.
.#.#.#.###.#............##.....
#..............#......#....#.##
.#...#..###...###.#..#.#.......
.###....##.#.......#.#.....###.
.##.....#.#....................
#..#.....#.....#...#.....#..##.
#.#....##..#......##..#...##..#
...........#....#..#.##.##....#
......#.......##....#.#....#.#.
###..#.#..........#.......#.#..
..#.#..##....##............##..
..#.....#..#....###............
.#...#...##...#..#..#..#.#....#
...#....#........#.............
#.#......#.#.....##..........#.
....#..#...............#...##..
........#..#....#..#..#..##....
....#......#.#.#...#.......#.##
.#.....#.#.#........###....#...
.#..#.......#...........#...#..
#.#.#####..#......#...#.#.###..
...##...#.#.....#..#...#...#...
..#....#.....#..#....#.#.....#.
....#.......#.....#........###.
..##..........#...###.......#..
#.#.##..#........##...#.#......
....##...#......#..........#.#.
#.......#..#.##.............#..
......#..........#...#....#...#
#.#.....#.##.#.#.............##
#...#.........##.##......#.##..
.........##.....#....#...##..#.
#.#...##.#...#.....##...#..#..#
......##.#.....#.#.....#.##....
....#.............#...#.......#
.#......##...#.#...#.##........
...#..#..#...........#..#..#.#.
.#...#...........#.#.##....#...
..#...#...#.#..#....#..#..#....
..###..##..#..#.........#.#..#.
....#.##.#...#.......#...#.....
.#.#.................#.......#.
.#..#.....#.##...#.#.....#...#.
.#.......#...#....#.......#....
###....##....#..#...#.#..##....
.........#.#.#.#...###.......##
....##.......#......#......##..
......##.###.#..#...#.#.#.#....
.#.###.#.#......#.#.......##...
.#.....##..#.#.....#...#.##....
.#..##.#.....#........###...#.#
.......#.#...........#........#
..........#...##..##.......#.#.
...#..#..#...#....#.#......#.#.
....#...#..#....#....#.#.##....
...#.#...##...#...##..#........
..#........#...##.#...##.#.#.#.
...##.#..#.......###.#.#.#.....
..##......#.#.#.........###.#..
.......#.#...##...#.#.......#.#
.#....##..#..#....#..#...#.....
.#....#.#.......#..#..##.#....#
#.#..##..#.#............#....#.
##..#....#.##.#....#...#..##...
.###.#.#..#...##........###.##.
...........#..#...#..#.#..###..
.#.#.#...#....#...##.##........
.....###.........#......#####..
#.#.#.....#....#..#...#.#.#.#..
..##.....#..#..#.#.#...#....#.#
......#.##..##..#.#.#.......#..
...#.#..###.........#........#.
......#.##..####...#...#..#...#
#.......#.........#....#....###
#......#...#........#.##....###
.#.#..............#...#...###.#
.#....####...#..##.###.....#...
.......#......#..#...#..##.#...
...........#.......#...........
..............#...#.#.#.#...##.
.###.....##.#.....#..........#.
##.##......#....##..#.....###.#
#.......#...##...#....##...#...
##.#.##...#....#....#....#.....
.....####...........#.#......#.
......#...#....#..#......#.....
...#...##..........#.......##.#
.#....#..........#.####........
...##...#..#...##........##..#.
.........##....#...##..#.##.#..
##.#.....#.......#.....#.......
#..#....#.##.#........#........
#.#...#...##........#.#.....###
....#...................#.#.#..
.......#..#.#...#....#.##.#....
....##...###.#.#.##...#...#....
.#....#....#...##.#......#...#.
............##..#.#.#........#.
...#....#.....#......#........#
...#.#.....#.##.....#....#...#.
.....#..##.......#.##.......#.#
........##................#....
....#..###...##.#..#...#......#
.#.#.......#.......#....##.#..#
..#........#............#......
..##.......#..#..#....#....#..#
#...###.......#.##...#.........
.....#...#...#..##..#....#..#..
.##.#..#...##.........###.#....
..#.#..#...#...####.#...#.#.#.#
#....#..###.....#......#.##..##
##......#...##...###......#.##.
...........#.....##...#...#...#
..#..#.#.....#..#.....###...#..
.............#..........###...#
....##............#....###.##.#
..##.#..##.....#.#.........#.#.
....#.#...........####.........
.##.###.##.#.#......#.##.#.#...
.....##.........#..#.......#...
...........#.........#....###..
...#.#..#..........#.....#..#..
.#..###.......##........#.#....
.#...###.....#..#.#..#...#.##..
##...###.#.#....#......#...#..#
....#.......#..#..##..#.#......
#.#......#.##..#......#..#....#
....#..#..#.....#.#......#..#..
..#...###......##.............#
..#....####...##.#...##.#......
.....#.......###...............
.......#...#.#.......#.#.##.###
.#.#...#.....#...##.........#..
..#..........#..#.........##...

134
day3/main.zig Normal file
View File

@ -0,0 +1,134 @@
const std = @import("std");
pub fn main() !void {
var allocator = std.heap.GeneralPurposeAllocator(.{}){};
var gpa = &allocator.allocator;
var f = std.fs.File { .handle = try std.os.open("input", std.os.O_RDONLY, 0) };
var buffer : [1024]u8 = undefined;
var byte_buffer = std.ArrayList(u8).init(&allocator.allocator);
defer byte_buffer.deinit();
var map = std.ArrayList([]u8).init(&allocator.allocator);
defer map.deinit();
const stdout = std.io.getStdOut().writer();
var read = try f.read(&buffer);
std.log.info("Read {} bytes", .{read});
while (read != 0) {
var last_pos : usize = 0;
for (buffer) | v, k | {
// We're through the read part of the buffer
if (k >= read) {
break;
}
if (v == '\n') {
try map.append(try std.mem.Allocator.dupe(gpa, u8, byte_buffer.items));
last_pos = k + 1;
// Reset buffer
byte_buffer.deinit();
byte_buffer = std.ArrayList(u8).init(&allocator.allocator);
continue;
}
try byte_buffer.append(v);
}
read = try f.read(&buffer);
std.log.info("Read {} bytes", .{read});
}
std.log.debug("Map has {} items", .{map.items.len});
//for (map.items) | v, k | {
// try stdout.print("{s}\n", .{v});
//}
var results : std.meta.Vector(5, u32) = [_]u32 {
sled(map, 1, 1),
sled(map, 3, 1),
sled(map, 5, 1),
sled(map, 7, 1),
sled(map, 1, 2),
};
std.log.info("Hit {} trees on slope 1,1", .{results[0]});
std.log.info("Hit {} trees on slope 3,1", .{results[1]});
std.log.info("Hit {} trees on slope 5,1", .{results[2]});
std.log.info("Hit {} trees on slope 7,1", .{results[3]});
std.log.info("Hit {} trees on slope 1,2", .{results[4]});
std.log.info("Multiple of each slop hits: {}", .{@reduce(.Mul, results)});
}
fn sled(map: std.ArrayList([]u8), right: usize, down: usize) u32 {
var map_height : usize = map.items.len;
var map_width : usize = map.items[0].len;
var x : usize = 0;
var y : usize = 0;
var n_trees : u32 = 0;
while (y < map_height) {
var char : u8 = map.items[y][x];
std.log.debug("{},{} : {}", .{x, y, char});
if (char == '#') {
n_trees += 1;
}
y += down;
x += right;
x %= map_width; // loop around
}
return n_trees;
}
fn parse_policy(line: []u8) Policy {
var min : u32 = 0;
var max : u32 = 0;
var char : u8 = 0;
var pass : []u8 = undefined;
var start : usize = 0;
var got_min = false;
var got_max = false;
for (line) | v, k | {
if (v == '-') {
min = atoi(line[start..k]);
start = k + 1;
got_min = true;
}
if (v == ' ' and !got_max) {
max = atoi(line[start..k]);
start = k + 1;
got_max = true;
}
if (v == ':') {
char = line[start..k][0];
start = k + 2;
}
if (k == line.len-1) {
pass = line[start..];
}
}
return Policy {
.min = min,
.max = max,
.value = char,
.password = pass,
};
}
fn part2() void {
}
fn part1() void {
}
fn atoi(a: []u8) u32 {
var i : u32 = 0;
for(a) |v, k| {
if (! std.ascii.isDigit(v)) {
std.log.warn("Byte {x} is not a digit", .{v});
continue;
}
// 48 is '0' in ascii
std.debug.assert(v >= 48 and v < 58);
i += @as(u32, (v - 48) * std.math.pow(u32, 10, @intCast(u32, a.len - k - 1)));
}
//std.log.debug("{x} --> {}", .{a, i});
return i;
}

27
day4/build.zig Normal file
View File

@ -0,0 +1,27 @@
const Builder = @import("std").build.Builder;
pub fn build(b: *Builder) void {
// Standard target options allows the person running `zig build` to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
// for restricting supported target set are available.
const target = b.standardTargetOptions(.{});
// Standard release options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
const mode = b.standardReleaseOptions();
const exe = b.addExecutable("day4", "src/main.zig");
exe.setTarget(target);
exe.setBuildMode(mode);
exe.install();
const run_cmd = exe.run();
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
}

1138
day4/input Normal file

File diff suppressed because it is too large Load Diff

215
day4/src/main.zig Normal file
View File

@ -0,0 +1,215 @@
const std = @import("std");
pub fn main() anyerror!void {
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
defer arena.deinit();
var gpa = &arena.allocator;
var record_indexes = std.ArrayList(usize).init(gpa);
var f = std.fs.File { .handle = try std.os.open("input", std.os.O_RDONLY, 0)};
var reader = f.reader();
var records = std.ArrayList([]u8).init(gpa);
var record = std.ArrayList(u8).init(gpa);
var n_newlines : u32 = 0;
var just_had_newline = false;
const state = enum {
AddingData,
CheckingNewline,
RecordEnd,
};
var current_state = state.AddingData;
while(true) {
var n = reader.readByte() catch |err| {
// Finalize record
try records.append(try gpa.dupe(u8, record.items[0..record.items.len]));
//std.log.debug("Found record: '{}'", .{record.items});
record.deinit();
record = std.ArrayList(u8).init(gpa);
std.mem.set(u8, record.items, 0);
break;
};
if (n == '\n') {
if (current_state == state.CheckingNewline) {
current_state = state.RecordEnd;
// Finalize record
try records.append(try gpa.dupe(u8, record.items[0..record.items.len]));
//std.log.debug("Found record: '{}'", .{record.items});
record.deinit();
record = std.ArrayList(u8).init(gpa);
std.mem.set(u8, record.items, 0);
current_state = state.AddingData;
continue;
}
else {
current_state = state.CheckingNewline;
// whitespace can always be added
try record.append(' ');
continue;
}
}
else {
if (current_state == state.CheckingNewline) {
current_state = state.AddingData;
}
try record.append(n);
}
}
std.log.debug("Found {} records", .{records.items.len});
//std.log.debug("{}", .{records.items[0]});
//const fields = comptime std.meta.fieldNames(RequiredFields);
const fields = comptime std.meta.fields(RequiredFields);
const valid_passport = RequiredFields {
.byr = true,
.iyr = true,
.eyr = true,
.hgt = true,
.hcl = true,
.ecl = true,
.pid = true,
};
var n_valid : u32 = 0;
for (records.items) | r, k | {
// Everything is separated by whitespace
var passport_info = RequiredFields{};
var iter = std.mem.tokenize(r, " ");
//std.log.debug("{}", .{r});
while (iter.next()) |aspect| {
inline for (fields) |field| {
if (std.mem.startsWith(u8, aspect, field.name)) {
@field(passport_info, field.name) = validate_field(field.name, aspect[4..]);
std.log.debug("Field {} with contents {} is {}",
.{field.name, aspect[4..], @field(passport_info, field.name)});
}
}
}
if (std.meta.eql(passport_info, valid_passport)) {
std.log.debug("'{}' is valid", .{r});
n_valid += 1;
}
else {
std.log.debug("'{}' is invalid", .{r});
}
}
std.log.info("Valid passports: {}", .{n_valid});
}
pub fn validate_field(field: []const u8, data: []const u8) bool {
if (std.mem.eql(u8, field, "byr")) {
if (data.len != 4) {
return false;
}
var i = atoi(data);
//std.log.debug("byr {} --> {}", .{data, i});
return (i >= 1920 and i <= 2002);
}
if (std.mem.eql(u8, field, "iyr")) {
if (data.len != 4) {
return false;
}
var i = atoi(data);
//std.log.debug("iyr {} --> {}", .{data, i});
return (i >= 2010 and i <= 2020);
}
if (std.mem.eql(u8, field, "eyr")) {
if (data.len != 4) {
return false;
}
var i = atoi(data);
//std.log.debug("eyr {} --> {}", .{data, i});
return (i >= 2020 and i <= 2030);
}
if (std.mem.eql(u8, field, "hgt")) {
var unit = data[data.len-2..];
var i = atoi(data[0..data.len-2]);
//std.log.debug("hgt {} --- > {} '{}'", .{data, i, unit});
if (std.mem.eql(u8, unit, "in")) {
return (i >= 59 and i <= 76);
}
else if (std.mem.eql(u8, unit, "cm")) {
return (i >= 150 and i <= 193);
}
else {
return false;
}
}
if (std.mem.eql(u8, field, "hcl")) {
if (data.len != 7) {
return false;
}
if (data[0] != '#') {
return false;
}
for (data[1..]) |d| {
// less than ascii 0
if (d < 48) return false;
// greater than ascii f
if (d > 102) return false;
// after ascii 9 but before ascii a
if (d > 57 and d < 97) return false;
}
return true;
}
if (std.mem.eql(u8, field, "ecl")) {
if (data.len != 3) {
return false;
}
for (valid_eyecolours) | colour | {
if (std.mem.eql(u8, colour, data)) {
return true;
}
}
return false;
}
if (std.mem.eql(u8, field, "pid")) {
if (data.len != 9) {
return false;
}
for (data) |d| {
if (!std.ascii.isDigit(d)) {
return false;
}
}
return true;
}
if (std.mem.eql(u8, field, "cid")) {
return true;
}
std.log.debug("Uknown field {}", .{field});
return false;
}
const valid_eyecolours = [_][]const u8 {
"amb",
"blu",
"brn",
"gry",
"grn",
"hzl",
"oth",
};
fn atoi(a: []const u8) u32 {
var i : u32 = 0;
for(a) |v, k| {
if (! std.ascii.isDigit(v)) {
std.log.warn("Byte {x} is not a digit", .{v});
continue;
}
// 48 is '0' in ascii
std.debug.assert(v >= 48 and v < 58);
i += @as(u32, (v - 48) * std.math.pow(u32, 10, @intCast(u32, a.len - k - 1)));
}
//std.log.debug("{x} --> {}", .{a, i});
return i;
}
pub const RequiredFields = packed struct {
byr: bool = false,
iyr: bool = false,
eyr: bool = false,
hgt: bool = false,
hcl: bool = false,
ecl: bool = false,
pid: bool = false,
};

27
day5/build.zig Normal file
View File

@ -0,0 +1,27 @@
const Builder = @import("std").build.Builder;
pub fn build(b: *Builder) void {
// Standard target options allows the person running `zig build` to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
// for restricting supported target set are available.
const target = b.standardTargetOptions(.{});
// Standard release options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
const mode = b.standardReleaseOptions();
const exe = b.addExecutable("day5", "src/main.zig");
exe.setTarget(target);
exe.setBuildMode(mode);
exe.install();
const run_cmd = exe.run();
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
}

814
day5/input Normal file
View File

@ -0,0 +1,814 @@
FBFBBBFRLL
BFFFBFFRRR
BBFBFFFLLR
FBFFFBFLRR
FBFFBFBLLR
BFBBFBBRLL
BFFFFFFRLR
FBBBBFFLLR
FFBBFFFLRL
FFBFBBFLLR
FBFFFBBRRR
FBFFBFBLRR
FBBFBFFRLR
FBBBFBFRLL
FFBFFBBRLR
FBFBBBFRRL
BFFBBBFRRR
FBFBBBBLLR
FFBFFBBLLL
BFFBFBBLLR
BFFBFBBRLR
BFFBBBBLLL
FBBBBFBLLR
FFBFBBBLRR
FFBFBBFLRR
FFFBFBBRRL
FFFFFBBRLL
BFFFBFFLRR
FFFBFBBRLR
FBFFBBFLLR
BFBFFBBRRR
FBBFBBFLRL
BFBBFBFRRR
BFFFBBBLRL
BBFFFBFLLR
BFFFFBFLRR
BFFBFFBLLL
FFBBFBFRRR
BFBFFFBLLL
FBFBFFFRRR
BFBFBBBLLL
BFFFBBFLLL
BFBFFFBLLR
BFFBBBFRRL
FFFBBFFLLR
BFFBBBFLRR
FBFFBBBRLR
FBBFBBFLRR
FBBFFBFRRR
FBBFBBBRRL
FFFBFFBRRL
FBFBFFBRLL
FBFFBBFRLL
BFBFBFFRLL
FBFBFFFRLR
BFBFFBBRRL
FFBBFFBRRR
BFFBFBBLRL
FFBFBFBLLL
BBFFFBFRLL
FBFBBBFRRR
BFFBBFFLRR
BFBBFFBLRL
BFFFFFBLLL
BBFFFFFRLR
FBBFFBFRLL
FFBFBFFRRR
BFBBBBFLRR
BFFBBFFRLL
BFBBFFBLLL
BFFFFFBRRR
FBBFFFBLRL
FFFBBBFRLR
FFBBBFBRRL
BFFFBBBRRL
FFBFBFBRRR
FBBBBBFRRR
BBFBFFFRLL
FBFFFBBLRR
FBFBFFBRRR
BFBFBFBRLR
FBBBFFFRRL
BFBFFFBRLL
FBBBFFBLLL
BFBFBFFRLR
BBFFBFBLRL
BBFFBFBRLR
BBFBFFFRRR
BFBBFFFRLL
BFFBBBBRRL
FFBFFBFRLL
FBBBFBBLRR
FBFFFFFRLR
FBFFFBFLLR
BBFFBFFRRR
BFBFBFBRLL
BFFBBBBLLR
FBBBFBFLLL
FFBBFBBRLR
FFFFBBFRRR
FFFBFFFRRL
FFFFBBBLLL
FBBBBFBLLL
BFBBFBFRLL
FFBFBFFRLR
FBFBBBFLLL
BFBBBFFLLL
BBFFBFFRLL
FBFFFFFLLR
FBBBBFBLRR
BFBFFFFRRR
BFFBBBBLRL
BFFBBFFLLL
FBFFBBFLRR
BBFFFFBLRR
FBBBBFFRLL
FBFBFFBRLR
FFFFBBFRLR
FBBFFBBLLR
BFFFBBFLRL
BFFFFFFLRR
BFBFBFBRRL
FFBBFBFLLR
BFBBFBFLLR
FFBBBFBLRR
BBFFBFBRRL
BFFBBBFLRL
BFFBFFFRRR
FFFFBBFLLL
BBFFFBBRLR
FFBBBBBRLR
FFBFBBBRLR
FFFFBFBLLR
FBBBBBBLLR
FBBBFFBLRL
BFFFFFFLLL
FBBFBBFLLL
BFBBBBBLRR
FBFBBFBLLL
FBFFFBBLLL
FBFFFBBRLR
FFFBBBFRRL
FBFFFFBLLL
BBFFFFFRLL
BFBFBBFLRL
FBBBFFFLLL
BFBBFBBRLR
FFBFBBFRLL
FFBFBFBLRL
BFFBBBBRRR
FFFFBBFLRL
BBFFFFBLLR
FFFBBBFLLR
FFFBFFFLLR
FFBBBFFLRL
FBFBBBFLRL
FBBFBBFLLR
FBFBBFFLLR
BBFFBBBRRL
FBFBBFBLRR
FBBBFFFLLR
FBFBFFFRLL
FFBBFFBLLL
FBBBFBFRRR
BFBFFFBRRR
FBBBFFFRRR
BBFFBBBLLL
BFFBFFBRLR
BFFFBFBLLR
FBBBBBFLRR
FBBFBBBLRL
FFFBFFFLRR
FFFFBBBRRR
BBFFFBFLRL
FBFBBFFRRL
BBFBFFFRLR
FBFBFBBRRL
FFBFFBFLRL
FBFFBFBRLR
BFBFFFFLRL
FBFFFBFRRR
FFFFBFBRRR
BBFFFFBRLR
FBBBFFBRRL
FBBFFBBRLR
FFBBFBFLRL
BFFFBBBLLR
BFFFFFFRLL
BFFBBBBLRR
BFBFBBBRRL
FBFBBBBLLL
BBFFFBBLRR
FFFFBBFLRR
FFBBFBBLRR
FFFBBBBLLL
FFBBBBFLLL
FBBFFFFLLR
FFBFBBBRLL
FFBBFBBRRR
BFBFBBBLLR
FBBBBBFLLL
FFBBFFBRLL
BFBFFBFRLR
FBBFBFBRRL
FFBBFFFLRR
BFBFBFFLRL
FBFFBFFRRR
BBFFBFFRLR
FFBBBBBRRL
FBBBFBBLLR
FFFBBBBLLR
FFBBFBBLLR
BBFBFFBLRL
BFFFFFBLLR
FFFBFFBRLL
FFFFBFBRLR
FFBFFBBRRR
FBBBBFFLRR
BFBFFFFRLR
FFBBFFBLRL
BFBBFBBLLR
BBFBFFFLRR
FBFFFBBLLR
BFFBBBFLLR
BFFBBFFLLR
BFBBBBFRLR
FBFFBBBLLR
FFBFFFFLLR
FBBBBFFRRL
FBFBBFBRRL
FFFFBFBLRR
BBFFFFBRRR
BFBBFBFRRL
BFFBBFFRLR
FBFBFBFLLR
BBFFBFFLRL
BBFFBBBLLR
BFBBBFBLLL
BFBBBBBLLR
FBBBFFBRLL
FBFFBFBRLL
BFBFFBFLLR
BFBFFFFLLL
FBFFFFFRLL
FFBBFFFLLR
FFFBFFFRRR
FBFFFBFRLR
FFFBFBBLLL
BBFFFBBLLL
FFFBBFBLRL
FBBBFBFRRL
FFFBBFBRLR
BFBBBFFLRR
FFBBBFFLRR
FFBFBBBLLR
FBBFBFBLLR
FFBFFBBRRL
FFFBFBFLRR
FBBFBFBRLL
BBFFBBFLRL
FBBFFBFRRL
BFBFBFFRRR
BFBBBFBRRR
BFFFFBFLLR
FBBFBFBRRR
BFFFFBBLLL
FFFBFFFRLR
FBBFBFBRLR
BFFFFBFRLL
FFBFBBFRRR
BBFFBFBRRR
FFBBBFFRLR
BFBFBFFRRL
BFFFBFBLRR
BFBBFBBRRR
FFBFFBFRLR
BFFFBFFRRL
BFBFBBBLRR
FFBBBBBRLL
BFBBFFBRLR
FBFFFFFLRL
FFBBBBBRRR
FFBFFFBLLL
FFBBBBBLLR
BBFFBFBRLL
BFBFBBBLRL
FBBFFFFLRR
BBFFBFBLLR
FFBBBFBLLR
BFBFFFBRLR
FBFBBBFLRR
FBFBBBBRLL
BFFFFBFLRL
BFFFBFBRLR
FBBFFFFLRL
FFFBBBBRLL
FFFBFFFRLL
FFFFBBBLRL
BFFFBFBRLL
FBFBBBBLRR
BFBBBFFLLR
FFFBFFBRLR
FBFFBFFLRR
FFFFBFFLLL
BFFBBBFLLL
BFFFBBBRLL
FBFFFFBLRL
BBFFBBFRLL
BFBBBFBLRL
FBBFFBBRLL
BFBBBBBLLL
BFBFBFBLRL
BFFBBFBLRL
BFFBFFBRRR
FFBBBBFLRR
FBBBBFBRRR
FBBBFBFLLR
FFBFBBFLLL
BBFFBBFLRR
FFFBBFFRLR
FBBBFFFRLL
FBBBBFFRRR
FFFBFBFLLL
BBFBFFFLLL
FBFFBFBRRR
BFFFBFFLRL
FFBBBFBLLL
FBBBBFBRLR
BFBFFBFLLL
BFBFBBFLLL
FBFBFFBLLL
FBBBBFFRLR
FBFFBFFRLR
BFBFBBFLRR
FBFBBBBLRL
FFFFBBFRLL
FFBFBBBRRR
BFFBBFFRRL
BBFFBBFRLR
FBBFFBFLLR
FBFFBFFLLL
BBFFFBFRRL
FBFFFFBRLL
FBFBFBFRRL
FFBFFFBLLR
BFBFFBBLLL
BFBFBFFLRR
FBFFBFFRLL
BFFBFBFLLR
FBFBFFBLRL
FFBFBFFRRL
FBFBBBBRLR
FFFFBBBRLL
BFBBFBFLLL
FBFFFFFLLL
FFBBFBFLRR
FFBFBFBRRL
FBFFBFBRRL
FBFBFBFRLR
FFFBBBFLRL
BFBBBBBRLR
BBFFBBFLLL
FBBFBBBLRR
FFBBBFBRLL
FBFFBBFRRR
FFFFBFFLRL
FFBFBBFRLR
FBBFBFFLRR
FFBBFBFLLL
FFBFBBBLLL
BFFFBBBLLL
BFFBBBBRLR
BFBBFBBLLL
FFBBBFBLRL
BFFBBFFRRR
FFFBBFBRLL
BFBFBFFLLL
BFFBBBFRLR
BFBFFBBLRR
FBBFFFBRRR
FBBFFFFRRR
BFBFBFBLLR
BBFFBBFRRL
FFFFBBBRRL
FFFBFBFLRL
BFFFBFFLLR
FFBBFFFRRL
FFFBFBBRRR
BFFFFBBRRL
BFBBFFFLRR
BFBFFFFRLL
FFFFBBBRLR
FFFBBFBLLR
FBFBFBFRLL
BFBBFBFLRL
BFBBBBBRRR
FBFFFFBRRL
BFBFFFBLRL
FBFBBBFRLR
BFBFFBFLRR
FFBFBFFLRR
FFFBBBFRRR
FFBBFFBRLR
FFBFFFFLRR
FBBBFFFLRL
BFBBFFBLLR
BFFBFBBLRR
FBBFBFBLRL
BFFFBFBLLL
FFFBBFFLRR
FBFFFFFRRR
BFBFFBFLRL
FFBFFFBRRR
FBFBFBBLLR
FFFFBBBLLR
BFBFFFFRRL
FFBBFFFRRR
FBBBFBFLRL
BFBBBFFRLL
BFBFFBBLRL
BBFFFFFLLR
FFBBBFFLLL
FFBFFFBRLL
FFBBFFBLLR
BBFFBFFLLL
FBFBBFBRRR
FBBBBBFLLR
FFBFFFFLRL
FBBBBFFLLL
BFFBFBFRRR
FBFFFFFLRR
FFFFBBFLLR
FFFBFBFRRL
FBFBFBFLRR
FBFBBFFRLR
BFFFBBFRLR
FFBFFBBLRR
FFBBFFBRRL
BFBFFBFRRL
FFFBFFBLRR
BFBBFFFRRR
BFFBFBFLRL
FFBFBBFRRL
BFFFBFFLLL
FBFFBFBLLL
BFBBFFFLLR
BFFFFBBLRR
FFFBFFFLLL
BBFFBBBRLL
BFFBFBFLRR
FBBFBFFRLL
BFFBBBBRLL
BFBFBBFLLR
FBBBBBBRLR
BFBBBBFRRR
FFBFFBFLLL
BFFFFFBRRL
BFFFBFFRLL
BFFFBFBLRL
FFBBBBFRLR
FBBBFFFLRR
BFFBFBBRRL
BBFFFFFRRR
FBBBFBBLLL
FFBFFFBLRR
FFBBFBBRLL
FBFBBFFLLL
BFFFBFFRLR
BFBBBBBLRL
FFFBFFBRRR
FFFBBFFLRL
FBFBFBBRLL
FFFBFBBRLL
FFBFBFBRLL
FBFFFBFRLL
BFFBFBFRRL
FBBFFFBRLR
BFBBBFFRRR
FBBBBBFLRL
FFFFFBBRRL
FBFFBBFLLL
BFBBFBBLRL
BFFBBFBLLL
FFBFBFFLLL
FFFBBBFLLL
BFFBFBFLLL
FBFFFFBRLR
FBFBBFBLRL
BBFFFBFRLR
FFFBBFBLRR
BFFBFFBRLL
BFFBBFBRLL
FBBFFFFRLR
FBBFFFBLLL
FFBFFFFRRL
FFFFBFFLLR
FFFBBFFRLL
BFBBBFBRLR
BFBFFFBLRR
BFFFBBFLRR
BFBFFBFRLL
BFBBFFBRRL
FFFFBBBLRR
FBFFFBBLRL
FFBBBFFRLL
FBBBFBBRLR
FFBFFBFRRR
FBFBFFFRRL
BFBBBFFRLR
FFFBBBFLRR
FFFFBBFRRL
FFBFBFBLRR
FFFBFFBLLL
FBFFFBBRRL
FFFFBFFRLR
FFBBBBBLRR
FFFFBFFRLL
FBFFBBBRRL
BFFFFBBLRL
FBFFBBBRLL
BBFFFFFLRL
FBFBBFFLRR
FBBBBFBRLL
BFFBFFFLLL
FBBBFFFRLR
BFBBFFBLRR
FFBBFBBLLL
FBBFFBBRRL
BFBFBFBLRR
FFFBBFBRRL
BBFFFBFLRR
FBBBBBBLLL
BFFFBFBRRR
FBFBFFFLLL
FFBBBBBLLL
BFBFBFFLLR
FBBFFBBLLL
FBBBBBBLRL
BBFFBBBRLR
FBFFFBBRLL
BFBFBBBRLL
BBFBFFBLLR
FFFBBFFRRR
FBFBFBBRRR
FBBFBFFRRR
BFBBBFBRLL
FBFBFFBLLR
BBFFBFBLLL
BFFFBBFRLL
FBFBFFFLLR
FBFFFFBRRR
FFBFBBFLRL
BBFFFBFLLL
FBBFBBBLLL
FBBBFBBRRL
FBFBFBFLLL
FFFFBFBLRL
FFFFFBBRRR
FFBFFBBLLR
BBFFFFFRRL
FBFBBBFLLR
BFBBBFFRRL
FBFBBFBRLR
BFBBBFBLRR
FFBFBFFLLR
FBFBFFBRRL
FFBFBFBRLR
BFBFFBBRLL
FFBFFFFRRR
BFFBBFBRRR
FFBBBBFRRL
FFFBBBBLRL
FFBBBFFRRL
BFBBBBFRLL
BFBFBFBLLL
BFBBFFFRRL
BFFBFFBLLR
FFBBBFBRLR
FFBBFBFRRL
FBFFBBBLRR
FBBFBBBLLR
BFBFFBBLLR
BFFFFBFLLL
FFFBFBFLLR
FBFFFFBLRR
FBBFBFBLLL
BFFFFBFRLR
FBBBFBFRLR
FFBBFBFRLR
BFFFFFFLLR
BFFFFBFRRL
BBFFBBFRRR
FBFFBFFLRL
FBBBBBFRLR
FBBBBFBLRL
BFFFBBBRRR
FFFFBFFRRL
FFBFFFFLLL
FFFBFBFRLL
FFBFFBFLRR
FBBFFBFLRL
FBBFFBBLRR
FFBFFBFRRL
BFFFFFFRRR
BFBFBBBRLR
BFFBFBBRLL
BBFFBFFRRL
FBBFBBFRLL
BFFFFFBRLR
BFBBBBFLLL
BFBBFFBRRR
FFFFBFBLLL
FFBBFFFRLR
BFBBBFBRRL
BFFFBBFRRR
FBFFFFFRRL
BFFBFFFRLL
BFFFFBBRLR
FFBBFFBLRR
BBFFBBBLRR
FBBFFFFRRL
BFFFFBBRLL
BFFFFFBRLL
BFBFFFFLLR
FBBBBBFRRL
FBFBBBBRRR
FBBFBBFRRL
FBBBFBBRLL
FBFFBFFLLR
FFBFFFFRLR
BFFFFFFRRL
BFBBFFFRLR
FFBBBBFLRL
FFBFFBBRLL
FFBBFBBLRL
FBFBFFBLRR
BFFBFBFRLR
FBFFBBBRRR
FBBBBFFLRL
FBBFBFFRRL
FFBFBFFLRL
BFFBBFBRLR
BBFFFFFLRR
FBBFFFBRLL
BFFFBFBRRL
FFBFBFFRLL
BBFFBBBRRR
BBFFFFBLRL
BBFFFBBRRR
BBFFFFBRLL
FBBFFBFLLL
BFFFBBBLRR
FFBFFBFLLR
FBBFBFFLLR
FBFBBFFLRL
FBBBBFBRRL
BFBBFBFLRR
BBFFBFBLRR
FFFBBBBLRR
FBBBFFBRLR
FBFBFBBLRR
FBBBFBBRRR
BFBBFFFLLL
BFFFFBBLLR
FBBBBBBRLL
FBBBFBBLRL
FBBBBBBRRR
FFFBBBFRLL
BBFFFFFLLL
FBBFFBFRLR
BFBBBBFLRL
BFFFFBFRRR
FBFFBBBLRL
BFBBFBBRRL
FBFFBFBLRL
FFFBBFBRRR
BFBFBBBRRR
BFBBFFFLRL
BBFFFBBRRL
FFFBBBBRRL
FBBBFFBLLR
FBFBFFFLRR
FBFBFBBRLR
BFFFBBFRRL
FBFBFBFRRR
FBBFFFFLLL
FBBFFBBLRL
FBBBFBFLRR
FFFBBFFLLL
BFFBFFBRRL
BFFFFBBRRR
FFFFFBBRLR
BBFFBBBLRL
FBBFBBFRRR
BFBBFBBLRR
FFBFFFFRLL
BFBFFFBRRL
FBBFBBBRLL
FBFBBFBRLL
FBFFFBFRRL
BFFBFFBLRR
FBBFBFBLRR
BFBBBBFLLR
BFBBBFBLLR
FFFFBFBRRL
FFFBBBBRLR
FFBFFFBRLR
BFFBFFBLRL
FBBFBFFLLL
BFFBFBBLLL
FBFBBFBLLR
FBBFFBFLRR
FFBBBBFLLR
FBBFBFFLRL
FFFBFBBLRL
FBBFFFFRLL
BFBFBBFRRR
FBFFBBBLLL
FFBFBBBLRL
BBFFBBFLLR
FBFFFBFLLL
BFBFBFBRRR
BFBBBBBRRL
BBFBFFBLLL
BFFFFFFLRL
FBBFFFBRRL
FFBBFBFRLL
BBFFBFFLLR
BBFBFFFRRL
FFFBBFBLLL
BFFBFFFRRL
BFBBBBBRLL
FFFBFBFRLR
FBFFBBFRRL
BFFBFFFLLR
FFBBFFFLLL
BFFBBBFRLL
FFBBBBFRLL
FFFFBFFLRR
FFBBBBBLRL
FBBBBBBLRR
FBBFFFBLLR
BBFFFBBRLL
BFFBBFFLRL
FFFBFBFRRR
FBFBFBBLLL
FBBBBBFRLL
FBBBBBBRRL
FBFBBBBRRL
FBFFBFFRRL
BFFFBBFLLR
BFFBFFFLRR
BFFBBFBLRR
FFFFBFBRLL
BFFBFFFLRL
FFBFFFBLRL
FBBFFFBLRR
BFBBBFFLRL
FBFFBBFLRL
BFFFBBBRLR
BFFBFBBRRR
BFFFFFBLRL
BBFBFFFLRL
BFBFBBFRRL
BBFFBFFLRR
FBFBFBBLRL
BFBFBBFRLR
FFFBBBBRRR
FBFFFFBLLR
FBFBBFFRLL
BFBFFBFRRR
FFFBFFBLLR
FBFBFBFLRL
FBBFBBBRLR
FFFBFBBLLR
FFBBFFFRLL
BFBFFBBRLR
BBFFFFBLLL
FFBBBFFRRR
BFFBFFFRLR
FFBFFBBLRL
FBBBFFBRRR
BFBFBBFRLL
BFBBBBFRRL
BFBBFFBRLL
BBFFFBBLRL
FFBBBBFRRR
BBFFFBFRRR
BFBFFFFLRR
FFFBFBBLRR
BFFBBFBRRL
FBBFBBBRRR
FBFBFFFLRL
BFBBFBFRLR
FFFBFFFLRL
FFBBBFBRRR
FBBFFBBRRR
BBFFFBBLLR
FFFBFFBLRL
FFBFBBBRRL
FFBBBFFLLR
FBFFBBFRLR
FBFFFBFLRL
FFBBFBBRRL
FFFBBFFRRL
FBBFBBFRLR
FBFBBFFRRR
FFFFBFFRRR
BFFFFFBLRR
BBFFFFBRRL
FBBBFFBLRR
BFFBFBFRLL
FFBFFFBRRL
FFBFBFBLLR

99
day5/src/main.zig Normal file
View File

@ -0,0 +1,99 @@
const std = @import("std");
pub fn main() anyerror!void {
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
var gpa = &arena.allocator;
defer arena.deinit();
// Read entire file
var f = try std.fs.cwd().openFile("input", .{});
var contents = try f.readToEndAlloc(gpa, std.math.maxInt(u32));
var highest_id : u32 = 0;
var seat_ids : [814]u32 = undefined;
var it = std.mem.tokenize(contents, "\n");
var i : u32 = 0;
while (it.next()) |n| {
var s = decode_seat_id(n);
var id = s.get_id();
highest_id = std.math.max(highest_id, id);
seat_ids[i] = id;
i += 1;
}
std.log.info("Highest seat id: {}", .{highest_id});
// Part2: This works because the IDs are otherwise contiguous
std.sort.insertionSort(u32, seat_ids[0..], {}, asc_u32);
// Search for a gap of 3, we're the middle of the gap
var prev : u32 = 0;
for (seat_ids) |id| {
//std.log.debug("{} [prev: {} // delta {}]", .{id, prev, id - prev});
if (prev == 0) {
prev = id;
continue;
}
if ((id - prev) != 1) {
std.log.info("Gap of {} found between {} and {}", .{id - prev, prev, id});
std.log.info("Seat ID: {}", .{id - 1});
}
prev = id;
}
}
const asc_u32 = std.sort.asc(u32);
const Seat = struct {
row : u32 = 0,
col : u32 = 0,
pub fn get_id(self: *Seat) u32 {
return (self.row*8) + self.col;
}
};
fn decode_seat_id(code: []const u8) Seat {
//std.log.debug("{}", .{code});
return Seat {
.row = _bsp(code[0..7], 127),
.col = _bsp(code[7..], 7),
};
}
fn _bsp(code: []const u8, max_val: u32) u32 {
var min : u32 = 0;
var max : u32 = max_val;
for (code) |c| {
var half_range = (max-min)/2;
if (c == 'F' or c == 'L') {
// Low half
max = min + half_range;
}
else if (c == 'B' or c == 'R') {
min = max - half_range;
}
}
//std.log.debug("{} --> {}, {}", .{code, min, max});
std.debug.assert(max == min);
return max;
}
test "bsp" {
var s0 = decode_seat_id("FBFBBFFRLR");
std.testing.expectEqual(s0.row, 44);
std.testing.expectEqual(s0.col, 5);
std.testing.expectEqual(s0.get_id(), 357);
var s1 = decode_seat_id("BFFFBBFRRR");
std.testing.expectEqual(s1.row, 70);
std.testing.expectEqual(s1.col, 7);
std.testing.expectEqual(s1.get_id(), 567);
var s2 = decode_seat_id("FFFBBBFRRR");
std.testing.expectEqual(s2.row, 14);
std.testing.expectEqual(s2.col, 7);
std.testing.expectEqual(s2.get_id(), 119);
var s3 = decode_seat_id("BBFFBBFRLL");
std.testing.expectEqual(s3.row, 102);
std.testing.expectEqual(s3.col, 4);
std.testing.expectEqual(s3.get_id(), 820);
}

27
day6/build.zig Normal file
View File

@ -0,0 +1,27 @@
const Builder = @import("std").build.Builder;
pub fn build(b: *Builder) void {
// Standard target options allows the person running `zig build` to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
// for restricting supported target set are available.
const target = b.standardTargetOptions(.{});
// Standard release options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
const mode = b.standardReleaseOptions();
const exe = b.addExecutable("day6", "src/main.zig");
exe.setTarget(target);
exe.setBuildMode(mode);
exe.install();
const run_cmd = exe.run();
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
}

2079
day6/input Normal file

File diff suppressed because it is too large Load Diff

118
day6/src/main.zig Normal file
View File

@ -0,0 +1,118 @@
const std = @import("std");
pub fn main() anyerror!void {
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
defer arena.deinit();
var gpa = &arena.allocator;
var records = try read_records("input", gpa);
// part 1
var yes_per_group = std.ArrayList(u32).init(gpa);
var yeses : u32 = 0;
for (records.items) |r| {
var map = std.hash_map.AutoHashMap(u8, bool).init(gpa);
defer map.deinit();
try map.ensureCapacity(26);
for (r) |c| {
if (std.ascii.isAlpha(c)) {
map.putAssumeCapacity(c, true);
}
}
var count = map.count();
std.log.debug("{} yeses in group '{}'", .{count, r});
try yes_per_group.append(count);
yeses += count;
}
std.log.info("{} yeses across {} groups", .{yeses, yes_per_group.items.len});
// part 2
const one :u26 = comptime 1;
var and_yeses : u32 = 0;
for (records.items) |r| {
var it = std.mem.tokenize(r, " ");
var state : u26 = std.math.maxInt(u26);
while (it.next()) |answer| {
var person_yeses : u26 = 0;
for (answer) |c| {
if (std.ascii.isAlpha(c)) {
person_yeses |= (one << @intCast(u5, (c-97)));
}
}
//std.log.debug("{x} <-- {}", .{person_yeses, answer});
state &= person_yeses;
}
//std.log.debug("{x}", .{state});
var count = count_one_bits(state);
//std.log.debug("{} and-yeses in group '{}'", .{count, r});
and_yeses += count;
}
std.log.info("{} and-yeses across {} groups", .{and_yeses, yes_per_group.items.len});
}
fn count_one_bits(a: u26) u32 {
var i : u5 = 0;
var one : u26 = 1;
var count : u32 = 0;
while (i < 26) : (i += 1) {
var b : u26 = one << i;
if ((a & b) == b) {
count +=1;
}
}
return count;
}
fn read_records(filename: []const u8, allocator: *std.mem.Allocator) !std.ArrayList([]u8) {
var file = try std.fs.cwd().openFile(filename, .{});
var reader = file.reader();
var records = std.ArrayList([]u8).init(allocator);
var record = std.ArrayList(u8).init(allocator);
var n_newlines : u32 = 0;
var just_had_newline = false;
const state = enum {
AddingData,
CheckingNewline,
RecordEnd,
};
var current_state = state.AddingData;
while(true) {
var n = reader.readByte() catch |err| {
// Finalize record
try records.append(try allocator.dupe(u8, record.items[0..record.items.len]));
//std.log.debug("Found record: '{}'", .{record.items});
record.deinit();
record = std.ArrayList(u8).init(allocator);
std.mem.set(u8, record.items, 0);
break;
};
if (n == '\n') {
if (current_state == state.CheckingNewline) {
current_state = state.RecordEnd;
// Finalize record
try records.append(try allocator.dupe(u8, record.items[0..record.items.len]));
//std.log.debug("Found record: '{}'", .{record.items});
record.deinit();
record = std.ArrayList(u8).init(allocator);
std.mem.set(u8, record.items, 0);
current_state = state.AddingData;
continue;
}
else {
current_state = state.CheckingNewline;
// whitespace can always be added
try record.append(' ');
continue;
}
}
else {
if (current_state == state.CheckingNewline) {
current_state = state.AddingData;
}
try record.append(n);
}
}
std.log.debug("Found {} records", .{records.items.len});
return records;
}

27
day7/build.zig Normal file
View File

@ -0,0 +1,27 @@
const Builder = @import("std").build.Builder;
pub fn build(b: *Builder) void {
// Standard target options allows the person running `zig build` to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
// for restricting supported target set are available.
const target = b.standardTargetOptions(.{});
// Standard release options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
const mode = b.standardReleaseOptions();
const exe = b.addExecutable("day7", "src/main.zig");
exe.setTarget(target);
exe.setBuildMode(mode);
exe.install();
const run_cmd = exe.run();
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
}

594
day7/input Normal file
View File

@ -0,0 +1,594 @@
vibrant aqua bags contain 1 shiny magenta bag, 2 muted teal bags, 1 dim magenta bag, 1 muted chartreuse bag.
vibrant violet bags contain 4 pale maroon bags.
dark indigo bags contain 1 light maroon bag, 3 pale red bags, 1 drab brown bag, 4 dim magenta bags.
dark coral bags contain 5 dull aqua bags, 5 plaid green bags, 2 posh bronze bags.
dim lavender bags contain 2 muted violet bags, 5 wavy gold bags, 3 vibrant plum bags, 5 bright teal bags.
mirrored turquoise bags contain 5 muted olive bags, 5 bright gold bags, 2 vibrant violet bags.
faded brown bags contain 5 faded tomato bags.
muted orange bags contain 5 dull aqua bags, 2 light salmon bags, 1 striped black bag, 1 pale gray bag.
posh black bags contain 4 faded silver bags.
muted coral bags contain 3 mirrored turquoise bags.
clear silver bags contain 5 dark cyan bags.
clear crimson bags contain 2 dim blue bags, 4 bright indigo bags.
clear salmon bags contain 4 striped cyan bags, 1 muted maroon bag, 1 light bronze bag, 1 vibrant tan bag.
light olive bags contain 1 faded white bag, 2 dull chartreuse bags, 5 faded gray bags.
muted maroon bags contain 5 dark fuchsia bags, 5 drab violet bags.
posh plum bags contain 2 striped gray bags, 5 dim violet bags.
light orange bags contain 1 light purple bag.
drab white bags contain 4 plaid lime bags, 1 drab gold bag.
plaid indigo bags contain 5 clear lime bags, 1 dark fuchsia bag.
muted red bags contain 1 dull bronze bag.
mirrored magenta bags contain 5 plaid white bags, 1 faded plum bag, 5 wavy purple bags.
dotted lavender bags contain 5 shiny olive bags, 3 plaid blue bags, 1 shiny gold bag.
drab bronze bags contain 3 wavy silver bags, 4 light turquoise bags, 1 vibrant lavender bag, 5 light magenta bags.
plaid maroon bags contain 2 dim salmon bags, 5 muted violet bags.
dull salmon bags contain 5 striped beige bags, 2 muted plum bags, 1 posh teal bag.
dotted turquoise bags contain 5 striped orange bags.
bright yellow bags contain 2 shiny olive bags, 3 wavy teal bags, 1 pale plum bag, 3 mirrored coral bags.
dark black bags contain 5 pale gray bags.
shiny yellow bags contain 4 dark aqua bags, 2 drab lime bags, 2 bright gold bags, 4 dark cyan bags.
shiny red bags contain 2 posh blue bags.
posh olive bags contain 3 dim aqua bags.
muted chartreuse bags contain 4 posh brown bags, 5 shiny magenta bags.
mirrored orange bags contain 5 dotted salmon bags, 1 posh green bag.
muted plum bags contain 1 dull red bag, 4 posh green bags.
light green bags contain 2 wavy plum bags.
light cyan bags contain 2 dotted crimson bags, 4 faded salmon bags, 3 muted coral bags, 3 plaid blue bags.
dull lavender bags contain 3 drab gold bags, 5 plaid crimson bags.
posh red bags contain 3 dotted salmon bags, 2 pale beige bags, 2 mirrored coral bags, 5 muted teal bags.
vibrant beige bags contain 2 faded lime bags.
plaid blue bags contain 5 dull red bags, 3 light maroon bags, 4 muted gold bags, 2 drab orange bags.
dotted white bags contain 3 muted white bags.
drab fuchsia bags contain 2 shiny fuchsia bags.
drab crimson bags contain 1 posh beige bag, 4 drab violet bags.
drab beige bags contain 3 mirrored orange bags, 1 wavy silver bag, 2 pale magenta bags, 1 drab lime bag.
posh teal bags contain 2 clear brown bags.
mirrored brown bags contain 2 faded tan bags.
clear coral bags contain 1 muted chartreuse bag, 2 muted violet bags, 2 faded purple bags.
pale lime bags contain 5 vibrant aqua bags, 3 wavy purple bags, 1 drab violet bag.
vibrant red bags contain 5 shiny gold bags.
shiny fuchsia bags contain 1 dark salmon bag, 1 posh white bag.
bright gray bags contain 2 dim red bags.
drab lavender bags contain 2 clear tomato bags, 1 faded red bag, 1 pale chartreuse bag.
clear red bags contain 3 light salmon bags, 1 bright red bag, 5 dark indigo bags.
bright aqua bags contain 3 faded brown bags, 1 shiny yellow bag.
faded red bags contain 3 posh turquoise bags, 5 dark fuchsia bags.
faded turquoise bags contain 3 drab fuchsia bags.
dim aqua bags contain 1 faded white bag, 5 faded violet bags.
muted white bags contain 5 pale red bags, 4 dull red bags, 3 dotted maroon bags.
dull gold bags contain 3 posh green bags, 2 mirrored yellow bags, 2 dull olive bags, 2 bright purple bags.
faded blue bags contain 3 wavy crimson bags, 1 plaid beige bag, 3 dotted orange bags, 1 vibrant purple bag.
faded gray bags contain 1 bright gold bag.
dim bronze bags contain 2 bright gold bags, 4 light brown bags, 5 muted chartreuse bags.
light teal bags contain 5 striped tomato bags, 5 drab teal bags, 5 shiny lavender bags.
striped white bags contain 1 plaid silver bag, 2 wavy plum bags, 3 dull maroon bags, 2 muted green bags.
vibrant salmon bags contain 2 shiny violet bags, 4 light salmon bags.
dim plum bags contain 1 dull blue bag, 5 vibrant bronze bags.
dotted fuchsia bags contain 4 plaid green bags.
plaid crimson bags contain 3 clear teal bags, 5 dark gray bags, 2 mirrored tan bags, 5 shiny fuchsia bags.
pale white bags contain 2 muted silver bags, 1 muted lime bag.
bright violet bags contain 2 clear chartreuse bags, 2 dull gray bags, 2 muted cyan bags.
drab red bags contain 1 dotted white bag, 1 light plum bag, 5 muted indigo bags, 1 dull lime bag.
muted indigo bags contain 3 mirrored blue bags, 5 light fuchsia bags.
vibrant cyan bags contain 2 pale blue bags, 3 mirrored chartreuse bags.
mirrored gray bags contain 1 shiny red bag, 2 pale blue bags, 4 dotted lime bags, 1 faded violet bag.
posh lavender bags contain 3 vibrant aqua bags, 5 mirrored chartreuse bags.
dotted silver bags contain 3 dark beige bags, 5 dotted teal bags, 3 mirrored indigo bags, 2 dim yellow bags.
wavy magenta bags contain 4 wavy beige bags.
faded tomato bags contain 3 plaid black bags, 5 bright orange bags, 2 vibrant blue bags.
mirrored maroon bags contain 3 plaid gray bags.
pale bronze bags contain 4 vibrant violet bags, 2 muted white bags.
plaid turquoise bags contain 2 dotted lime bags, 3 striped beige bags, 1 pale crimson bag, 2 pale purple bags.
posh turquoise bags contain 5 clear yellow bags, 1 dotted turquoise bag, 3 dim cyan bags, 5 pale maroon bags.
wavy white bags contain 2 mirrored gray bags, 3 pale yellow bags.
vibrant tan bags contain 1 wavy lavender bag.
pale turquoise bags contain 2 dark gray bags, 4 faded green bags, 1 light maroon bag, 5 posh white bags.
faded beige bags contain 1 striped brown bag, 1 dull gray bag, 5 mirrored blue bags.
bright maroon bags contain 1 light blue bag, 5 dim bronze bags, 4 dotted beige bags.
shiny lavender bags contain 3 dim gray bags, 4 pale gray bags.
dull beige bags contain 3 dark crimson bags.
striped coral bags contain 3 dark lavender bags, 2 mirrored turquoise bags, 5 posh maroon bags, 1 striped yellow bag.
shiny magenta bags contain 1 plaid black bag.
muted magenta bags contain 2 plaid beige bags.
light salmon bags contain 5 striped black bags, 1 pale lavender bag.
shiny white bags contain 2 bright gold bags, 3 mirrored olive bags.
dark tomato bags contain 2 dark gold bags, 2 clear teal bags, 5 dull fuchsia bags, 4 dotted gold bags.
dotted violet bags contain 3 plaid teal bags, 5 mirrored aqua bags.
plaid purple bags contain 4 mirrored olive bags.
drab lime bags contain 5 bright beige bags, 4 mirrored tan bags, 5 striped black bags, 4 faded green bags.
dull blue bags contain 4 light red bags, 2 pale turquoise bags, 1 posh maroon bag.
muted tan bags contain 1 pale magenta bag, 3 mirrored turquoise bags, 3 shiny blue bags, 4 dotted salmon bags.
dim teal bags contain 1 posh turquoise bag, 3 dull red bags.
muted fuchsia bags contain 4 pale salmon bags, 1 pale silver bag, 3 pale maroon bags, 2 bright purple bags.
bright gold bags contain 2 shiny magenta bags, 4 pale red bags, 4 posh brown bags.
faded lime bags contain 5 vibrant bronze bags, 2 pale violet bags, 2 plaid coral bags.
posh tan bags contain 3 bright lavender bags, 2 striped blue bags, 5 shiny gold bags.
posh bronze bags contain 3 plaid olive bags, 3 dotted salmon bags.
shiny lime bags contain 1 bright salmon bag, 3 faded green bags, 2 wavy aqua bags.
faded lavender bags contain 2 bright silver bags.
muted black bags contain 5 mirrored coral bags.
plaid chartreuse bags contain 3 dull coral bags, 2 light tomato bags.
mirrored aqua bags contain 2 dark cyan bags, 2 dark indigo bags.
dark yellow bags contain 5 dotted lime bags, 1 dim cyan bag.
bright plum bags contain 5 dim salmon bags.
striped gray bags contain 3 plaid black bags, 1 wavy crimson bag, 5 bright orange bags.
faded salmon bags contain 3 clear lime bags, 4 drab purple bags.
pale olive bags contain 2 light magenta bags, 4 dim salmon bags, 5 light olive bags, 2 pale salmon bags.
faded crimson bags contain 2 wavy beige bags, 4 dim aqua bags, 5 light lavender bags.
posh chartreuse bags contain 5 pale lavender bags, 5 mirrored turquoise bags, 2 dark maroon bags.
posh aqua bags contain 5 faded crimson bags, 2 mirrored tan bags.
faded coral bags contain 2 dotted lime bags, 2 faded white bags.
striped bronze bags contain 4 plaid blue bags, 1 plaid coral bag.
wavy orange bags contain 5 pale tomato bags.
dim crimson bags contain 4 posh tan bags, 1 muted gold bag.
clear gray bags contain 3 striped lime bags, 4 vibrant fuchsia bags.
light gold bags contain 4 bright tan bags, 5 faded lime bags, 4 faded plum bags, 5 clear brown bags.
wavy red bags contain 4 pale red bags, 4 dotted maroon bags, 4 mirrored violet bags.
dull silver bags contain 1 striped turquoise bag, 2 striped orange bags, 1 dotted plum bag, 3 muted coral bags.
striped magenta bags contain 1 mirrored tan bag.
plaid plum bags contain 4 wavy tan bags, 5 wavy brown bags, 5 shiny olive bags, 5 clear yellow bags.
faded chartreuse bags contain 1 shiny teal bag.
clear chartreuse bags contain 2 drab tan bags, 3 plaid maroon bags, 2 drab orange bags, 2 plaid salmon bags.
wavy olive bags contain 5 dark lavender bags.
dull orange bags contain 1 dull gray bag, 2 light magenta bags.
wavy gold bags contain 5 vibrant yellow bags, 4 pale black bags, 2 light olive bags.
muted salmon bags contain 5 dotted turquoise bags, 5 dotted violet bags.
wavy tan bags contain 2 plaid green bags.
dotted cyan bags contain 4 drab gold bags, 1 dark crimson bag, 3 pale lavender bags.
wavy coral bags contain 3 mirrored blue bags, 5 wavy white bags, 1 striped indigo bag.
clear olive bags contain 4 wavy silver bags, 2 pale orange bags, 2 bright tan bags.
light indigo bags contain 1 pale purple bag, 4 clear teal bags, 1 plaid indigo bag, 4 dim blue bags.
dotted tomato bags contain 4 dim cyan bags.
pale indigo bags contain 2 muted chartreuse bags, 4 faded salmon bags, 3 dull brown bags.
bright magenta bags contain 1 vibrant salmon bag, 1 pale teal bag, 4 faded orange bags.
faded gold bags contain 4 striped cyan bags.
shiny orange bags contain 5 vibrant turquoise bags, 3 pale purple bags.
posh salmon bags contain 1 dotted crimson bag, 3 dark maroon bags.
dull violet bags contain 2 clear indigo bags.
posh gray bags contain 1 shiny fuchsia bag, 1 faded plum bag, 5 pale turquoise bags.
dull chartreuse bags contain 4 dull red bags, 1 striped black bag, 3 dark tan bags, 3 muted maroon bags.
dotted chartreuse bags contain 5 striped aqua bags.
dim magenta bags contain no other bags.
light lime bags contain 2 shiny magenta bags, 3 striped black bags.
drab maroon bags contain 2 vibrant bronze bags, 1 clear white bag, 2 dim gray bags.
drab salmon bags contain 2 wavy crimson bags, 3 dim gold bags, 5 drab chartreuse bags.
dotted crimson bags contain 4 pale purple bags, 3 plaid coral bags.
dull red bags contain 3 dark indigo bags, 2 posh white bags, 4 light maroon bags.
drab turquoise bags contain 2 striped tomato bags, 1 bright gold bag, 5 mirrored tan bags, 1 drab chartreuse bag.
shiny teal bags contain 4 bright lime bags, 2 pale red bags.
dark purple bags contain 5 mirrored beige bags, 1 posh purple bag, 5 dotted beige bags.
drab aqua bags contain 4 plaid blue bags, 3 dark salmon bags, 4 striped lime bags, 4 striped blue bags.
dull magenta bags contain 2 clear white bags, 5 muted bronze bags.
pale tan bags contain 1 pale lime bag.
dark fuchsia bags contain 3 dim coral bags, 1 muted white bag, 2 plaid blue bags.
mirrored beige bags contain 5 dotted magenta bags, 1 wavy olive bag, 1 dark tan bag.
drab tomato bags contain 4 dim cyan bags.
shiny tomato bags contain 2 shiny maroon bags, 2 dark lavender bags, 1 posh red bag, 3 vibrant green bags.
dim turquoise bags contain 4 muted salmon bags, 2 bright purple bags, 4 plaid maroon bags, 3 bright beige bags.
mirrored salmon bags contain 2 drab violet bags, 3 faded red bags.
pale crimson bags contain 3 bright white bags, 5 plaid beige bags.
shiny cyan bags contain 4 light blue bags.
clear lavender bags contain 5 bright turquoise bags.
vibrant purple bags contain 5 pale turquoise bags, 2 posh orange bags.
striped purple bags contain 5 muted orange bags, 5 dark aqua bags.
pale gray bags contain 5 dark indigo bags, 1 vibrant violet bag, 3 pale maroon bags, 4 bright gold bags.
posh brown bags contain 3 drab brown bags, 4 pale red bags, 2 posh white bags, 4 muted gold bags.
muted bronze bags contain 2 clear magenta bags, 5 shiny green bags, 2 mirrored tan bags, 4 posh gray bags.
pale brown bags contain 5 muted white bags, 3 plaid beige bags, 3 wavy lavender bags, 3 clear indigo bags.
dull yellow bags contain 5 clear lime bags, 4 plaid blue bags, 4 dotted lime bags.
light tan bags contain 5 dull blue bags, 2 drab yellow bags, 5 mirrored red bags.
posh gold bags contain 4 dull chartreuse bags, 2 dim magenta bags.
pale silver bags contain 4 dull aqua bags, 4 bright gold bags.
light beige bags contain 3 posh orange bags, 3 mirrored gray bags, 2 bright red bags.
striped turquoise bags contain 2 posh blue bags, 1 striped orange bag, 2 shiny tan bags, 5 vibrant aqua bags.
vibrant plum bags contain 4 pale gray bags.
dotted teal bags contain 2 dim magenta bags.
dull purple bags contain 5 drab brown bags, 4 dotted maroon bags, 1 muted white bag.
mirrored fuchsia bags contain 2 dark tomato bags, 4 faded tan bags, 2 faded white bags, 4 dotted orange bags.
dotted plum bags contain 2 dull aqua bags, 4 faded green bags.
bright fuchsia bags contain 2 wavy blue bags, 5 clear brown bags.
dim beige bags contain 2 pale orange bags.
dotted orange bags contain 2 faded brown bags, 1 clear tomato bag, 1 clear indigo bag.
plaid gold bags contain 1 striped turquoise bag, 3 vibrant magenta bags, 5 shiny gray bags, 5 shiny red bags.
clear plum bags contain 3 dim turquoise bags, 3 faded magenta bags, 2 dull coral bags.
muted green bags contain 3 dim crimson bags.
bright black bags contain 3 pale purple bags, 3 plaid white bags, 1 clear teal bag, 3 pale magenta bags.
dim gray bags contain 3 dull coral bags, 1 pale turquoise bag, 5 wavy cyan bags, 5 striped lime bags.
dotted beige bags contain 5 dull aqua bags, 3 dark fuchsia bags, 1 pale violet bag, 4 dim gold bags.
mirrored lime bags contain 4 plaid tomato bags, 1 pale lavender bag, 5 shiny blue bags, 1 light gray bag.
bright chartreuse bags contain 1 dotted teal bag, 3 shiny lavender bags.
vibrant tomato bags contain 1 vibrant coral bag.
mirrored purple bags contain 4 dark tan bags, 4 faded coral bags.
pale tomato bags contain 1 dull maroon bag, 2 striped tan bags, 5 muted cyan bags, 2 dark maroon bags.
vibrant brown bags contain 1 vibrant bronze bag, 2 pale yellow bags, 4 wavy coral bags.
dim green bags contain 2 striped coral bags.
muted lavender bags contain 3 clear purple bags, 4 dark red bags, 1 light silver bag, 1 dull blue bag.
wavy crimson bags contain 5 muted teal bags, 1 drab brown bag, 3 posh brown bags.
wavy tomato bags contain 4 striped blue bags, 3 mirrored lime bags, 1 shiny gray bag, 1 dark plum bag.
muted aqua bags contain 3 clear silver bags, 3 bright chartreuse bags, 4 striped teal bags, 2 clear indigo bags.
posh blue bags contain 2 posh teal bags, 4 dark maroon bags, 2 drab brown bags, 5 faded coral bags.
vibrant silver bags contain 5 drab yellow bags, 3 faded silver bags, 2 bright silver bags.
dim chartreuse bags contain 4 pale beige bags.
shiny gray bags contain 3 dotted magenta bags, 4 plaid crimson bags.
dim salmon bags contain 4 clear lime bags, 3 muted tomato bags, 2 shiny olive bags.
clear orange bags contain 4 posh beige bags, 5 dotted gray bags, 5 dotted turquoise bags.
plaid salmon bags contain 4 bright indigo bags.
posh beige bags contain 3 pale red bags.
clear lime bags contain 1 bright gold bag.
faded magenta bags contain 5 dim salmon bags, 3 dull aqua bags, 5 drab crimson bags.
drab blue bags contain 5 dark maroon bags, 4 wavy plum bags.
plaid aqua bags contain 5 mirrored orange bags, 3 dull violet bags, 3 bright salmon bags.
muted teal bags contain 4 dull red bags, 1 light maroon bag, 4 dark cyan bags.
posh green bags contain 1 mirrored chartreuse bag, 4 muted chartreuse bags, 5 plaid olive bags, 4 dark salmon bags.
posh fuchsia bags contain 3 bright cyan bags, 1 bright salmon bag, 4 dim salmon bags, 1 light black bag.
muted yellow bags contain 2 muted teal bags, 5 pale orange bags.
clear cyan bags contain 3 clear teal bags, 5 drab aqua bags, 2 drab brown bags.
wavy salmon bags contain 5 dark fuchsia bags, 2 dull gray bags, 4 pale tan bags.
dull crimson bags contain 5 faded indigo bags, 2 plaid black bags.
mirrored white bags contain 2 dotted plum bags, 2 dark coral bags, 3 faded gray bags.
striped violet bags contain 4 mirrored tan bags.
striped tan bags contain 2 posh coral bags.
striped tomato bags contain 1 muted teal bag, 1 faded tan bag.
faded aqua bags contain 5 faded red bags, 2 mirrored coral bags, 5 light red bags, 2 mirrored purple bags.
drab olive bags contain 2 drab gold bags.
bright lavender bags contain 1 dark salmon bag, 1 striped olive bag.
plaid green bags contain 2 bright gold bags.
dim purple bags contain 1 plaid yellow bag, 3 muted plum bags, 2 vibrant magenta bags.
faded violet bags contain 3 mirrored violet bags.
posh tomato bags contain 1 dark indigo bag, 2 pale yellow bags, 5 dull orange bags.
dim silver bags contain 1 dotted white bag, 5 faded white bags.
dotted red bags contain 2 dull yellow bags, 4 dim lavender bags, 1 light gold bag.
bright indigo bags contain 5 pale gray bags, 3 posh white bags.
faded fuchsia bags contain 4 muted green bags, 3 posh magenta bags.
wavy silver bags contain 1 dotted violet bag, 3 drab tomato bags, 4 dark fuchsia bags.
dim white bags contain 2 bright magenta bags.
pale beige bags contain 5 dim orange bags, 5 vibrant red bags.
vibrant orange bags contain 4 dull violet bags, 2 mirrored salmon bags, 1 drab lavender bag.
clear fuchsia bags contain 1 mirrored olive bag, 4 mirrored chartreuse bags, 1 posh beige bag.
vibrant indigo bags contain 5 dim lavender bags, 4 drab blue bags, 1 muted beige bag.
dim brown bags contain 2 posh brown bags.
plaid beige bags contain 1 dark tan bag, 5 clear teal bags, 2 light gray bags, 4 wavy lime bags.
bright crimson bags contain 4 drab chartreuse bags, 4 vibrant blue bags, 5 mirrored lime bags, 2 muted plum bags.
shiny purple bags contain 1 muted crimson bag.
wavy bronze bags contain 1 dim brown bag, 3 light salmon bags, 1 muted teal bag, 3 plaid olive bags.
faded bronze bags contain 2 striped blue bags, 2 posh white bags, 2 posh orange bags.
dark orange bags contain 2 vibrant aqua bags, 5 dark maroon bags, 1 mirrored aqua bag.
drab green bags contain 2 faded aqua bags, 5 posh crimson bags.
clear white bags contain 3 plaid black bags, 2 posh white bags, 5 posh lavender bags, 1 dull purple bag.
wavy black bags contain 4 bright magenta bags.
posh crimson bags contain 3 dark yellow bags, 1 mirrored purple bag, 2 dark maroon bags, 5 shiny olive bags.
dotted gray bags contain 4 posh maroon bags, 2 mirrored chartreuse bags, 5 wavy fuchsia bags.
vibrant lavender bags contain 2 plaid coral bags, 4 posh brown bags, 4 dim tan bags.
drab violet bags contain 4 muted gold bags.
striped maroon bags contain 4 dotted lavender bags, 2 dark fuchsia bags, 3 bright olive bags.
plaid white bags contain 2 wavy olive bags, 2 pale blue bags, 4 pale aqua bags.
pale gold bags contain 4 bright teal bags, 2 posh bronze bags, 3 shiny maroon bags, 1 pale brown bag.
vibrant olive bags contain 3 plaid green bags, 2 light maroon bags, 3 dotted salmon bags, 4 faded tomato bags.
dotted maroon bags contain no other bags.
light blue bags contain 2 dim violet bags, 1 vibrant beige bag.
mirrored tan bags contain 4 drab brown bags, 1 striped orange bag, 5 light maroon bags, 2 dotted maroon bags.
dark beige bags contain 1 drab maroon bag.
light silver bags contain 1 shiny chartreuse bag, 2 dim turquoise bags.
dull green bags contain 2 striped chartreuse bags, 2 mirrored gold bags, 4 dim fuchsia bags.
faded silver bags contain 3 drab violet bags.
bright beige bags contain 5 bright teal bags, 5 mirrored violet bags.
striped gold bags contain 2 wavy beige bags, 4 dim black bags.
wavy fuchsia bags contain 4 posh green bags.
shiny blue bags contain 3 posh maroon bags.
mirrored indigo bags contain 3 striped cyan bags, 2 vibrant blue bags, 5 wavy violet bags.
dim tomato bags contain 4 dull orange bags, 5 shiny green bags, 1 plaid olive bag.
plaid violet bags contain 1 dull violet bag, 4 plaid fuchsia bags.
dark white bags contain 3 drab orange bags.
drab indigo bags contain 3 dark red bags, 2 plaid tomato bags, 5 clear white bags.
shiny beige bags contain 2 posh tomato bags.
striped indigo bags contain 5 clear lavender bags, 5 dotted indigo bags, 1 muted cyan bag, 5 dark olive bags.
drab cyan bags contain 1 drab orange bag, 4 posh gold bags.
light red bags contain 4 dark indigo bags, 1 vibrant violet bag, 4 shiny magenta bags.
muted gold bags contain 3 light maroon bags, 1 striped orange bag, 4 pale maroon bags.
clear indigo bags contain 4 faded green bags, 3 clear crimson bags, 2 vibrant cyan bags.
faded tan bags contain 5 bright gold bags.
shiny salmon bags contain 1 bright lavender bag, 1 posh blue bag, 4 shiny coral bags.
dull turquoise bags contain 5 drab yellow bags, 5 dotted plum bags, 5 plaid magenta bags.
posh lime bags contain 4 wavy tan bags, 4 shiny tomato bags, 4 dim violet bags, 5 bright tan bags.
pale green bags contain 1 wavy gray bag, 2 faded lavender bags, 1 vibrant yellow bag.
mirrored gold bags contain 2 light gray bags, 5 wavy tan bags.
mirrored green bags contain 1 faded violet bag.
dark red bags contain 3 faded bronze bags, 4 dark green bags, 4 wavy crimson bags.
bright tomato bags contain 4 faded bronze bags.
mirrored crimson bags contain 5 faded red bags, 1 drab crimson bag.
faded orange bags contain 2 muted teal bags, 5 pale maroon bags, 1 dark yellow bag.
striped silver bags contain 4 mirrored lime bags, 1 dull tan bag, 1 pale fuchsia bag, 1 wavy purple bag.
wavy aqua bags contain 4 vibrant aqua bags, 4 shiny fuchsia bags, 4 dotted turquoise bags, 4 striped olive bags.
striped lavender bags contain 5 shiny lavender bags, 3 pale lime bags.
vibrant white bags contain 2 dim bronze bags, 2 light red bags, 5 shiny gold bags.
vibrant yellow bags contain 1 shiny turquoise bag, 5 dull beige bags, 4 dark gold bags, 5 dull tomato bags.
striped green bags contain 5 striped tomato bags.
muted silver bags contain 5 striped maroon bags, 5 light salmon bags, 4 clear maroon bags.
light plum bags contain 5 mirrored blue bags, 2 vibrant coral bags, 5 dim brown bags, 2 striped yellow bags.
posh yellow bags contain 1 mirrored salmon bag, 5 light plum bags.
plaid magenta bags contain 3 dull plum bags, 2 mirrored tan bags.
plaid tan bags contain 4 light turquoise bags, 4 faded purple bags, 3 mirrored crimson bags.
shiny black bags contain 3 striped violet bags, 1 dim cyan bag, 2 dim white bags.
wavy brown bags contain 2 plaid lavender bags.
vibrant gold bags contain 1 clear tomato bag, 1 wavy olive bag, 2 faded magenta bags.
clear brown bags contain 2 dim blue bags.
dim fuchsia bags contain 2 bright gold bags, 5 wavy purple bags, 3 posh orange bags.
muted turquoise bags contain 1 light turquoise bag, 3 vibrant plum bags, 5 posh maroon bags, 1 muted maroon bag.
shiny coral bags contain 3 striped yellow bags.
dotted coral bags contain 1 dark orange bag, 4 striped violet bags.
shiny bronze bags contain 5 mirrored yellow bags, 4 light violet bags, 4 light crimson bags.
dull cyan bags contain 2 dim cyan bags, 5 pale red bags.
bright tan bags contain 4 pale gray bags, 4 posh brown bags, 3 shiny fuchsia bags.
pale purple bags contain 5 wavy cyan bags, 5 dark salmon bags, 2 dark indigo bags, 1 plaid black bag.
shiny gold bags contain 2 pale maroon bags, 5 pale purple bags, 4 posh brown bags, 1 dotted turquoise bag.
dim tan bags contain 4 dark violet bags, 3 shiny blue bags.
wavy green bags contain 3 plaid gray bags.
pale orange bags contain 3 dim lime bags, 2 dark coral bags.
faded maroon bags contain 5 clear black bags, 3 light lavender bags, 3 light black bags, 2 muted orange bags.
drab teal bags contain 2 dotted crimson bags, 3 dim teal bags, 5 pale turquoise bags, 4 dark plum bags.
bright orange bags contain 3 pale maroon bags, 1 pale bronze bag, 3 dotted maroon bags.
posh coral bags contain 3 dim gold bags, 1 bright indigo bag, 3 clear black bags.
mirrored bronze bags contain 5 dull violet bags, 3 vibrant red bags.
pale lavender bags contain 2 pale purple bags, 1 pale red bag, 4 vibrant blue bags, 3 muted chartreuse bags.
wavy lavender bags contain 3 drab chartreuse bags, 1 posh teal bag.
pale blue bags contain 1 dark tan bag, 4 faded violet bags, 3 dim coral bags.
striped yellow bags contain 2 pale red bags.
shiny aqua bags contain 3 pale magenta bags.
faded olive bags contain 1 vibrant white bag, 4 muted cyan bags.
dark chartreuse bags contain 3 dim magenta bags, 3 dull plum bags, 2 pale lime bags.
dim lime bags contain 3 muted white bags, 4 striped blue bags.
wavy cyan bags contain 4 light maroon bags.
light bronze bags contain 1 dull lime bag.
muted beige bags contain 4 wavy blue bags, 2 dotted violet bags, 4 shiny orange bags.
dim coral bags contain 4 wavy crimson bags, 3 mirrored tan bags, 2 wavy cyan bags, 5 light maroon bags.
dark green bags contain 2 striped gray bags, 3 pale lavender bags, 1 striped lime bag.
pale cyan bags contain 2 vibrant green bags, 1 mirrored lime bag, 5 vibrant chartreuse bags, 1 shiny lime bag.
shiny crimson bags contain 4 dull aqua bags, 1 pale turquoise bag.
pale black bags contain 3 vibrant olive bags, 2 dull aqua bags, 1 drab turquoise bag.
striped crimson bags contain 4 dotted lavender bags, 2 clear orange bags.
clear maroon bags contain 2 muted bronze bags, 3 vibrant olive bags, 1 striped lavender bag.
dim olive bags contain 1 wavy lavender bag, 1 dotted salmon bag, 1 pale silver bag, 5 vibrant coral bags.
dotted indigo bags contain 3 dark salmon bags, 2 shiny turquoise bags, 4 plaid coral bags.
plaid orange bags contain 2 mirrored plum bags, 5 faded lime bags, 4 dotted brown bags, 2 pale tan bags.
light maroon bags contain no other bags.
light violet bags contain 5 clear yellow bags, 4 muted chartreuse bags.
light lavender bags contain 3 striped olive bags, 1 posh black bag.
muted lime bags contain 2 muted turquoise bags, 3 mirrored yellow bags, 5 clear gray bags.
faded black bags contain 1 bright crimson bag, 1 dotted beige bag, 2 shiny magenta bags.
wavy blue bags contain 5 vibrant plum bags, 5 shiny fuchsia bags, 2 posh orange bags, 1 wavy purple bag.
dark turquoise bags contain 5 shiny tan bags, 2 dull silver bags, 2 muted lime bags, 2 mirrored tan bags.
mirrored teal bags contain 4 pale brown bags, 5 drab lime bags, 5 striped beige bags.
vibrant gray bags contain 5 bright yellow bags, 1 vibrant teal bag.
clear purple bags contain 5 bright silver bags, 1 bright teal bag, 1 wavy lime bag, 4 striped blue bags.
striped lime bags contain 1 mirrored violet bag, 3 dim cyan bags, 3 vibrant turquoise bags, 2 muted white bags.
mirrored lavender bags contain 2 faded yellow bags.
posh maroon bags contain 1 dotted salmon bag, 5 drab violet bags, 5 striped lime bags, 3 dotted olive bags.
faded yellow bags contain 1 dull plum bag, 5 dim fuchsia bags.
dull aqua bags contain 2 pale maroon bags.
dark tan bags contain 4 dark salmon bags.
dim maroon bags contain 4 posh aqua bags, 3 striped yellow bags.
faded purple bags contain 5 clear teal bags, 2 dark olive bags.
clear tomato bags contain 2 pale maroon bags.
dull gray bags contain 5 light brown bags, 3 bright gold bags, 4 faded white bags, 3 vibrant coral bags.
dull maroon bags contain 4 clear indigo bags, 5 shiny magenta bags, 3 drab tomato bags, 4 dim violet bags.
pale coral bags contain 2 pale bronze bags, 2 wavy salmon bags.
drab silver bags contain 3 dark coral bags, 5 shiny violet bags, 5 faded indigo bags.
plaid black bags contain 1 dull red bag.
plaid silver bags contain 4 clear cyan bags.
dotted blue bags contain 2 plaid beige bags, 4 posh cyan bags, 4 shiny gray bags.
dotted magenta bags contain 1 drab orange bag, 5 wavy aqua bags, 2 wavy lavender bags.
clear aqua bags contain 4 striped magenta bags, 4 muted chartreuse bags.
pale red bags contain no other bags.
bright turquoise bags contain 1 wavy purple bag, 3 vibrant turquoise bags, 2 dark brown bags.
vibrant magenta bags contain 5 drab brown bags, 2 striped olive bags, 5 light plum bags.
dull brown bags contain 4 drab teal bags, 4 bright gold bags, 4 dim blue bags, 3 dotted teal bags.
dotted olive bags contain 5 striped orange bags, 1 wavy cyan bag, 3 wavy crimson bags.
bright teal bags contain 3 dim coral bags, 1 dark cyan bag, 4 bright indigo bags.
shiny chartreuse bags contain 1 drab brown bag.
bright lime bags contain 2 pale silver bags.
vibrant crimson bags contain 4 shiny white bags, 4 pale black bags, 5 clear cyan bags, 1 bright tan bag.
muted brown bags contain 5 drab purple bags.
dotted aqua bags contain 1 dim gray bag, 1 dark indigo bag, 3 posh tan bags, 5 dim lime bags.
muted tomato bags contain 1 faded orange bag, 3 vibrant aqua bags.
bright cyan bags contain 4 dotted coral bags, 2 dull lime bags, 5 clear maroon bags.
posh violet bags contain 1 light magenta bag, 4 pale maroon bags, 1 dark teal bag.
wavy turquoise bags contain 1 shiny gray bag, 4 drab tan bags, 3 pale lavender bags.
dark magenta bags contain 2 dull bronze bags.
drab gray bags contain 4 dotted turquoise bags, 5 light aqua bags.
dull coral bags contain 2 plaid black bags, 2 striped cyan bags, 3 faded bronze bags, 5 plaid crimson bags.
vibrant chartreuse bags contain 5 pale turquoise bags.
bright purple bags contain 5 vibrant salmon bags, 1 posh green bag, 4 vibrant beige bags.
mirrored tomato bags contain 4 wavy beige bags, 5 striped tan bags, 2 pale aqua bags.
shiny violet bags contain 3 shiny tan bags, 3 faded brown bags, 4 shiny green bags, 3 shiny orange bags.
plaid lavender bags contain 1 light maroon bag.
faded green bags contain 5 dark cyan bags, 2 clear teal bags, 5 muted olive bags.
dotted salmon bags contain 3 dotted olive bags, 1 dark cyan bag.
faded white bags contain 3 drab brown bags.
striped black bags contain 2 dark green bags, 5 pale bronze bags, 2 plaid olive bags.
dotted brown bags contain 1 drab salmon bag.
dark crimson bags contain 1 vibrant teal bag, 2 dim gray bags, 1 posh orange bag, 3 faded tan bags.
pale teal bags contain 5 dim violet bags.
striped cyan bags contain 3 pale purple bags, 4 dull red bags, 1 dark indigo bag, 3 dark yellow bags.
mirrored coral bags contain 2 shiny olive bags.
shiny maroon bags contain 5 vibrant coral bags, 3 plaid maroon bags, 1 striped turquoise bag, 2 wavy violet bags.
dull indigo bags contain 2 plaid magenta bags, 1 bright chartreuse bag.
drab magenta bags contain 4 striped olive bags, 3 posh white bags.
clear tan bags contain 4 light gold bags, 4 muted gold bags.
dark gray bags contain 4 plaid blue bags, 5 drab brown bags, 3 pale gray bags, 3 mirrored violet bags.
wavy teal bags contain 4 drab aqua bags, 3 pale salmon bags.
dotted tan bags contain 2 pale bronze bags, 3 faded orange bags.
bright brown bags contain 3 bright blue bags.
clear blue bags contain 5 shiny crimson bags, 1 dark cyan bag.
clear yellow bags contain 1 muted gold bag, 1 posh orange bag, 1 dull purple bag, 4 dark indigo bags.
pale aqua bags contain 3 dim coral bags, 2 mirrored aqua bags.
dull olive bags contain 1 dull yellow bag.
muted violet bags contain 3 shiny tan bags.
striped aqua bags contain 2 vibrant green bags, 2 faded coral bags, 2 dark cyan bags, 4 wavy beige bags.
pale fuchsia bags contain 5 dull green bags, 2 dotted aqua bags.
shiny brown bags contain 4 dim black bags.
plaid coral bags contain 3 faded bronze bags, 2 pale lavender bags, 3 dotted tan bags, 2 wavy lavender bags.
posh magenta bags contain 2 clear red bags, 4 dim brown bags.
wavy purple bags contain 4 dim magenta bags.
plaid fuchsia bags contain 2 striped olive bags, 3 light gray bags.
dim violet bags contain 3 dark brown bags, 4 muted plum bags.
light turquoise bags contain 5 clear brown bags, 5 muted chartreuse bags.
dull white bags contain 4 wavy salmon bags, 3 dotted crimson bags, 1 dark coral bag, 1 pale chartreuse bag.
light brown bags contain 2 plaid black bags, 3 light red bags.
dotted purple bags contain 1 posh crimson bag, 4 vibrant red bags, 2 wavy beige bags.
striped orange bags contain no other bags.
clear green bags contain 3 light plum bags, 1 wavy lavender bag, 1 shiny olive bag.
bright red bags contain 5 dotted turquoise bags, 3 dim aqua bags, 2 posh orange bags.
dark bronze bags contain 2 pale yellow bags, 1 striped brown bag, 3 striped chartreuse bags.
muted cyan bags contain 3 muted olive bags, 2 shiny red bags, 1 vibrant lavender bag, 5 drab gold bags.
light coral bags contain 3 shiny gray bags, 5 dull bronze bags, 5 muted fuchsia bags, 5 clear magenta bags.
shiny olive bags contain 4 dull cyan bags, 5 dark gray bags.
drab orange bags contain no other bags.
striped salmon bags contain 5 drab salmon bags, 5 pale plum bags.
plaid cyan bags contain 2 bright blue bags, 1 mirrored gray bag, 5 faded violet bags.
plaid teal bags contain 3 pale maroon bags, 1 clear teal bag.
faded cyan bags contain 1 dim bronze bag, 3 light olive bags, 1 muted beige bag, 1 wavy teal bag.
clear magenta bags contain 5 striped orange bags.
dull black bags contain 1 shiny purple bag, 1 mirrored red bag, 4 dotted fuchsia bags, 3 vibrant crimson bags.
mirrored blue bags contain 3 light brown bags.
mirrored black bags contain 3 dim coral bags, 3 plaid purple bags.
dim black bags contain 4 dim blue bags.
pale plum bags contain 4 muted coral bags, 2 light purple bags.
dark salmon bags contain 2 plaid blue bags, 4 vibrant turquoise bags, 3 posh white bags.
striped red bags contain 1 dim plum bag.
striped beige bags contain 1 dark tomato bag.
clear beige bags contain 2 posh orange bags, 4 muted coral bags.
bright blue bags contain 4 faded gold bags, 4 faded indigo bags.
light purple bags contain 4 muted violet bags, 1 pale red bag.
dim indigo bags contain 3 dim silver bags, 2 faded violet bags.
dotted green bags contain 5 dotted chartreuse bags, 1 pale black bag.
pale yellow bags contain 3 plaid tomato bags.
drab tan bags contain 3 dim plum bags, 2 dark fuchsia bags.
bright white bags contain 3 muted bronze bags.
shiny turquoise bags contain 4 drab brown bags.
pale maroon bags contain no other bags.
faded indigo bags contain 1 faded tomato bag, 2 light red bags, 5 vibrant bronze bags.
dotted black bags contain 1 clear brown bag, 5 mirrored olive bags, 4 dim brown bags, 2 drab red bags.
light chartreuse bags contain 5 muted black bags.
posh orange bags contain 4 light maroon bags, 1 muted white bag.
vibrant turquoise bags contain 1 dark maroon bag, 1 shiny magenta bag, 2 dotted maroon bags.
striped fuchsia bags contain 5 clear blue bags, 5 pale black bags, 1 mirrored maroon bag, 2 dotted maroon bags.
dark violet bags contain 5 clear white bags.
pale salmon bags contain 1 vibrant violet bag, 3 plaid olive bags.
pale violet bags contain 4 shiny chartreuse bags, 5 dark salmon bags, 3 bright indigo bags, 4 dark orange bags.
faded teal bags contain 2 dark gray bags, 2 posh black bags, 3 plaid maroon bags.
drab yellow bags contain 4 mirrored blue bags, 4 mirrored violet bags, 3 dim salmon bags, 1 clear yellow bag.
wavy indigo bags contain 2 shiny olive bags, 5 plaid aqua bags.
shiny tan bags contain 2 wavy purple bags, 1 dotted aqua bag, 1 light violet bag.
dull lime bags contain 1 dull coral bag.
clear turquoise bags contain 1 vibrant fuchsia bag, 5 dull beige bags.
dark blue bags contain 2 dark violet bags, 2 dotted maroon bags, 4 bright aqua bags, 4 clear black bags.
drab black bags contain 2 dim gold bags, 1 plaid crimson bag.
dotted bronze bags contain 5 dim bronze bags.
mirrored cyan bags contain 3 muted salmon bags.
light gray bags contain 1 faded gold bag, 4 faded coral bags, 4 faded silver bags, 2 faded tomato bags.
vibrant blue bags contain 2 muted gold bags.
dark maroon bags contain 3 mirrored violet bags, 3 muted gold bags, 3 drab brown bags, 4 plaid black bags.
pale chartreuse bags contain 5 dotted teal bags, 4 bright gold bags.
mirrored yellow bags contain 4 dim cyan bags.
shiny plum bags contain 3 dull green bags, 3 vibrant olive bags, 3 dim tan bags.
mirrored chartreuse bags contain 1 dark tan bag, 5 drab aqua bags.
dark gold bags contain 4 drab yellow bags, 4 pale bronze bags.
vibrant lime bags contain 3 dull salmon bags.
dim blue bags contain 2 dull cyan bags, 2 dull purple bags, 1 dark indigo bag.
dark brown bags contain 5 dull chartreuse bags.
light tomato bags contain 5 posh teal bags, 3 wavy yellow bags, 5 bright olive bags, 4 pale brown bags.
bright green bags contain 2 bright teal bags.
shiny silver bags contain 2 mirrored indigo bags, 4 faded silver bags, 2 dark lavender bags.
bright olive bags contain 5 drab turquoise bags.
striped teal bags contain 1 vibrant tan bag.
dotted yellow bags contain 1 clear tomato bag, 5 muted orange bags, 3 striped turquoise bags, 3 dim lime bags.
posh white bags contain no other bags.
plaid red bags contain 3 dotted teal bags, 2 light brown bags, 4 vibrant teal bags.
drab purple bags contain 5 pale purple bags, 1 shiny blue bag, 2 shiny orange bags.
vibrant maroon bags contain 3 shiny cyan bags, 5 striped lavender bags.
striped brown bags contain 5 faded salmon bags, 4 clear violet bags, 1 plaid salmon bag, 5 dotted tomato bags.
muted blue bags contain 1 drab chartreuse bag.
striped blue bags contain 4 dark cyan bags.
striped plum bags contain 2 wavy violet bags.
clear violet bags contain 2 dotted crimson bags, 3 plaid magenta bags.
clear teal bags contain 2 bright gold bags, 4 plaid black bags.
dim gold bags contain 5 pale gray bags, 3 drab orange bags, 3 plaid black bags.
wavy violet bags contain 3 dull beige bags.
wavy lime bags contain 2 bright lavender bags.
muted purple bags contain 3 wavy brown bags, 4 muted blue bags.
shiny indigo bags contain 1 shiny aqua bag, 4 bright aqua bags, 2 clear turquoise bags.
dim orange bags contain 5 striped lime bags.
clear bronze bags contain 4 pale black bags, 4 bright olive bags.
wavy gray bags contain 3 dotted teal bags, 2 striped lavender bags, 2 wavy aqua bags.
dull tan bags contain 5 vibrant violet bags, 2 muted maroon bags, 5 vibrant plum bags, 3 shiny red bags.
drab chartreuse bags contain 4 striped gray bags, 4 pale bronze bags, 5 dim aqua bags.
plaid gray bags contain 1 shiny blue bag, 4 clear brown bags, 4 shiny tan bags, 4 plaid beige bags.
drab plum bags contain 5 vibrant cyan bags, 3 vibrant aqua bags, 5 dim coral bags, 1 dull orange bag.
clear gold bags contain 1 drab olive bag, 5 drab orange bags, 4 shiny tan bags.
dull tomato bags contain 3 bright teal bags, 1 muted chartreuse bag.
bright silver bags contain 1 dull chartreuse bag, 5 bright gold bags, 4 faded silver bags.
clear black bags contain 5 dull orange bags, 3 dim black bags, 1 posh beige bag.
striped olive bags contain 2 pale maroon bags.
light fuchsia bags contain 5 pale silver bags, 4 dark olive bags, 1 clear magenta bag.
posh indigo bags contain 2 wavy purple bags, 3 striped beige bags, 4 vibrant white bags.
dark aqua bags contain 5 drab tomato bags, 4 faded red bags, 4 light magenta bags, 4 striped tomato bags.
plaid olive bags contain 2 posh brown bags.
wavy plum bags contain 3 shiny blue bags, 4 dark lavender bags, 5 pale violet bags.
vibrant teal bags contain 4 dull purple bags, 4 dull plum bags.
dotted gold bags contain 3 wavy maroon bags.
drab brown bags contain no other bags.
dull teal bags contain 5 wavy beige bags, 1 muted tomato bag, 1 drab aqua bag.
mirrored plum bags contain 4 muted chartreuse bags, 5 dull orange bags, 3 clear black bags.
wavy beige bags contain 4 pale violet bags, 5 dim tan bags, 3 pale fuchsia bags, 2 wavy tan bags.
plaid lime bags contain 3 pale crimson bags.
plaid brown bags contain 2 dull green bags.
light black bags contain 1 faded gold bag, 1 bright tan bag.
dim cyan bags contain 2 clear yellow bags, 3 plaid blue bags, 1 dull purple bag.
drab coral bags contain 1 bright gray bag, 1 muted magenta bag, 5 mirrored lime bags, 1 mirrored olive bag.
bright coral bags contain 3 plaid blue bags.
mirrored silver bags contain 5 clear white bags.
plaid tomato bags contain 5 dull red bags, 3 shiny green bags, 5 drab fuchsia bags, 3 dull tomato bags.
faded plum bags contain 5 dark violet bags, 3 dim brown bags.
light white bags contain 5 dotted teal bags, 2 dim tan bags.
dull bronze bags contain 3 vibrant turquoise bags.
vibrant coral bags contain 3 faded bronze bags.
posh silver bags contain 5 wavy olive bags, 3 dotted red bags, 3 faded violet bags.
dim yellow bags contain 4 pale tomato bags, 4 dim tan bags, 3 vibrant gold bags, 2 bright gold bags.
bright salmon bags contain 5 shiny orange bags, 2 dark yellow bags, 5 muted gold bags, 4 dark fuchsia bags.
light yellow bags contain 3 clear cyan bags.
dim red bags contain 3 clear lavender bags, 1 muted bronze bag, 4 vibrant salmon bags.
dark silver bags contain 1 dull brown bag, 1 wavy lavender bag, 2 shiny crimson bags, 1 clear tan bag.
dull fuchsia bags contain 5 striped cyan bags, 4 mirrored violet bags.
drab gold bags contain 5 posh lavender bags, 4 mirrored olive bags, 2 dark tan bags, 3 dotted olive bags.
muted gray bags contain 1 striped magenta bag, 2 dull tomato bags, 5 plaid olive bags, 1 faded gray bag.
bright bronze bags contain 1 clear silver bag, 4 dim lime bags.
dark cyan bags contain 5 dark maroon bags, 3 dull red bags, 1 bright gold bag.
dark plum bags contain 1 vibrant turquoise bag.
wavy maroon bags contain 5 shiny gold bags, 1 drab black bag.
light crimson bags contain 2 light plum bags, 3 plaid purple bags.
wavy chartreuse bags contain 2 pale gray bags, 5 dim purple bags, 2 drab turquoise bags.
plaid yellow bags contain 5 muted tan bags, 2 wavy cyan bags, 3 light gold bags, 1 dim gold bag.
mirrored violet bags contain no other bags.
wavy yellow bags contain 2 dim aqua bags, 1 dark fuchsia bag, 5 faded coral bags, 1 faded silver bag.
plaid bronze bags contain 1 striped bronze bag.
vibrant green bags contain 3 striped chartreuse bags, 3 pale lavender bags, 4 dotted lime bags, 4 plaid lavender bags.
muted crimson bags contain 3 dim blue bags, 1 dull lime bag, 3 plaid indigo bags, 1 pale plum bag.
posh cyan bags contain 5 drab brown bags, 5 faded blue bags.
vibrant black bags contain 3 pale silver bags.
light aqua bags contain 2 faded crimson bags, 3 dark bronze bags, 1 dim orange bag.
mirrored red bags contain 3 light violet bags.
dark lime bags contain 1 striped turquoise bag.
mirrored olive bags contain 1 faded bronze bag, 1 drab aqua bag, 1 dark indigo bag, 3 posh white bags.
striped chartreuse bags contain 2 mirrored gold bags.
dotted lime bags contain 1 vibrant turquoise bag, 2 dotted turquoise bags, 5 dull red bags.
vibrant bronze bags contain 1 posh green bag, 3 posh tan bags, 5 light salmon bags.
dark teal bags contain 4 shiny lavender bags, 5 dull orange bags.
shiny green bags contain 2 bright lavender bags, 3 shiny olive bags, 4 mirrored violet bags, 5 posh white bags.
light magenta bags contain 2 pale maroon bags.
pale magenta bags contain 5 dull aqua bags.
dull plum bags contain 2 vibrant violet bags, 5 pale red bags, 2 wavy fuchsia bags.
muted olive bags contain 5 bright teal bags.
vibrant fuchsia bags contain 3 posh brown bags.
dark olive bags contain 5 dim coral bags, 4 pale red bags, 5 drab aqua bags.
posh purple bags contain 2 bright red bags, 4 pale coral bags, 1 dotted bronze bag.
dark lavender bags contain 2 striped blue bags, 5 posh blue bags, 2 plaid green bags.

188
day7/src/main.zig Normal file
View File

@ -0,0 +1,188 @@
const std = @import("std");
pub fn main() anyerror!void {
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
defer arena.deinit();
var gpa = &arena.allocator;
var f = try std.fs.cwd().openFile("input", .{});
var contents = try f.readToEndAlloc(gpa, std.math.maxInt(u32));
var next_id : u32 = 0;
var map = std.hash_map.StringHashMap(u32).init(gpa);
var it = std.mem.tokenize(contents, "\n");
var bag_rules = std.ArrayList(*BagType).init(gpa);
defer bag_rules.deinit();
while (it.next()) |line| {
//std.log.debug("{}", .{line});
var bag = try gpa.create(BagType);
bag.*.contains = std.ArrayList(*BagRule).init(gpa);
var need_desc = true;
var desc = std.ArrayList(u8).init(gpa);
defer desc.deinit();
var need_count = true;
var count: u32 = 0;
for (line) |a| {
if (need_desc) {
try desc.append(a);
if (desc.items.len > 5) {
if (std.mem.eql(u8, " bag", desc.items[desc.items.len-4..])) {
//std.log.debug("'{}'", .{desc.items});
if (!need_count) {
var key = try std.mem.dupe(gpa, u8, std.mem.trim(u8, desc.items[0..desc.items.len-4], " "));
var bag_id : u32 = 0;
//std.log.debug("'{} {} bags'", .{count, key});
if (map.contains(key)) {
bag_id = map.get(key).?;
//std.log.debug("Bag '{}': {}", .{key, bag_id});
}
else {
bag_id = next_id;
//std.log.debug("Assigned ID {} to '{}'", .{bag_id, key});
try map.putNoClobber(key, next_id);
next_id += 1;
}
var br = try gpa.create(BagRule);
br.count = count;
br.bag_type = bag_id;
std.log.debug("Bag {} should contain {} of {}", .{bag.desc, br.count, br.bag_type});
try bag.contains.append(br);
}
else {
var key = try std.mem.dupe(gpa, u8, desc.items[0..desc.items.len-4]);
var bag_id : u32 = 0;
bag.desc = key;
//std.log.debug("'{}'", .{bag.desc});
if (map.contains(key)) {
bag_id = map.get(key).?;
//std.log.debug("Bag '{}': {}", .{key, bag_id});
}
else {
bag_id = next_id;
//std.log.debug("Assigned ID {} to '{}'", .{bag_id, key});
try map.putNoClobber(key, next_id);
next_id += 1;
}
bag.type_id = bag_id;
}
need_desc = false;
need_count = true;
desc.deinit();
desc = std.ArrayList(u8).init(gpa);
}
}
}
else if (need_count) {
if (std.ascii.isDigit(a)) {
count = @as(u32, a - 48);
need_count = false;
need_desc = true;
}
}
}
//std.log.debug("{}", .{bag});
try bag_rules.append(bag);
}
// for (bag_rules.items) |rule| {
// std.log.debug("{} ({})", .{rule.desc.?, rule.type_id});
// for(rule.contains.items) |r| {
// std.log.debug("\t{} of {}", .{r.count, r.bag_type});
// }
// }
var shiny_gold_id = map.get("shiny gold");
std.log.debug("shiny gold: {}", .{shiny_gold_id});
//var types_that_can_contain_shiny_gold = try types_that_can_contain(gpa, &bag_rules, shiny_gold_id.?);
//std.log.info("{} bag types can contain shiny gold bags ({})", .{types_that_can_contain_shiny_gold.len, shiny_gold_id});
var shiny_gold_type = get_type_by_id(&bag_rules, shiny_gold_id.?).?;
std.log.debug("shiny gold type has {} contain rules", .{shiny_gold_type.*.contains.items.len});
//std.log.debug("{}", .{shiny_gold_rule});
var n_bags_needed = bag_type_has_how_many_bags_needed(shiny_gold_type, &bag_rules);
std.log.info("{} needs {} bags purchased, including itself", .{shiny_gold_type.*.desc, n_bags_needed});
}
fn bag_type_has_how_many_bags_needed(self: *BagType, list: *std.ArrayList(*BagType)) u32 {
var count : u32 = 1;
if (self.contains.items.len == 0) {
// We just need our self
std.log.debug("{} just has itself", .{self.type_id});
return count;
}
std.log.debug("{}", .{self.contains.items.len});
for (self.contains.items) |i| {
if (i.*.count == 0) {
continue;
}
var bagtype = get_type_by_id(list, i.*.bag_type).?;
var extra = (i.*.count * bag_type_has_how_many_bags_needed(bagtype, list));
std.log.debug("{} needs {}x {} --> adding {} bags", .{self.*.desc, i.*.count, bagtype.*.desc, extra});
count += extra;
}
return count;
}
fn get_type_by_id(list: *std.ArrayList(*BagType), id: u32) ?*BagType {
for (list.items) |r| {
if (r.*.type_id == id) {
return r;
}
}
return null;
}
// fn types_that_can_contain(allocator: *std.mem.Allocator, list: *std.ArrayList(BagType), id: u32) anyerror![]u32 {
// var search_ids = std.ArrayList(u32).init(allocator);
// defer search_ids.deinit();
// for (list.items) |r| {
// if (r.can_contain(id)) {
// //std.log.debug("{} can contain {}", .{r.type_id, id});
// try search_ids.append(r.type_id);
// }
// }
// var count : usize = search_ids.items.len;
// //std.log.debug("{} bag types can directly contain a {}",
// // .{count, id});
// var types = std.ArrayList(u32).init(allocator);
// for (search_ids.items) |i| {
// var t = try types_that_can_contain(allocator, list, i);
// //std.log.debug("Adding {} to types that can hold {}", .{i, id});
// try types.append(i);
// for (t) |tid| {
// var already_in_types = false;
// for (types.items) |asdf| {
// if (asdf == tid) {
// already_in_types = true;
// break;
// }
// }
// if (!already_in_types) {
// //std.log.debug("Adding {} to types that can hold {}", .{tid, id});
// try types.append(tid);
// }
// }
// }
// return types.items[0..];
// }
const BagRule = struct {
bag_type: u32 = 0,
count: u32 = 0,
};
const BagType = struct {
type_id: u32 = 0,
desc: ?[]u8 = null,
contains: std.ArrayList(*BagRule),
pub fn can_contain(self: *const BagType, type_id: u32) bool {
for (self.contains.items) |rule| {
if (rule.*.bag_type == type_id and rule.*.count > 0) {
return true;
}
}
return false;
}
};

27
day8/build.zig Normal file
View File

@ -0,0 +1,27 @@
const Builder = @import("std").build.Builder;
pub fn build(b: *Builder) void {
// Standard target options allows the person running `zig build` to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
// for restricting supported target set are available.
const target = b.standardTargetOptions(.{});
// Standard release options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
const mode = b.standardReleaseOptions();
const exe = b.addExecutable("day8", "src/main.zig");
exe.setTarget(target);
exe.setBuildMode(mode);
exe.install();
const run_cmd = exe.run();
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
}

5
day8/src/main.zig Normal file
View File

@ -0,0 +1,5 @@
const std = @import("std");
pub fn main() anyerror!void {
std.log.info("All your codebase are belong to us.", .{});
}