Solve day 10
This commit is contained in:
parent
2f485e9dbc
commit
701aee2b89
93
src/day10.zig
Normal file
93
src/day10.zig
Normal file
@ -0,0 +1,93 @@
|
||||
const std = @import("std");
|
||||
|
||||
pub const input = @embedFile("input/day10.txt");
|
||||
const test_input1 = @embedFile("input/day10_test1.txt");
|
||||
const test_input2 = @embedFile("input/day10_test2.txt");
|
||||
|
||||
var gpa = std.heap.GeneralPurposeAllocator(.{ .safety = true }){};
|
||||
const allocator = gpa.allocator();
|
||||
|
||||
fn signal_strength(cycle: usize, x: isize) isize {
|
||||
if (cycle == 20 or cycle == 60 or cycle == 100 or cycle == 140 or cycle == 180 or cycle == 220) {
|
||||
return @intCast(isize, cycle) * x;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn solve_part1(data: []const u8) !isize {
|
||||
var lines = std.mem.tokenize(u8, data, "\n");
|
||||
var x: isize = 1;
|
||||
var cycle: usize = 0;
|
||||
var sum: isize = 0;
|
||||
while (lines.next()) |line| {
|
||||
if (std.mem.eql(u8, line, "noop")) {
|
||||
cycle += 1;
|
||||
sum += signal_strength(cycle, x);
|
||||
} else {
|
||||
var delta = try std.fmt.parseInt(isize, line[5..], 10);
|
||||
cycle += 1;
|
||||
sum += signal_strength(cycle, x);
|
||||
cycle += 1;
|
||||
sum += signal_strength(cycle, x);
|
||||
x += delta;
|
||||
}
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
fn emit_ray(cycle: usize, x: isize, crt: *[6][40]bool) void {
|
||||
if (x >= @mod(@intCast(isize, cycle), 40) - 1 and x <= (cycle % 40) + 1) {
|
||||
crt[cycle / 40][cycle % 40] = true;
|
||||
}
|
||||
}
|
||||
|
||||
fn print_screen(crt: [6][40]bool) [246]u8 {
|
||||
var screen = [_]u8{'.'} ** (6 * 41);
|
||||
var row: usize = 0;
|
||||
while (row < 6) : (row += 1) {
|
||||
var col: usize = 0;
|
||||
while (col < 40) : (col += 1) {
|
||||
screen[(row * 41) + col] = if (crt[row][col]) '#' else '.';
|
||||
}
|
||||
screen[(row * 41) + col] = '\n';
|
||||
}
|
||||
return screen;
|
||||
}
|
||||
|
||||
pub fn solve_part2(data: []const u8) ![246]u8 {
|
||||
var lines = std.mem.tokenize(u8, data, "\n");
|
||||
var x: isize = 1;
|
||||
var cycle: usize = 0;
|
||||
var crt = [_][40]bool{[_]bool{false} ** 40} ** 6;
|
||||
while (lines.next()) |line| {
|
||||
emit_ray(cycle, x, &crt);
|
||||
if (std.mem.eql(u8, line, "noop")) {
|
||||
cycle += 1;
|
||||
} else {
|
||||
var delta = try std.fmt.parseInt(isize, line[5..], 10);
|
||||
cycle += 1;
|
||||
emit_ray(cycle, x, &crt);
|
||||
cycle += 1;
|
||||
x += delta;
|
||||
emit_ray(cycle, x, &crt);
|
||||
}
|
||||
}
|
||||
return print_screen(crt);
|
||||
}
|
||||
|
||||
test "solves part1" {
|
||||
try std.testing.expectEqual(solve_part1(test_input2), 13140);
|
||||
}
|
||||
|
||||
test "solves part2" {
|
||||
try std.testing.expectEqualStrings(&try solve_part2(test_input2),
|
||||
\\##..##..##..##..##..##..##..##..##..##..
|
||||
\\###...###...###...###...###...###...###.
|
||||
\\####....####....####....####....####....
|
||||
\\#####.....#####.....#####.....#####.....
|
||||
\\######......######......######......####
|
||||
\\#######.......#######.......#######.....
|
||||
\\
|
||||
);
|
||||
}
|
145
src/input/day10.txt
Executable file
145
src/input/day10.txt
Executable file
@ -0,0 +1,145 @@
|
||||
addx 1
|
||||
noop
|
||||
noop
|
||||
addx 4
|
||||
addx 5
|
||||
addx -2
|
||||
addx 19
|
||||
addx -12
|
||||
addx 3
|
||||
addx -2
|
||||
addx 4
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 3
|
||||
addx -8
|
||||
addx 15
|
||||
addx 1
|
||||
noop
|
||||
noop
|
||||
addx 6
|
||||
addx -1
|
||||
noop
|
||||
addx -38
|
||||
noop
|
||||
addx 10
|
||||
addx -5
|
||||
noop
|
||||
addx 3
|
||||
addx 2
|
||||
addx 7
|
||||
noop
|
||||
noop
|
||||
addx 3
|
||||
noop
|
||||
addx 2
|
||||
addx 3
|
||||
addx -2
|
||||
addx 2
|
||||
addx 7
|
||||
noop
|
||||
noop
|
||||
addx 9
|
||||
noop
|
||||
addx -12
|
||||
noop
|
||||
addx 11
|
||||
addx -38
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 5
|
||||
addx 5
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 3
|
||||
addx -12
|
||||
addx 14
|
||||
noop
|
||||
addx 1
|
||||
addx 3
|
||||
addx 1
|
||||
addx 5
|
||||
addx 4
|
||||
addx 1
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx -9
|
||||
addx 17
|
||||
addx -39
|
||||
addx 38
|
||||
addx -8
|
||||
addx -26
|
||||
addx 3
|
||||
addx 4
|
||||
addx 16
|
||||
noop
|
||||
addx -11
|
||||
addx 3
|
||||
noop
|
||||
addx 2
|
||||
addx 3
|
||||
addx -2
|
||||
addx 2
|
||||
noop
|
||||
addx 13
|
||||
addx -8
|
||||
noop
|
||||
addx 7
|
||||
addx -5
|
||||
addx 8
|
||||
addx -40
|
||||
addx 16
|
||||
addx -9
|
||||
noop
|
||||
addx -7
|
||||
addx 8
|
||||
addx 2
|
||||
addx 7
|
||||
noop
|
||||
noop
|
||||
addx -15
|
||||
addx 16
|
||||
addx 2
|
||||
addx 5
|
||||
addx 2
|
||||
addx -20
|
||||
addx 12
|
||||
addx 11
|
||||
addx 8
|
||||
addx -1
|
||||
addx 3
|
||||
noop
|
||||
addx -39
|
||||
addx 2
|
||||
noop
|
||||
addx 5
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 4
|
||||
addx 1
|
||||
noop
|
||||
noop
|
||||
addx 2
|
||||
addx 5
|
||||
addx 2
|
||||
addx 1
|
||||
addx 4
|
||||
addx -1
|
||||
addx 2
|
||||
noop
|
||||
addx 2
|
||||
noop
|
||||
addx 8
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx -10
|
||||
noop
|
||||
noop
|
3
src/input/day10_test1.txt
Normal file
3
src/input/day10_test1.txt
Normal file
@ -0,0 +1,3 @@
|
||||
noop
|
||||
addx 3
|
||||
addx -5
|
146
src/input/day10_test2.txt
Normal file
146
src/input/day10_test2.txt
Normal file
@ -0,0 +1,146 @@
|
||||
addx 15
|
||||
addx -11
|
||||
addx 6
|
||||
addx -3
|
||||
addx 5
|
||||
addx -1
|
||||
addx -8
|
||||
addx 13
|
||||
addx 4
|
||||
noop
|
||||
addx -1
|
||||
addx 5
|
||||
addx -1
|
||||
addx 5
|
||||
addx -1
|
||||
addx 5
|
||||
addx -1
|
||||
addx 5
|
||||
addx -1
|
||||
addx -35
|
||||
addx 1
|
||||
addx 24
|
||||
addx -19
|
||||
addx 1
|
||||
addx 16
|
||||
addx -11
|
||||
noop
|
||||
noop
|
||||
addx 21
|
||||
addx -15
|
||||
noop
|
||||
noop
|
||||
addx -3
|
||||
addx 9
|
||||
addx 1
|
||||
addx -3
|
||||
addx 8
|
||||
addx 1
|
||||
addx 5
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx -36
|
||||
noop
|
||||
addx 1
|
||||
addx 7
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 2
|
||||
addx 6
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 1
|
||||
noop
|
||||
noop
|
||||
addx 7
|
||||
addx 1
|
||||
noop
|
||||
addx -13
|
||||
addx 13
|
||||
addx 7
|
||||
noop
|
||||
addx 1
|
||||
addx -33
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 2
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx 8
|
||||
noop
|
||||
addx -1
|
||||
addx 2
|
||||
addx 1
|
||||
noop
|
||||
addx 17
|
||||
addx -9
|
||||
addx 1
|
||||
addx 1
|
||||
addx -3
|
||||
addx 11
|
||||
noop
|
||||
noop
|
||||
addx 1
|
||||
noop
|
||||
addx 1
|
||||
noop
|
||||
noop
|
||||
addx -13
|
||||
addx -19
|
||||
addx 1
|
||||
addx 3
|
||||
addx 26
|
||||
addx -30
|
||||
addx 12
|
||||
addx -1
|
||||
addx 3
|
||||
addx 1
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx -9
|
||||
addx 18
|
||||
addx 1
|
||||
addx 2
|
||||
noop
|
||||
noop
|
||||
addx 9
|
||||
noop
|
||||
noop
|
||||
noop
|
||||
addx -1
|
||||
addx 2
|
||||
addx -37
|
||||
addx 1
|
||||
addx 3
|
||||
noop
|
||||
addx 15
|
||||
addx -21
|
||||
addx 22
|
||||
addx -6
|
||||
addx 1
|
||||
noop
|
||||
addx 2
|
||||
addx 1
|
||||
noop
|
||||
addx -10
|
||||
noop
|
||||
noop
|
||||
addx 20
|
||||
addx 1
|
||||
addx 2
|
||||
addx 2
|
||||
addx -6
|
||||
addx -11
|
||||
noop
|
||||
noop
|
||||
noop
|
15
src/main.zig
15
src/main.zig
@ -9,6 +9,7 @@ const day06 = @import("day06.zig");
|
||||
const day07 = @import("day07.zig");
|
||||
const day08 = @import("day08.zig");
|
||||
const day09 = @import("day09.zig");
|
||||
const day10 = @import("day10.zig");
|
||||
const utils = @import("utils.zig");
|
||||
|
||||
fn solve_day(comptime day_num: u8, day: anytype, stdout: anytype, timer: *std.time.Timer) !void {
|
||||
@ -18,20 +19,20 @@ fn solve_day(comptime day_num: u8, day: anytype, stdout: anytype, timer: *std.ti
|
||||
var part1 = try day.solve_part1(day.input);
|
||||
const part1_end = timer.read();
|
||||
const part1_time = utils.HumanTime.new(part1_end - part1_start);
|
||||
if (@TypeOf(part1) == []const u8) {
|
||||
try stdout.print("Part 1: {s} ({d:.2} {s})\n", .{ part1, part1_time.value, part1_time.unit.abbr() });
|
||||
} else {
|
||||
if (@TypeOf(part1) == usize or @TypeOf(part1) == isize) {
|
||||
try stdout.print("Part 1: {} ({d:.2} {s})\n", .{ part1, part1_time.value, part1_time.unit.abbr() });
|
||||
} else {
|
||||
try stdout.print("Part 1: \n{s} ({d:.2} {s})\n", .{ part1, part1_time.value, part1_time.unit.abbr() });
|
||||
}
|
||||
|
||||
const part2_start = timer.read();
|
||||
var part2 = try day.solve_part2(day.input);
|
||||
const part2_end = timer.read();
|
||||
const part2_time = utils.HumanTime.new(part2_end - part2_start);
|
||||
if (@TypeOf(part2) == []const u8) {
|
||||
try stdout.print("Part 2: {s} ({d:.2} {s})\n", .{ part2, part2_time.value, part2_time.unit.abbr() });
|
||||
} else {
|
||||
if (@TypeOf(part2) == usize or @TypeOf(part2) == isize) {
|
||||
try stdout.print("Part 2: {} ({d:.2} {s})\n", .{ part2, part2_time.value, part2_time.unit.abbr() });
|
||||
} else {
|
||||
try stdout.print("Part 2: \n{s} ({d:.2} {s})\n", .{ part2, part2_time.value, part2_time.unit.abbr() });
|
||||
}
|
||||
}
|
||||
|
||||
@ -50,6 +51,7 @@ pub fn main() !void {
|
||||
try solve_day(7, day07, &stdout, &timer);
|
||||
try solve_day(8, day08, &stdout, &timer);
|
||||
try solve_day(9, day09, &stdout, &timer);
|
||||
try solve_day(10, day10, &stdout, &timer);
|
||||
|
||||
try bw.flush();
|
||||
}
|
||||
@ -66,5 +68,6 @@ test {
|
||||
_ = day07;
|
||||
_ = day08;
|
||||
_ = day09;
|
||||
_ = day10;
|
||||
_ = utils;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user