BMPRLYZ3LIGIOEFYVBYAG3ZGA34IU3GSRWXJT24AXRMVH7FT5IDQC R 2D 2U 2D 1L 1D 2R 2L 2R 1D 2L 1U 2R 1D 1R 1L 1D 1R 2U 2L 2R 2U 2R 1L 1D 2R 1D 1R 1D 1R 1L 2R 1D 1L 1U 2L 1D 1L 1R 1U 2D 1U 2L 2R 2D 1L 1R 1D 1L 1U 1R 2D 1R 1D 2L 1D 2L 1D 2R 1L 1D 2L 1R 1D 2L 2R 2L 1U 2R 1U 2R 2U 1D 1U 2L 1D 2L 2R 2L 1R 1U 2D 1R 1L 2U 1D 2U 1L 2R 2D 1U 1L 2U 2L 1R 1D 1R 2D 1R 1D 2R 1D 1R 1D 2L 2U 2L 1D 1L 1R 2U 1D 1U 2L 2D 3L 3U 3R 1D 3R 1D 3R 2D 2U 3D 2L 3R 3U 3R 1U 3D 3L 1D 2U 1R 2L 2R 3L 2D 3L 2R 1D 1U 1D 2R 2L 1U 1R 3U 2D 3L 3U 2L 3R 2D 2U 2R 1U 3R 2D 1U 2D 3U 2R 3U 2L 3U 3D 2R 3U 3L 3U 2L 1D 3L 2D 3R 3L 2R 3D 1U 1L 3R 3D 2L 3U 2R 2U 1R 3D 3R 1U 2L 2U 1R 1U 1D 2L 2R 1D 3R 1D 3U 1R 2U 2L 2U 2L 3D 3U 2L 3U 1L 2D 1U 3L 2R 3D 1R 3L 3U 1L 3R 2D 3U 3L 3D 4L 1U 1R 3L 1D 4U 4L 4D 4U 1D 3R 1D 4L 1U 2D 1R 3L 4D 2U 2R 1L 4U 4R 4D 1R 3D 1R 4U 4D 1U 3D 4L 3R 2D 4L 2U 4D 3U 4D 2U 2L 3R 4L 4U 2L 1U 4D 4R 4U 4R 2U 4R 1U 3R 3U 4R 4U 2L 1U 3D 4L 1R 1L 2R 2D 2U 3R 3L 1D 2R 4D 1R 4L 2U 4D 2R 4U 2D 4R 1U 3L 3D 2R 2U 1L 4R 1U 2R 4D 3R 1L 2U 1R 2L 2U 2R 3L 2D 4U 4L 1U 2D 1U 2D 1L 2R 4L 5D 2U 5L 1R 2L 3U 3D 3L 1D 1U 4L 4U 3D 5R 1L 4U 1L 2R 4D 1L 4D 1U 4D 1L 2D 5L 5D 4R 3U 2L 4U 4L 4R 5D 1L 2R 5U 4D 5L 2U 4D 1L 3R 5D 4L 1D 3L 3U 2R 2D 4L 4U 1D 2L 5D 2L 2U 3R 3U 3D 2U 4R 3L 3D 2L 2R 3D 2L 3R 4U 4R 4D 2R 1D 1L 4R 4D 3R 2U 4L 2D 3U 4L 3R 5L 2R 1D 4L 5D 2U 5L 4U 2R 3L 4R 1U 3R 3L 2U 2L 3R 5L 3R 3U 3L 3U 5D 4U 5D 4L 4D 2R 5L 3U 2D 3L 4R 1D 1R 5L 3R 2L 3U 3D 1U 5R 2L 2D 5R 3U 4R 3L 1R 6L 4D 4U 4R 4U 2R 4D 1U 3R 1U 5D 3L 4R 5L 3U 6L 5D 3R 1D 2U 5L 1R 5U 4R 1U 1R 3L 2D 5U 4L 1U 2R 3L 5R 2D 3U 3D 6R 1D 2L 3R 3L 3U 4R 4U 4R 6U 1L 6R 6L 4U 6L 2D 1R 5L 5U 3D 6U 5L 4U 2R 1L 3D 6U 5R 4U 2D 3R 4L 1D 4U 6R 1D 6U 2D 5U 4L 4R 6D 2R 6L 1R 3D 4R 5L 6U 5L 3R 6U 1L 3D 7U 2D 5R 5D 7R 6D 6R 7D 7L 3R 4L 1U 6R 2L 7U 7D 1R 1D 1U 5R 4U 2D 5U 6L 2R 1U 5L 1U 7R 1D 2L 4D 4L 5U 4L 2D 5R 7D 7R 5L 3U 7R 7D 1L 2U 3L 2U 7L 2U 3L 6D 6L 2D 6L 6U 3L 3U 7D 3L 4U 5D 5L 4D 7U 3R 7D 5R 3L 6U 2L 2U 1L 1U 4D 7L 7D 2U 6L 2U 2L 4R 3L 6R 2D 7L 6D 3L 6R 1U 4R 6L 7D 7R 4U 7L 6R 3D 1U 3D 2U 3R 2L 7U 1R 4D 4U 2R 5D 5R 4L 3U 1R 7L 5D 4L 3D 7U 2D 4U 4L 1D 4R 7L 6U 3L 4D 5U 1D 1L 6R 7D 1L 4D 1L 5R 8D 4L 8R 4D 4U 3L 5R 5L 8U 4R 2D 6R 5L 1U 8L 1D 5U 5D 4L 6U 6D 8R 6D 3U 7R 8D 7L 2U 4D 4L 2R 2U 5L 4R 3L 2U 5D 8L 8D 3U 4D 2L 2U 4R 5L 6U 4R 5U 4L 7D 8R 8D 7R 5D 6U 2R 1D 3L 6U 3D 5U 6L 7R 1L 4R 4L 4R 3L 4U 3D 7U 8D 4R 6L 7R 2L 2U 7D 2R 1D 5U 1D 7R 2L 8R 8U 4R 9L 4R 5L 2D 6L 9U 2R 5D 4R 9U 4D 8R 9U 5D 4U 4L 4U 3R 5L 8D 9U 2L 8U 5D 4L 1D 4U 3D 7U 5D 5R 9L 2D 5L 7D 1L 2R 6D 9U 1L 6R 2D 2R 5D 8R 2D 3L 4D 5R 2D 8L 3D 6U 2L 4D 9L 6R 5L 7U 2D 8U 5L 6U 1L 9R 9D 1R 3U 9L 2U 8R 8D 8R 7U 7R 6L 2U 4D 2L 4U 4D 2R 8L 6R 9D 9L 6D 4L 5U 8D 2R 6D 7U 3R 6L 9U 6L 8U 8D 6U 9D 5U 8L 6R 6L 6R 9L 2U 4L 4U 1D 4R 1U 7D 5R 4U 4D 5L 9R 2U 5L 2R 10L 5R 1L 2U 3D 2R 7L 2R 6L 3R 6U 7L 1U 6R 6U 2L 3R 3L 1R 9L 5U 9L 9D 9U 4D 2R 6D 6R 8D 2U 6L 5R 2U 10L 3D 6R 3D 6U 2D 7R 1U 7D 2R 8L 5U 4L 5R 6U 6D 1L 5D 5R 5D 4L 5U 3R 4L 5R 2L 5D 10R 4L 2R 4L 7U 9R 3D 6R 7L 10D 7U 4L 9D 6L 7R 3U 7R 5U 6L 1U 2L 5D 6R 8L 7R 7D 1U 9R 1L 4U 4R 1L 3D 2L 8D 10L 9D 8R 5D 6L 7D 2U 11D 2U 6L 3U 8D 11U 9D 9R 11U 11L 8U 11R 11U 2D 6R 11D 7L 6U 5R 1L 3D 11U 3D 5R 4U 4D 8L 6U 1R 10L 5D 3U 8R 7L 8R 2U 6D 9R 1D 1R 3U 3L 10U 7R 1D 3U 6L 10R 6L 6R 4L 2R 10L 11U 5R 5U 5R 2D 10L 8U 9D 11R 10D 11R 11D 2U 7R 11U 2L 9R 11U 1R 8L 5U 6D 5L 10U 1L 4R 7L 5D 2R 9D 10U 4R 1D 7R 10D 10L 5R 3L 8R 8U 10R 9D 11R 1D 9R 5L 3D 5L 8U 8R 10D 10U 1D 3R 6U 1L 2U 6L 7R 11U 2R 2L 5U 5R 2D 12U 3L 2D 5U 3R 11D 5R 10U 8L 7R 6D 2U 11L 10R 12D 8U 12L 7D 5R 11U 10R 12U 1L 1U 10L 2R 9U 1R 4U 2R 8D 1R 2L 3R 7D 7L 10R 2U 11R 8U 11D 12U 8L 5U 12L 12U 12L 7R 5D 4U 9L 5R 7L 10R 4L 11D 3R 1D 12U 10R 10D 5R 11U 2L 8R 4D 1L 10R 2D 11L 4U 12D 11L 11U 3L 9U 8D 8R 10L 8U 2D 9U 12D 7U 8L 8D 9L 6U 8D 11U 12D 9L 1D 4R 2U 10D 2L 10U 6L 9D 4U 4R 4L 5R 9U 2R 5U 4D 12R 3L 10U 7D 1U 9R 6L 4U 9L 13D 2L 8R 12D 7U 13D 6U 12L 4R 4D 10U 8L 4R 4D 2U 9L 9D 11L 6R 2L 8R 9L 6U 13R 10D 3U 10L 12R 9U 12R 10U 10D 11L 7R 5L 13U 11R 13U 11R 12U 8R 12D 4L 10R 1L 9R 13L 2U 7L 13R 4U 13L 6R 12D 1U 7L 10R 6D 6U 2R 2L 8D 5U 9D 5L 9R 1U 5L 13D 1R 5L 8U 5R 2U 8L 1U 13R 6U 12L 3D 1U 4L 12R 1D 6L 11U 7D 1L 9R 4U 7D 7U 9D 1L 10D 14U 3D 9L 7U 1L 9R 13L 14R 11D 8L 12U 11R 11U 9R 2U 13R 5D 3U 3R 9D 14U 2D 8L 7D 2U 8L 12U 7D 12R 11D 14R 13L 13R 9L 7U 4D 9U 9L 12U 3D 4R 5D 14L 9D 14U 3L 8R 1U 2R 14D 5L 6R 9D 12R 3D 1L 8U 11D 11L 7R 14D 9L 9R 13L 4D 11R 14U 6L 10R 7D 9U 7D 5R 8U 2R 9D 6R 13U 1L 14R 6L 9D 11L 3U 5R 12U 8L 3D 5U 7R 2D 14R 14L 2U 5L 11U 7L 14U 5D 6R 14D 12U 4D 5R 14L 14D 12L 10D 2L 1R 5D 8R 2L 14R 5L 12D 9L 6D 8L 8R 12U 1L 11U 3D 7R 11D 15L 4U 9R 15U 8D 4L 10U 2L 13U 9L 5D 13L 5R 1D 3U 11D 5L 13R 3D 4U 3R 5U 14R 4D 9R 3D 11U 13R 7U 10R 1L 9D 15R 6U 12L 4R 13U 7D 10R 13U 1R 4D 15L 10R 11U 9L 1D 6R 15U 10L 10D 6U 10L 8R 5L 14D 6L 2U 2L 9U 2L 7U 9L 2D 8R 6D 6R 7U 2L 13R 13U 3D 13U 14R 9L 4U 15R 1D 2U 15R 12U 12L 12U 9R 8U 3L 7D 3U 2R 7D 4R 6U 13D 7U 7D 8R 13U 10D 16L 12U 8R 6U 10L 14D 12R 2L 9U 8D 7U 6R 7L 14D 6L 10U 11L 3D 6R 2U 8L 2D 10R 16U 14R 10D 13R 3D 8R 2D 16L 12D 13U 6D 2L 4R 14D 16U 12L 1D 9L 7U 1L 3U 7R 7D 3L 11R 9D 5R 10D 12R 1U 8L 8D 5R 12U 8R 11U 3D 5R 9L 11U 14L 14D 5U 12L 9D 2U 6L 7D 6L 2R 2D 11R 13D 10U 4L 13U 5L 6R 3U 16D 13R 1U 2D 4R 3U 10D 16L 1U 1R 16D 6U 7D 3R 4U 2D 4L 8U 9R 8U 15D 4R 11D 4R 12U 1D 2R 4D 17L 4U 1D 1L 3R 16D 12R 6U 3R 4U 2D 8R 5D 4R 1U 5L 12D 1R 12U 3D 13L 13U 11D 8R 3D 14L 10D 1L 4D 4R 9L 10U 6L 8R 7L 2R 1L 4D 8R 14U 8L 13D 12R 17D 2R 5U 12R 8D 16L 6R 14D 9U 7L 5U 14L 10U 5L 4U 7R 17D 1U 6L 12D 10L 2D 17L 14R 3D 6U 11R 14L 11D 8U 1R 1L 14U 17L 15U 3R 5D 3L 12R 10U 17R 7D 2U 16D 10L 12R 5D 10L 14D 17U 4L 9D 11R 5D 4U 5L 16D 16L 5U 10D 8L 14U 11L 17D 1U 10R 9U 17L 8R 11L 15D 9U 18D 3R 4L 7R 2U 5L 17U 2R 11L 11U 7D 17U 11R 5D 14U 7R 17D 10U 18D 15L 7U 2D 3U 14R 6D 2L 5R 16D 8U 2D 16R 9U 12R 4D 14R 10U 1R 1L 8D 15L 8D 16U 9R 11L 17U 18L 2R 4L 1U 9L 13R 1U 17L 12R 3D 15R 3U 3D 8L 6R 4D 13U 2R 1L 10U 9R 2D 16R 9U 15R 10U 4R 6D 10U 4R 11D 1R 10U 17R 4D 9U 17R 7U 11L 10R 10L 10U 8L 18U 14R 16L 12U 18R 1D 4L 9R 18D 12L 17D 12U 4D 1U 16R 17U 3D 13L 14D 9L 19U 13L 2U 9D 7U 7D 4L 10R 6D 11R 7U 10D 13U 18L 14D 7L 4R 11D 8L 8R 9L 2U 11R 13L 13R 11L 16D 10L 6R 3D 8L 19U 18L 14D 15U 10D 11R 19D 14U 2R 7U 6D 15U 10D 4U 10L 9R 15L 8U 7R 4D 5R 18L 3R 11D 11R 2U 1L 6D 18R 15U 2R 10L 18R 1U 19D 15R 18L 18R 4L 7D 18R 19U 11D 3L 3R 11U 16R 3D 4U 2R 10U 9L 18U 6L 5D 7L 17U 3L 5D 6U 19R 14U 3D 1U 16L 16D 12L 11D 16R 15U 5D 14L 3U 18L 8U 10L 10D 10R 5
const std = @import("std");const PATH = "input/day09.txt";const Str = []const u8;pub fn first(allocator: std.mem.Allocator) !usize {var road = std.AutoHashMap([2]isize, void).init(allocator);defer road.deinit();var head: [2]isize = .{ 0, 0 };var tail: [2]isize = .{ 0, 0 };try road.put(tail, {});var lines = std.mem.tokenize(u8, @embedFile(PATH), "\n");while (lines.next()) |line| {const direction: [2]i2 = switch (line[0]) {'L' => .{ 0, -1 },'R' => .{ 0, 1 },'U' => .{ -1, 0 },'D' => .{ 1, 0 },else => unreachable,};const count: usize = try std.fmt.parseUnsigned(usize, line[2..], 10);var idx: usize = 0;while (idx < count) : ({try road.put(tail, {});idx += 1;}) {head[0] += direction[0];head[1] += direction[1];const xdiff = try std.math.absInt(head[0] - tail[0]);const ydiff = try std.math.absInt(head[1] - tail[1]);const manhattan = xdiff + ydiff;if (xdiff > 1 or manhattan == 3) {if (head[0] < tail[0]) tail[0] -= 1 else tail[0] += 1;}if (ydiff > 1 or manhattan == 3) {if (head[1] < tail[1]) tail[1] -= 1 else tail[1] += 1;}}}return road.count();}pub fn second(allocator: std.mem.Allocator) !usize {var road = std.AutoHashMap([2]isize, void).init(allocator);defer road.deinit();const KNOTS = 10;var rope: [KNOTS][2]isize = [_][2]isize{[2]isize{ 0, 0 }} ** KNOTS;try road.put(rope[KNOTS - 1], {});var lines = std.mem.tokenize(u8, @embedFile(PATH), "\n");while (lines.next()) |line| {const direction: [2]i2 = switch (line[0]) {'L' => .{ 0, -1 },'R' => .{ 0, 1 },'U' => .{ -1, 0 },'D' => .{ 1, 0 },else => unreachable,};const count: usize = try std.fmt.parseUnsigned(usize, line[2..], 10);var move: usize = 0;while (move < count) : ({try road.put(rope[KNOTS - 1], {});move += 1;}) {rope[0][0] += direction[0];rope[0][1] += direction[1];var knot: usize = 1;while (knot < KNOTS) : (knot += 1) {const xdiff = try std.math.absInt(rope[knot - 1][0] - rope[knot][0]);const ydiff = try std.math.absInt(rope[knot - 1][1] - rope[knot][1]);const manhattan = xdiff + ydiff;if (xdiff > 1 or manhattan == 3) {if (rope[knot - 1][0] < rope[knot][0]) rope[knot][0] -= 1 else rope[knot][0] += 1;}if (ydiff > 1 or manhattan == 3) {if (rope[knot - 1][1] < rope[knot][1]) rope[knot][1] -= 1 else rope[knot][1] += 1;}}}}return road.count();}test "day09a" {try std.testing.expectEqual(@as(usize, 6243), try first(std.testing.allocator));}test "day09b" {try std.testing.expectEqual(@as(usize, 2630), try second(std.testing.allocator));}const test_input =\\R 4\\U 4\\L 3\\D 1\\R 4\\D 1\\L 5\\R 2;const test_input2 =\\R 5\\U 8\\L 8\\D 3\\R 17\\D 10\\L 25\\U 20;