2024 Day 14 Part 2
This commit is contained in:
parent
bf3484db38
commit
e763df2540
1 changed files with 60 additions and 6 deletions
|
|
@ -14,33 +14,87 @@ pub fn main() !void {
|
||||||
const text = try aoc.readAll(allocator, "input/day14.txt");
|
const text = try aoc.readAll(allocator, "input/day14.txt");
|
||||||
defer allocator.free(text);
|
defer allocator.free(text);
|
||||||
|
|
||||||
|
const floor = Pos{ .x = 101, .y = 103 };
|
||||||
|
|
||||||
var robots = try aoc.parseAll(Robot, allocator, text, "\n");
|
var robots = try aoc.parseAll(Robot, allocator, text, "\n");
|
||||||
defer robots.deinit();
|
defer robots.deinit();
|
||||||
|
|
||||||
var bw = std.io.bufferedWriter(std.io.getStdOut().writer());
|
var bw = std.io.bufferedWriter(std.io.getStdOut().writer());
|
||||||
const stdout = bw.writer();
|
const stdout = bw.writer();
|
||||||
|
|
||||||
try stdout.print("{d}\n", .{try part1(robots.items)});
|
try stdout.print("{d}\n", .{part1(robots.items, floor)});
|
||||||
|
try bw.flush();
|
||||||
|
|
||||||
|
try stdout.print("{d}\n", .{try part2(allocator, robots.items, floor)});
|
||||||
try bw.flush();
|
try bw.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn part1(robots: []const Robot) !u64 {
|
fn part1(robots: []const Robot, floor: Pos) i64 {
|
||||||
var quadrants = [4]u64{ 0, 0, 0, 0 };
|
return safetyScore(robots, floor, 100);
|
||||||
const floor = Pos{ .x = 101, .y = 103 };
|
}
|
||||||
|
|
||||||
|
fn safetyScore(robots: []const Robot, floor: Pos, ticks: i64) i64 {
|
||||||
|
var quadrants = [4]i64{ 0, 0, 0, 0 };
|
||||||
for (robots) |robot| {
|
for (robots) |robot| {
|
||||||
const pos = robot.simulate(floor, 100);
|
const pos = robot.simulate(floor, ticks);
|
||||||
if (pos.quadrant(floor)) |q| {
|
if (pos.quadrant(floor)) |q| {
|
||||||
quadrants[q] += 1;
|
quadrants[q] += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var safety: u64 = 1;
|
var safety: i64 = 1;
|
||||||
for (quadrants) |n| {
|
for (quadrants) |n| {
|
||||||
safety *= n;
|
safety *= n;
|
||||||
}
|
}
|
||||||
return safety;
|
return safety;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn part2(allocator: Allocator, robots: []const Robot, floor: Pos) !i64 {
|
||||||
|
var best: i64 = std.math.maxInt(i64);
|
||||||
|
var tick: i64 = 0;
|
||||||
|
while (tick < floor.x * floor.y) : (tick += 1) {
|
||||||
|
const safety = safetyScore(robots, floor, tick);
|
||||||
|
if (safety < best) {
|
||||||
|
best = safety;
|
||||||
|
|
||||||
|
var points = Set(Pos).init(allocator);
|
||||||
|
defer points.deinit();
|
||||||
|
for (robots) |robot| {
|
||||||
|
const pos = robot.simulate(floor, tick);
|
||||||
|
try points.put(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (try wasChristmasTree(floor, points)) {
|
||||||
|
return tick;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn wasChristmasTree(floor: Pos, points: Set(Pos)) !bool {
|
||||||
|
std.debug.print("\x1B[2J\x1B[H", .{});
|
||||||
|
for (0..@intCast(floor.y + 1)) |y| {
|
||||||
|
for (0..@intCast(floor.x + 1)) |x| {
|
||||||
|
const pos = Pos{
|
||||||
|
.x = @intCast(x),
|
||||||
|
.y = @intCast(y),
|
||||||
|
};
|
||||||
|
if (points.contains(pos)) {
|
||||||
|
std.debug.print("█", .{});
|
||||||
|
} else {
|
||||||
|
std.debug.print(" ", .{});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std.debug.print("\n", .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
const stdin = std.io.getStdIn();
|
||||||
|
var buf: [32]u8 = undefined;
|
||||||
|
const ans = (try stdin.reader().readUntilDelimiterOrEof(&buf, '\n')) orelse "";
|
||||||
|
return ans.len > 0 and ans[0] == 'y';
|
||||||
|
}
|
||||||
|
|
||||||
const Pos = struct {
|
const Pos = struct {
|
||||||
x: i64,
|
x: i64,
|
||||||
y: i64,
|
y: i64,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue