-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday19.zig
102 lines (84 loc) · 2.68 KB
/
day19.zig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
const std = @import("std");
const Globals = struct {
alloc: std.mem.Allocator,
input: []const u8,
patterns: std.ArrayListUnmanaged([]const u8),
designs: std.ArrayListUnmanaged([]const u8),
const Self = @This();
pub fn init(alloc: std.mem.Allocator, input: []const u8) !Self {
var lines = std.mem.splitScalar(u8, input, '\n');
var patterns = std.ArrayListUnmanaged([]const u8).empty;
errdefer patterns.deinit(alloc);
const pat_line = lines.next() orelse return error.MissingPatternsLine;
var pat_strs = std.mem.tokenizeSequence(u8, pat_line, ", ");
while (pat_strs.next()) |pat_str| try patterns.append(alloc, pat_str);
var designs = std.ArrayListUnmanaged([]const u8).empty;
errdefer designs.deinit(alloc);
while (lines.next()) |line| {
if (line.len > 0) {
try designs.append(alloc, line);
}
}
return .{
.alloc = alloc,
.input = input,
.patterns = patterns,
.designs = designs,
};
}
pub fn deinit(self: *Self) void {
self.patterns.deinit(self.alloc);
self.designs.deinit(self.alloc);
}
};
fn check(patterns: [][]const u8, design: []const u8) bool {
if (design.len == 0) return true;
for (patterns) |pattern| {
if (std.mem.startsWith(u8, design, pattern)) {
if (check(patterns, design[pattern.len..])) {
return true;
}
}
}
return false;
}
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}).init;
defer if (gpa.deinit() != .ok) @panic("GPA LEAK");
const alloc = gpa.allocator();
const input = @embedFile("input19.txt");
var g = try Globals.init(alloc, input);
defer g.deinit();
var possible: usize = 0;
for (g.designs.items) |design| {
possible += @intFromBool(check(g.patterns.items, design));
}
std.debug.print("{d}\n", .{possible});
}
test "decls" {
std.testing.refAllDecls(@This());
}
test "example" {
const alloc = std.testing.allocator;
const input =
\\r, wr, b, g, bwu, rb, gb, br
\\
\\brwrr
\\bggr
\\gbbr
\\rrbgbr
\\ubwu
\\bwurrg
\\brgr
\\bbrgwb
\\
;
var g = try Globals.init(alloc, input);
defer g.deinit();
try std.testing.expectEqual(8, g.patterns.items.len);
try std.testing.expectEqual(8, g.designs.items.len);
const expected = [_]bool{ true, true, true, true, false, true, true, false };
for (g.designs.items, expected) |d, e| {
try std.testing.expectEqual(e, check(g.patterns.items, d));
}
}