From e901b76845f1788f549ad7844742388341d54ae5 Mon Sep 17 00:00:00 2001 From: Dendy Date: Tue, 6 Dec 2022 16:41:25 +0100 Subject: [PATCH] Day 5 --- 5/1-2.zig | 114 ++++++++++++ 5/input.asc | 512 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 626 insertions(+) create mode 100644 5/1-2.zig create mode 100644 5/input.asc diff --git a/5/1-2.zig b/5/1-2.zig new file mode 100644 index 0000000..0f5e8a3 --- /dev/null +++ b/5/1-2.zig @@ -0,0 +1,114 @@ +const std = @import("std"); + +const moveFnType = *const fn ([]Vector(u8), usize, usize, usize) void; + +pub fn range(len: usize) []const void { + return @as([*]void, undefined)[0..len]; +} + +const lineIter = std.mem.SplitIterator(u8); +const Vector = std.ArrayList; + +// I don't have much time for this, it ain't gonna +// be as pretty as the other ones + +pub fn main() void { + var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer arena.deinit(); + const allocator = arena.allocator(); + + const input = @embedFile("input.asc"); + + std.debug.print("Part 1: {s}\n", .{crane900X(input,moveAppend, allocator)}); + std.debug.print("Part 2: {s}\n", .{crane900X(input,moveAppendSlice, allocator)}); +} + +fn crane900X(input: []const u8, moveFn: moveFnType, allocator: std.mem.Allocator) []const u8 { + + var iter = std.mem.split(u8, input, "\n"); + + // Parses the header with the states and advances the counter + const containers = parseContainers(&iter, allocator); + + while (iter.next()) |line| { + // Not valid + if (line.len <= 0) continue; + + const nums = parseLine(line); + moveFn(containers, nums[0], nums[1] - 1, nums[2] - 1); + } + + var res = allocator.alloc(u8, containers.len) catch @panic("Allocation error"); + for (containers) |cont, i| { + res[i] = cont.items[cont.items.len - 1]; + } + return res; +} + +fn isNumber(char: u8) bool { + return char >= '0' and char <= '9'; +} + +fn isLetter(char: u8) bool { + return char >= 'A' and char <= 'Z'; +} + +fn moveAppend(list: []Vector(u8), amount: usize, from: usize, to: usize) void { + var i: usize = 0; + while (i < amount) : (i += 1) { + list[to].append(list[from].pop()) catch @panic("Allocation error"); + } +} + +fn moveAppendSlice(list: []Vector(u8), amount: usize, from: usize, to: usize) void { + var fromLen = list[from].items.len; + list[to].appendSlice(list[from].items[(fromLen - amount)..]) catch @panic("Allocation error"); + var i: usize = 0; + while (i < amount) : (i += 1) { + _ = list[from].pop(); + } +} + +fn parseLine(line: []const u8) [3]u8 { + var nums = [3]u8{ 0, 0, 0 }; + + var iter = std.mem.split(u8, line, " "); + + var i: usize = 0; + while (iter.next()) |word| { + nums[i] = (std.fmt.parseInt(u8, word, 10) catch continue); + i += 1; + } + + return nums; +} + +fn parseContainers(iter: *std.mem.SplitIterator(u8), allocator: std.mem.Allocator) []Vector(u8) { + const len = (iter.first().len + 1) / 4; + iter.reset(); + var containers = Vector(Vector(u8)).init(allocator); + var contIdx: usize = 0; + while (contIdx < len) : (contIdx += 1) { + containers.append(Vector(u8).init(allocator)) catch @panic("Allocation error"); + } + + while (iter.next()) |line| { + if (line.len <= 0) continue; + // We reached the end + if (isNumber(line[1])) { + // Consume the next line + _ = iter.next(); + break; + } + + var i: usize = 0; + while (i < len) : (i += 1) { + const char = line[i * 4 + 1]; + + if (!isLetter(char)) continue; + containers.items[i].insert(0, char) catch @panic("Allocation error"); + } + } + + return containers.items; +} diff --git a/5/input.asc b/5/input.asc new file mode 100644 index 0000000..ab116f0 --- /dev/null +++ b/5/input.asc @@ -0,0 +1,512 @@ +[V] [B] [C] +[C] [N] [G] [W] [P] +[W] [C] [Q] [S] [C] [M] +[L] [W] [B] [Z] [F] [S] [V] +[R] [G] [H] [F] [P] [V] [M] [T] +[M] [L] [R] [D] [L] [N] [P] [D] [W] +[F] [Q] [S] [C] [G] [G] [Z] [P] [N] +[Q] [D] [P] [L] [V] [D] [D] [C] [Z] + 1 2 3 4 5 6 7 8 9 + +move 1 from 9 to 2 +move 4 from 6 to 1 +move 4 from 2 to 6 +move 5 from 8 to 7 +move 4 from 9 to 2 +move 1 from 5 to 8 +move 1 from 3 to 1 +move 2 from 3 to 1 +move 1 from 4 to 2 +move 11 from 7 to 2 +move 5 from 5 to 1 +move 1 from 6 to 8 +move 1 from 7 to 6 +move 3 from 6 to 7 +move 1 from 3 to 2 +move 1 from 6 to 8 +move 11 from 2 to 1 +move 1 from 9 to 8 +move 1 from 3 to 7 +move 4 from 7 to 9 +move 3 from 3 to 7 +move 4 from 8 to 2 +move 3 from 7 to 6 +move 2 from 6 to 3 +move 5 from 4 to 1 +move 1 from 6 to 5 +move 26 from 1 to 7 +move 1 from 4 to 6 +move 22 from 7 to 5 +move 4 from 9 to 1 +move 3 from 7 to 3 +move 1 from 6 to 3 +move 6 from 1 to 7 +move 2 from 7 to 5 +move 8 from 1 to 9 +move 4 from 3 to 4 +move 10 from 2 to 7 +move 6 from 7 to 4 +move 2 from 9 to 5 +move 1 from 5 to 1 +move 8 from 4 to 1 +move 2 from 5 to 9 +move 1 from 3 to 6 +move 1 from 9 to 1 +move 1 from 3 to 6 +move 2 from 5 to 2 +move 1 from 4 to 2 +move 1 from 2 to 3 +move 7 from 1 to 4 +move 9 from 7 to 4 +move 1 from 3 to 4 +move 2 from 2 to 4 +move 5 from 9 to 6 +move 1 from 4 to 5 +move 2 from 9 to 3 +move 1 from 1 to 6 +move 2 from 6 to 1 +move 2 from 6 to 5 +move 2 from 9 to 7 +move 1 from 3 to 9 +move 1 from 9 to 5 +move 2 from 7 to 3 +move 1 from 1 to 7 +move 7 from 4 to 5 +move 2 from 1 to 2 +move 3 from 3 to 8 +move 3 from 8 to 9 +move 31 from 5 to 8 +move 1 from 7 to 1 +move 1 from 2 to 1 +move 1 from 1 to 5 +move 1 from 5 to 6 +move 2 from 5 to 7 +move 10 from 4 to 9 +move 5 from 6 to 2 +move 3 from 2 to 6 +move 2 from 7 to 8 +move 1 from 6 to 3 +move 1 from 4 to 1 +move 1 from 3 to 6 +move 1 from 4 to 2 +move 2 from 1 to 2 +move 1 from 8 to 7 +move 10 from 8 to 2 +move 13 from 2 to 9 +move 1 from 1 to 5 +move 18 from 8 to 2 +move 21 from 9 to 6 +move 1 from 7 to 8 +move 2 from 9 to 7 +move 1 from 2 to 3 +move 1 from 7 to 8 +move 9 from 2 to 4 +move 1 from 7 to 8 +move 3 from 9 to 1 +move 1 from 8 to 1 +move 6 from 2 to 3 +move 5 from 4 to 7 +move 1 from 5 to 8 +move 2 from 4 to 3 +move 5 from 7 to 3 +move 2 from 2 to 7 +move 15 from 6 to 1 +move 12 from 1 to 2 +move 6 from 2 to 9 +move 4 from 9 to 5 +move 4 from 5 to 6 +move 14 from 3 to 9 +move 1 from 6 to 7 +move 1 from 7 to 2 +move 1 from 7 to 8 +move 9 from 2 to 6 +move 1 from 1 to 6 +move 2 from 9 to 8 +move 4 from 9 to 7 +move 1 from 1 to 5 +move 8 from 8 to 3 +move 1 from 5 to 4 +move 2 from 1 to 2 +move 3 from 1 to 4 +move 9 from 6 to 2 +move 1 from 7 to 4 +move 1 from 8 to 2 +move 1 from 6 to 4 +move 4 from 7 to 8 +move 12 from 6 to 8 +move 3 from 2 to 1 +move 6 from 8 to 7 +move 5 from 3 to 6 +move 3 from 3 to 6 +move 3 from 1 to 3 +move 8 from 2 to 9 +move 2 from 4 to 5 +move 2 from 7 to 2 +move 10 from 8 to 5 +move 3 from 3 to 2 +move 10 from 5 to 3 +move 1 from 4 to 3 +move 1 from 2 to 1 +move 1 from 1 to 7 +move 14 from 9 to 6 +move 5 from 2 to 4 +move 15 from 6 to 5 +move 3 from 9 to 3 +move 1 from 8 to 6 +move 1 from 3 to 8 +move 7 from 3 to 8 +move 16 from 5 to 1 +move 2 from 7 to 1 +move 1 from 5 to 9 +move 2 from 9 to 3 +move 15 from 1 to 5 +move 3 from 8 to 2 +move 3 from 3 to 1 +move 3 from 7 to 3 +move 8 from 4 to 6 +move 5 from 1 to 6 +move 9 from 5 to 7 +move 2 from 8 to 3 +move 2 from 2 to 7 +move 1 from 1 to 4 +move 2 from 5 to 8 +move 4 from 3 to 1 +move 4 from 8 to 1 +move 1 from 8 to 6 +move 9 from 7 to 6 +move 2 from 7 to 5 +move 3 from 1 to 8 +move 1 from 4 to 8 +move 1 from 2 to 4 +move 12 from 6 to 2 +move 3 from 8 to 6 +move 1 from 4 to 7 +move 2 from 6 to 8 +move 5 from 5 to 9 +move 13 from 2 to 9 +move 2 from 4 to 7 +move 13 from 9 to 5 +move 2 from 6 to 5 +move 1 from 3 to 9 +move 6 from 9 to 4 +move 5 from 1 to 3 +move 1 from 7 to 9 +move 15 from 5 to 8 +move 2 from 4 to 7 +move 2 from 4 to 6 +move 1 from 4 to 6 +move 1 from 5 to 7 +move 18 from 6 to 2 +move 2 from 7 to 3 +move 3 from 6 to 7 +move 3 from 2 to 8 +move 5 from 7 to 3 +move 1 from 9 to 6 +move 2 from 3 to 8 +move 11 from 3 to 2 +move 2 from 2 to 9 +move 1 from 6 to 2 +move 1 from 7 to 5 +move 1 from 5 to 9 +move 9 from 8 to 4 +move 1 from 4 to 6 +move 2 from 3 to 1 +move 2 from 1 to 5 +move 12 from 8 to 3 +move 1 from 8 to 2 +move 14 from 3 to 4 +move 1 from 6 to 4 +move 1 from 5 to 4 +move 20 from 2 to 7 +move 2 from 9 to 5 +move 1 from 5 to 3 +move 1 from 9 to 2 +move 1 from 2 to 8 +move 2 from 2 to 3 +move 5 from 4 to 5 +move 6 from 5 to 7 +move 2 from 8 to 2 +move 3 from 3 to 9 +move 5 from 4 to 5 +move 2 from 9 to 7 +move 2 from 2 to 3 +move 1 from 9 to 3 +move 22 from 7 to 3 +move 4 from 7 to 4 +move 24 from 3 to 6 +move 4 from 2 to 6 +move 18 from 6 to 9 +move 15 from 4 to 6 +move 8 from 6 to 3 +move 6 from 6 to 1 +move 7 from 9 to 6 +move 2 from 7 to 4 +move 8 from 3 to 9 +move 14 from 6 to 3 +move 2 from 3 to 9 +move 1 from 9 to 6 +move 13 from 9 to 1 +move 3 from 4 to 5 +move 1 from 9 to 6 +move 5 from 1 to 8 +move 3 from 3 to 9 +move 2 from 1 to 5 +move 8 from 5 to 8 +move 10 from 3 to 5 +move 3 from 4 to 6 +move 6 from 1 to 9 +move 4 from 5 to 3 +move 5 from 8 to 2 +move 6 from 6 to 3 +move 7 from 3 to 6 +move 1 from 3 to 4 +move 5 from 8 to 7 +move 5 from 2 to 6 +move 2 from 7 to 3 +move 3 from 7 to 3 +move 1 from 4 to 9 +move 9 from 6 to 9 +move 2 from 6 to 2 +move 1 from 8 to 2 +move 2 from 8 to 7 +move 5 from 1 to 5 +move 1 from 1 to 4 +move 13 from 5 to 7 +move 5 from 3 to 7 +move 1 from 5 to 6 +move 1 from 4 to 6 +move 3 from 2 to 8 +move 1 from 3 to 5 +move 1 from 3 to 8 +move 14 from 7 to 4 +move 1 from 5 to 6 +move 7 from 6 to 9 +move 6 from 7 to 9 +move 2 from 8 to 9 +move 2 from 8 to 1 +move 31 from 9 to 1 +move 13 from 4 to 2 +move 1 from 4 to 3 +move 10 from 2 to 7 +move 1 from 3 to 4 +move 1 from 2 to 7 +move 3 from 7 to 8 +move 1 from 4 to 1 +move 3 from 8 to 5 +move 32 from 1 to 5 +move 3 from 9 to 7 +move 4 from 9 to 6 +move 2 from 2 to 7 +move 2 from 1 to 7 +move 1 from 6 to 1 +move 1 from 9 to 4 +move 3 from 6 to 4 +move 1 from 1 to 8 +move 15 from 5 to 1 +move 1 from 8 to 4 +move 9 from 5 to 7 +move 1 from 9 to 8 +move 1 from 8 to 1 +move 10 from 1 to 9 +move 1 from 4 to 2 +move 2 from 9 to 5 +move 4 from 9 to 6 +move 1 from 2 to 7 +move 3 from 4 to 2 +move 1 from 1 to 5 +move 5 from 1 to 5 +move 1 from 4 to 9 +move 3 from 6 to 7 +move 23 from 7 to 6 +move 1 from 2 to 4 +move 1 from 2 to 5 +move 9 from 5 to 4 +move 1 from 2 to 5 +move 9 from 5 to 6 +move 1 from 9 to 7 +move 1 from 9 to 3 +move 3 from 9 to 4 +move 14 from 6 to 3 +move 5 from 7 to 4 +move 1 from 7 to 5 +move 1 from 5 to 9 +move 2 from 5 to 6 +move 16 from 6 to 2 +move 2 from 6 to 1 +move 7 from 4 to 8 +move 2 from 1 to 2 +move 4 from 3 to 5 +move 5 from 4 to 7 +move 2 from 6 to 7 +move 4 from 4 to 1 +move 4 from 8 to 9 +move 1 from 4 to 5 +move 1 from 6 to 8 +move 1 from 4 to 9 +move 4 from 1 to 7 +move 1 from 9 to 4 +move 2 from 2 to 7 +move 7 from 3 to 9 +move 15 from 2 to 3 +move 4 from 8 to 6 +move 1 from 4 to 7 +move 2 from 9 to 7 +move 1 from 6 to 8 +move 2 from 7 to 2 +move 5 from 7 to 2 +move 1 from 5 to 2 +move 6 from 2 to 9 +move 3 from 7 to 1 +move 3 from 1 to 2 +move 3 from 7 to 1 +move 2 from 2 to 9 +move 2 from 6 to 9 +move 1 from 8 to 3 +move 19 from 3 to 9 +move 1 from 6 to 3 +move 3 from 7 to 4 +move 1 from 2 to 5 +move 2 from 1 to 9 +move 2 from 2 to 3 +move 33 from 9 to 7 +move 1 from 1 to 7 +move 3 from 3 to 7 +move 1 from 3 to 2 +move 1 from 5 to 8 +move 4 from 9 to 7 +move 1 from 5 to 2 +move 2 from 4 to 9 +move 4 from 9 to 7 +move 3 from 2 to 1 +move 1 from 4 to 3 +move 1 from 9 to 7 +move 1 from 8 to 3 +move 7 from 7 to 3 +move 3 from 1 to 9 +move 4 from 9 to 7 +move 4 from 5 to 8 +move 3 from 3 to 4 +move 3 from 4 to 5 +move 3 from 3 to 6 +move 2 from 6 to 5 +move 38 from 7 to 5 +move 40 from 5 to 3 +move 4 from 8 to 9 +move 1 from 6 to 9 +move 1 from 5 to 1 +move 3 from 7 to 6 +move 1 from 7 to 5 +move 38 from 3 to 8 +move 1 from 1 to 9 +move 3 from 9 to 6 +move 5 from 3 to 9 +move 4 from 8 to 6 +move 1 from 7 to 1 +move 3 from 5 to 9 +move 1 from 1 to 2 +move 10 from 8 to 3 +move 5 from 8 to 1 +move 3 from 1 to 2 +move 9 from 6 to 7 +move 9 from 3 to 5 +move 1 from 7 to 6 +move 1 from 3 to 8 +move 1 from 7 to 9 +move 1 from 1 to 5 +move 1 from 1 to 3 +move 1 from 9 to 2 +move 4 from 2 to 3 +move 1 from 2 to 4 +move 9 from 8 to 1 +move 2 from 9 to 5 +move 2 from 1 to 2 +move 2 from 3 to 4 +move 6 from 8 to 6 +move 10 from 5 to 3 +move 7 from 3 to 2 +move 2 from 1 to 2 +move 5 from 1 to 7 +move 7 from 9 to 6 +move 7 from 6 to 5 +move 1 from 4 to 3 +move 7 from 7 to 4 +move 5 from 3 to 9 +move 7 from 2 to 6 +move 4 from 7 to 8 +move 5 from 8 to 9 +move 1 from 2 to 6 +move 1 from 3 to 5 +move 2 from 2 to 8 +move 8 from 4 to 6 +move 7 from 9 to 7 +move 4 from 7 to 9 +move 7 from 9 to 3 +move 8 from 3 to 1 +move 6 from 5 to 9 +move 8 from 1 to 8 +move 13 from 8 to 4 +move 3 from 9 to 6 +move 1 from 8 to 6 +move 1 from 7 to 3 +move 2 from 4 to 1 +move 5 from 9 to 1 +move 1 from 3 to 7 +move 15 from 6 to 1 +move 1 from 7 to 9 +move 10 from 4 to 7 +move 11 from 7 to 5 +move 17 from 1 to 6 +move 1 from 9 to 3 +move 6 from 6 to 1 +move 3 from 5 to 3 +move 2 from 4 to 5 +move 2 from 7 to 8 +move 12 from 5 to 3 +move 13 from 6 to 9 +move 2 from 8 to 2 +move 2 from 5 to 1 +move 16 from 3 to 8 +move 3 from 2 to 3 +move 2 from 3 to 7 +move 2 from 7 to 9 +move 1 from 3 to 7 +move 4 from 8 to 4 +move 2 from 4 to 8 +move 5 from 1 to 5 +move 2 from 4 to 7 +move 6 from 6 to 8 +move 2 from 8 to 5 +move 2 from 1 to 4 +move 5 from 8 to 7 +move 5 from 6 to 3 +move 6 from 9 to 8 +move 2 from 9 to 2 +move 1 from 1 to 7 +move 4 from 5 to 3 +move 2 from 2 to 3 +move 1 from 4 to 9 +move 10 from 3 to 6 +move 1 from 3 to 7 +move 10 from 7 to 2 +move 2 from 5 to 3 +move 1 from 4 to 2 +move 2 from 6 to 8 +move 3 from 6 to 5 +move 1 from 6 to 1 +move 7 from 2 to 3 +move 6 from 8 to 7 +move 4 from 6 to 3 +move 14 from 8 to 6 +move 11 from 6 to 8 +move 1 from 1 to 4 +move 6 from 7 to 2 +move 3 from 5 to 8 +move 4 from 1 to 7 +move 1 from 2 to 8 +move 1 from 2 to 6 +move 1 from 3 to 4 +move 1 from 5 to 6 +move 7 from 8 to 6 +move 9 from 3 to 2 +move 1 from 8 to 5 +