Finish day 12
This commit is contained in:
parent
082af016ab
commit
3f063f931c
|
@ -0,0 +1,27 @@
|
||||||
|
const Builder = @import("std").build.Builder;
|
||||||
|
|
||||||
|
pub fn build(b: *Builder) void {
|
||||||
|
// Standard target options allows the person running `zig build` to choose
|
||||||
|
// what target to build for. Here we do not override the defaults, which
|
||||||
|
// means any target is allowed, and the default is native. Other options
|
||||||
|
// for restricting supported target set are available.
|
||||||
|
const target = b.standardTargetOptions(.{});
|
||||||
|
|
||||||
|
// Standard release options allow the person running `zig build` to select
|
||||||
|
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
|
||||||
|
const mode = b.standardReleaseOptions();
|
||||||
|
|
||||||
|
const exe = b.addExecutable("day12", "src/main.zig");
|
||||||
|
exe.setTarget(target);
|
||||||
|
exe.setBuildMode(mode);
|
||||||
|
exe.install();
|
||||||
|
|
||||||
|
const run_cmd = exe.run();
|
||||||
|
run_cmd.step.dependOn(b.getInstallStep());
|
||||||
|
if (b.args) |args| {
|
||||||
|
run_cmd.addArgs(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
const run_step = b.step("run", "Run the app");
|
||||||
|
run_step.dependOn(&run_cmd.step);
|
||||||
|
}
|
|
@ -0,0 +1,750 @@
|
||||||
|
W1
|
||||||
|
F91
|
||||||
|
W3
|
||||||
|
F82
|
||||||
|
N1
|
||||||
|
E2
|
||||||
|
N4
|
||||||
|
R90
|
||||||
|
F25
|
||||||
|
N2
|
||||||
|
F75
|
||||||
|
E4
|
||||||
|
R90
|
||||||
|
F91
|
||||||
|
R90
|
||||||
|
F64
|
||||||
|
L90
|
||||||
|
E1
|
||||||
|
L90
|
||||||
|
S2
|
||||||
|
L180
|
||||||
|
S2
|
||||||
|
E3
|
||||||
|
N2
|
||||||
|
E5
|
||||||
|
L90
|
||||||
|
N2
|
||||||
|
R90
|
||||||
|
F30
|
||||||
|
L90
|
||||||
|
N1
|
||||||
|
F37
|
||||||
|
S1
|
||||||
|
E5
|
||||||
|
F3
|
||||||
|
E2
|
||||||
|
F59
|
||||||
|
W3
|
||||||
|
L270
|
||||||
|
S5
|
||||||
|
W5
|
||||||
|
S4
|
||||||
|
F84
|
||||||
|
N5
|
||||||
|
R180
|
||||||
|
E4
|
||||||
|
F31
|
||||||
|
L90
|
||||||
|
E2
|
||||||
|
F77
|
||||||
|
L90
|
||||||
|
N5
|
||||||
|
F17
|
||||||
|
N4
|
||||||
|
N4
|
||||||
|
W2
|
||||||
|
F45
|
||||||
|
S1
|
||||||
|
F92
|
||||||
|
E1
|
||||||
|
F33
|
||||||
|
L270
|
||||||
|
F21
|
||||||
|
L90
|
||||||
|
E1
|
||||||
|
F81
|
||||||
|
N5
|
||||||
|
F20
|
||||||
|
E2
|
||||||
|
R90
|
||||||
|
N4
|
||||||
|
W3
|
||||||
|
L180
|
||||||
|
S2
|
||||||
|
F33
|
||||||
|
E5
|
||||||
|
F87
|
||||||
|
R90
|
||||||
|
N2
|
||||||
|
F29
|
||||||
|
E3
|
||||||
|
S4
|
||||||
|
L90
|
||||||
|
E4
|
||||||
|
R90
|
||||||
|
S2
|
||||||
|
F65
|
||||||
|
L90
|
||||||
|
F69
|
||||||
|
W2
|
||||||
|
N4
|
||||||
|
F73
|
||||||
|
R180
|
||||||
|
S3
|
||||||
|
R90
|
||||||
|
N3
|
||||||
|
R90
|
||||||
|
W1
|
||||||
|
L180
|
||||||
|
F96
|
||||||
|
N3
|
||||||
|
W2
|
||||||
|
L180
|
||||||
|
S5
|
||||||
|
F29
|
||||||
|
E3
|
||||||
|
S4
|
||||||
|
W1
|
||||||
|
F53
|
||||||
|
E1
|
||||||
|
L90
|
||||||
|
E5
|
||||||
|
F26
|
||||||
|
E3
|
||||||
|
R270
|
||||||
|
E2
|
||||||
|
S2
|
||||||
|
W2
|
||||||
|
F43
|
||||||
|
W2
|
||||||
|
F53
|
||||||
|
F74
|
||||||
|
R180
|
||||||
|
N5
|
||||||
|
W3
|
||||||
|
S4
|
||||||
|
F70
|
||||||
|
R90
|
||||||
|
W4
|
||||||
|
F56
|
||||||
|
L90
|
||||||
|
S5
|
||||||
|
R180
|
||||||
|
E4
|
||||||
|
S4
|
||||||
|
F80
|
||||||
|
S1
|
||||||
|
F91
|
||||||
|
R90
|
||||||
|
S4
|
||||||
|
F88
|
||||||
|
L90
|
||||||
|
S5
|
||||||
|
R90
|
||||||
|
E2
|
||||||
|
S1
|
||||||
|
F37
|
||||||
|
N1
|
||||||
|
R90
|
||||||
|
F92
|
||||||
|
W5
|
||||||
|
F14
|
||||||
|
N2
|
||||||
|
E5
|
||||||
|
S2
|
||||||
|
F89
|
||||||
|
L180
|
||||||
|
N4
|
||||||
|
E4
|
||||||
|
L90
|
||||||
|
F32
|
||||||
|
E4
|
||||||
|
R90
|
||||||
|
F99
|
||||||
|
N3
|
||||||
|
L180
|
||||||
|
F78
|
||||||
|
S1
|
||||||
|
R270
|
||||||
|
W1
|
||||||
|
F11
|
||||||
|
S4
|
||||||
|
F47
|
||||||
|
N4
|
||||||
|
L90
|
||||||
|
F17
|
||||||
|
R90
|
||||||
|
E4
|
||||||
|
S3
|
||||||
|
F14
|
||||||
|
S1
|
||||||
|
R90
|
||||||
|
N3
|
||||||
|
F52
|
||||||
|
W3
|
||||||
|
S5
|
||||||
|
L180
|
||||||
|
F41
|
||||||
|
R90
|
||||||
|
F62
|
||||||
|
W1
|
||||||
|
R90
|
||||||
|
E4
|
||||||
|
F1
|
||||||
|
W5
|
||||||
|
F86
|
||||||
|
W1
|
||||||
|
N5
|
||||||
|
F5
|
||||||
|
S1
|
||||||
|
E5
|
||||||
|
F67
|
||||||
|
W3
|
||||||
|
F97
|
||||||
|
E1
|
||||||
|
L90
|
||||||
|
S2
|
||||||
|
E1
|
||||||
|
R90
|
||||||
|
F82
|
||||||
|
E3
|
||||||
|
N2
|
||||||
|
F16
|
||||||
|
L90
|
||||||
|
W2
|
||||||
|
F35
|
||||||
|
R180
|
||||||
|
N2
|
||||||
|
E3
|
||||||
|
N4
|
||||||
|
W4
|
||||||
|
F13
|
||||||
|
S5
|
||||||
|
E1
|
||||||
|
S5
|
||||||
|
L90
|
||||||
|
E5
|
||||||
|
F65
|
||||||
|
E5
|
||||||
|
L90
|
||||||
|
S4
|
||||||
|
E3
|
||||||
|
W4
|
||||||
|
N1
|
||||||
|
R90
|
||||||
|
N5
|
||||||
|
F93
|
||||||
|
R90
|
||||||
|
S5
|
||||||
|
R90
|
||||||
|
L90
|
||||||
|
F86
|
||||||
|
E3
|
||||||
|
F90
|
||||||
|
E4
|
||||||
|
N2
|
||||||
|
E4
|
||||||
|
R180
|
||||||
|
W5
|
||||||
|
R90
|
||||||
|
E3
|
||||||
|
F98
|
||||||
|
F56
|
||||||
|
L90
|
||||||
|
F68
|
||||||
|
L90
|
||||||
|
N3
|
||||||
|
F35
|
||||||
|
S1
|
||||||
|
W5
|
||||||
|
F25
|
||||||
|
L180
|
||||||
|
F7
|
||||||
|
R270
|
||||||
|
F84
|
||||||
|
R90
|
||||||
|
S4
|
||||||
|
E5
|
||||||
|
S3
|
||||||
|
L270
|
||||||
|
F33
|
||||||
|
W3
|
||||||
|
R90
|
||||||
|
W5
|
||||||
|
N3
|
||||||
|
E4
|
||||||
|
R90
|
||||||
|
W2
|
||||||
|
F100
|
||||||
|
E5
|
||||||
|
S2
|
||||||
|
L90
|
||||||
|
F6
|
||||||
|
E1
|
||||||
|
L90
|
||||||
|
S1
|
||||||
|
F17
|
||||||
|
N3
|
||||||
|
E1
|
||||||
|
S3
|
||||||
|
F78
|
||||||
|
R90
|
||||||
|
W5
|
||||||
|
N4
|
||||||
|
L90
|
||||||
|
F13
|
||||||
|
W5
|
||||||
|
R90
|
||||||
|
F7
|
||||||
|
F74
|
||||||
|
R90
|
||||||
|
E4
|
||||||
|
F28
|
||||||
|
L90
|
||||||
|
S5
|
||||||
|
R90
|
||||||
|
F77
|
||||||
|
S2
|
||||||
|
E2
|
||||||
|
N3
|
||||||
|
F30
|
||||||
|
E1
|
||||||
|
R90
|
||||||
|
W2
|
||||||
|
S2
|
||||||
|
F62
|
||||||
|
E2
|
||||||
|
L90
|
||||||
|
E2
|
||||||
|
F56
|
||||||
|
L90
|
||||||
|
F61
|
||||||
|
S1
|
||||||
|
F14
|
||||||
|
W3
|
||||||
|
F23
|
||||||
|
L90
|
||||||
|
E3
|
||||||
|
S3
|
||||||
|
L270
|
||||||
|
S5
|
||||||
|
F97
|
||||||
|
E5
|
||||||
|
S1
|
||||||
|
F96
|
||||||
|
W2
|
||||||
|
F61
|
||||||
|
L180
|
||||||
|
F25
|
||||||
|
L90
|
||||||
|
W4
|
||||||
|
F100
|
||||||
|
W4
|
||||||
|
F14
|
||||||
|
W4
|
||||||
|
S5
|
||||||
|
R90
|
||||||
|
F67
|
||||||
|
E1
|
||||||
|
R90
|
||||||
|
F89
|
||||||
|
W5
|
||||||
|
S3
|
||||||
|
W2
|
||||||
|
N2
|
||||||
|
F64
|
||||||
|
L180
|
||||||
|
S4
|
||||||
|
R270
|
||||||
|
F47
|
||||||
|
E1
|
||||||
|
S1
|
||||||
|
E4
|
||||||
|
N1
|
||||||
|
R90
|
||||||
|
N2
|
||||||
|
E5
|
||||||
|
F97
|
||||||
|
N3
|
||||||
|
E5
|
||||||
|
S5
|
||||||
|
R180
|
||||||
|
E5
|
||||||
|
F34
|
||||||
|
L90
|
||||||
|
W1
|
||||||
|
W1
|
||||||
|
N3
|
||||||
|
R90
|
||||||
|
F17
|
||||||
|
N1
|
||||||
|
F75
|
||||||
|
S4
|
||||||
|
W5
|
||||||
|
N2
|
||||||
|
W1
|
||||||
|
N2
|
||||||
|
L90
|
||||||
|
W3
|
||||||
|
N2
|
||||||
|
F1
|
||||||
|
N1
|
||||||
|
W3
|
||||||
|
R90
|
||||||
|
F18
|
||||||
|
E4
|
||||||
|
N4
|
||||||
|
F18
|
||||||
|
N4
|
||||||
|
F73
|
||||||
|
W4
|
||||||
|
F61
|
||||||
|
W3
|
||||||
|
R90
|
||||||
|
N5
|
||||||
|
L90
|
||||||
|
N4
|
||||||
|
F70
|
||||||
|
E4
|
||||||
|
F10
|
||||||
|
L90
|
||||||
|
F33
|
||||||
|
N5
|
||||||
|
L90
|
||||||
|
W4
|
||||||
|
L180
|
||||||
|
E2
|
||||||
|
F41
|
||||||
|
E1
|
||||||
|
S4
|
||||||
|
E4
|
||||||
|
L90
|
||||||
|
F28
|
||||||
|
N2
|
||||||
|
W4
|
||||||
|
S2
|
||||||
|
F86
|
||||||
|
R180
|
||||||
|
S3
|
||||||
|
W3
|
||||||
|
S3
|
||||||
|
W2
|
||||||
|
F55
|
||||||
|
W1
|
||||||
|
F18
|
||||||
|
W2
|
||||||
|
F18
|
||||||
|
L90
|
||||||
|
S4
|
||||||
|
W1
|
||||||
|
L90
|
||||||
|
F47
|
||||||
|
L90
|
||||||
|
S4
|
||||||
|
F39
|
||||||
|
N5
|
||||||
|
L180
|
||||||
|
S3
|
||||||
|
W5
|
||||||
|
F95
|
||||||
|
W1
|
||||||
|
R90
|
||||||
|
E2
|
||||||
|
N3
|
||||||
|
L90
|
||||||
|
S4
|
||||||
|
F77
|
||||||
|
S1
|
||||||
|
W4
|
||||||
|
S5
|
||||||
|
E4
|
||||||
|
R90
|
||||||
|
W1
|
||||||
|
R90
|
||||||
|
W3
|
||||||
|
W2
|
||||||
|
N4
|
||||||
|
F1
|
||||||
|
W1
|
||||||
|
N5
|
||||||
|
F55
|
||||||
|
E4
|
||||||
|
N4
|
||||||
|
W5
|
||||||
|
L90
|
||||||
|
F90
|
||||||
|
E4
|
||||||
|
R90
|
||||||
|
E2
|
||||||
|
R90
|
||||||
|
S5
|
||||||
|
F44
|
||||||
|
N2
|
||||||
|
E3
|
||||||
|
R90
|
||||||
|
F64
|
||||||
|
W1
|
||||||
|
L180
|
||||||
|
L180
|
||||||
|
F55
|
||||||
|
L90
|
||||||
|
F15
|
||||||
|
S2
|
||||||
|
E1
|
||||||
|
R270
|
||||||
|
F10
|
||||||
|
R90
|
||||||
|
W4
|
||||||
|
F43
|
||||||
|
E1
|
||||||
|
F7
|
||||||
|
N2
|
||||||
|
W3
|
||||||
|
F10
|
||||||
|
N1
|
||||||
|
L270
|
||||||
|
N2
|
||||||
|
L90
|
||||||
|
E2
|
||||||
|
R90
|
||||||
|
F28
|
||||||
|
W2
|
||||||
|
N5
|
||||||
|
F70
|
||||||
|
R90
|
||||||
|
E3
|
||||||
|
E3
|
||||||
|
F75
|
||||||
|
W4
|
||||||
|
L90
|
||||||
|
S2
|
||||||
|
R90
|
||||||
|
F83
|
||||||
|
L270
|
||||||
|
E1
|
||||||
|
F87
|
||||||
|
R180
|
||||||
|
N3
|
||||||
|
L90
|
||||||
|
F30
|
||||||
|
L90
|
||||||
|
E1
|
||||||
|
N5
|
||||||
|
F87
|
||||||
|
N4
|
||||||
|
R90
|
||||||
|
F51
|
||||||
|
W5
|
||||||
|
N3
|
||||||
|
R90
|
||||||
|
S5
|
||||||
|
F98
|
||||||
|
W4
|
||||||
|
N2
|
||||||
|
E2
|
||||||
|
L90
|
||||||
|
E4
|
||||||
|
S1
|
||||||
|
E5
|
||||||
|
F60
|
||||||
|
N1
|
||||||
|
L180
|
||||||
|
E1
|
||||||
|
F10
|
||||||
|
R90
|
||||||
|
W5
|
||||||
|
F90
|
||||||
|
W5
|
||||||
|
F9
|
||||||
|
S1
|
||||||
|
W3
|
||||||
|
F9
|
||||||
|
E2
|
||||||
|
S4
|
||||||
|
L180
|
||||||
|
F61
|
||||||
|
W2
|
||||||
|
N3
|
||||||
|
F35
|
||||||
|
R90
|
||||||
|
E4
|
||||||
|
N3
|
||||||
|
W4
|
||||||
|
L90
|
||||||
|
E1
|
||||||
|
L90
|
||||||
|
S1
|
||||||
|
F62
|
||||||
|
S5
|
||||||
|
W1
|
||||||
|
N5
|
||||||
|
L180
|
||||||
|
F76
|
||||||
|
W3
|
||||||
|
L90
|
||||||
|
W4
|
||||||
|
L90
|
||||||
|
N2
|
||||||
|
E3
|
||||||
|
N5
|
||||||
|
E1
|
||||||
|
N2
|
||||||
|
F13
|
||||||
|
S1
|
||||||
|
F20
|
||||||
|
W5
|
||||||
|
L90
|
||||||
|
S1
|
||||||
|
F89
|
||||||
|
S3
|
||||||
|
L90
|
||||||
|
W2
|
||||||
|
L90
|
||||||
|
F48
|
||||||
|
W5
|
||||||
|
N1
|
||||||
|
R90
|
||||||
|
F93
|
||||||
|
L90
|
||||||
|
E4
|
||||||
|
L90
|
||||||
|
N2
|
||||||
|
F100
|
||||||
|
W5
|
||||||
|
S5
|
||||||
|
W1
|
||||||
|
S1
|
||||||
|
E2
|
||||||
|
S1
|
||||||
|
W4
|
||||||
|
R90
|
||||||
|
S2
|
||||||
|
F99
|
||||||
|
W2
|
||||||
|
F80
|
||||||
|
L90
|
||||||
|
F78
|
||||||
|
N4
|
||||||
|
L90
|
||||||
|
F67
|
||||||
|
S1
|
||||||
|
L90
|
||||||
|
F23
|
||||||
|
W3
|
||||||
|
N1
|
||||||
|
W5
|
||||||
|
F76
|
||||||
|
R270
|
||||||
|
F51
|
||||||
|
L90
|
||||||
|
W2
|
||||||
|
N1
|
||||||
|
E3
|
||||||
|
S3
|
||||||
|
L90
|
||||||
|
F83
|
||||||
|
L90
|
||||||
|
F46
|
||||||
|
S5
|
||||||
|
L180
|
||||||
|
N3
|
||||||
|
E3
|
||||||
|
F49
|
||||||
|
E5
|
||||||
|
N4
|
||||||
|
W5
|
||||||
|
L90
|
||||||
|
E3
|
||||||
|
R90
|
||||||
|
S4
|
||||||
|
F54
|
||||||
|
E1
|
||||||
|
F49
|
||||||
|
N4
|
||||||
|
L180
|
||||||
|
E3
|
||||||
|
L90
|
||||||
|
R90
|
||||||
|
F95
|
||||||
|
W2
|
||||||
|
N2
|
||||||
|
F12
|
||||||
|
R180
|
||||||
|
E4
|
||||||
|
R90
|
||||||
|
N5
|
||||||
|
L180
|
||||||
|
S3
|
||||||
|
W3
|
||||||
|
S1
|
||||||
|
F22
|
||||||
|
W1
|
||||||
|
F18
|
||||||
|
L90
|
||||||
|
F35
|
||||||
|
R90
|
||||||
|
F3
|
||||||
|
S4
|
||||||
|
L90
|
||||||
|
F53
|
||||||
|
W5
|
||||||
|
F58
|
||||||
|
L90
|
||||||
|
S2
|
||||||
|
F48
|
||||||
|
S5
|
||||||
|
R180
|
||||||
|
F67
|
||||||
|
L180
|
||||||
|
W1
|
||||||
|
S3
|
||||||
|
L90
|
||||||
|
F33
|
||||||
|
F34
|
||||||
|
R90
|
||||||
|
F54
|
||||||
|
W2
|
||||||
|
L180
|
||||||
|
S5
|
||||||
|
W4
|
||||||
|
R90
|
||||||
|
F80
|
||||||
|
W4
|
||||||
|
S1
|
||||||
|
W4
|
||||||
|
F35
|
||||||
|
E1
|
||||||
|
F48
|
||||||
|
N3
|
||||||
|
L270
|
||||||
|
F78
|
||||||
|
N4
|
||||||
|
S4
|
||||||
|
F11
|
||||||
|
S1
|
||||||
|
W3
|
||||||
|
L90
|
||||||
|
W1
|
||||||
|
F26
|
||||||
|
R180
|
||||||
|
E3
|
||||||
|
F43
|
||||||
|
S4
|
||||||
|
R180
|
||||||
|
W3
|
||||||
|
N2
|
||||||
|
F80
|
||||||
|
W4
|
||||||
|
F29
|
||||||
|
W5
|
||||||
|
W1
|
||||||
|
R270
|
||||||
|
N3
|
||||||
|
L90
|
||||||
|
F17
|
||||||
|
W4
|
||||||
|
F49
|
||||||
|
S4
|
||||||
|
S1
|
||||||
|
F47
|
|
@ -0,0 +1,197 @@
|
||||||
|
const std = @import("std");
|
||||||
|
|
||||||
|
pub fn main() anyerror!void {
|
||||||
|
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
||||||
|
defer arena.deinit();
|
||||||
|
var gpa = &arena.allocator;
|
||||||
|
|
||||||
|
var f = try std.fs.cwd().openFile("input", .{});
|
||||||
|
var contents = try f.readToEndAlloc(gpa, std.math.maxInt(u32));
|
||||||
|
defer gpa.free(contents);
|
||||||
|
|
||||||
|
var ship = ShipPosition{};
|
||||||
|
var it = std.mem.tokenize(contents, "\n");
|
||||||
|
while (it.next()) |line| {
|
||||||
|
ship.update(line[0], try std.fmt.parseInt(i64, line[1..], 10));
|
||||||
|
std.log.debug("After '{}', ship at ({}, {}) facing {}",
|
||||||
|
.{line, ship.position[0], ship.position[1], ship.facing});
|
||||||
|
}
|
||||||
|
std.log.info("Ship is at ({},{}) facing {}. It has travalled {} manhattan distance from start",
|
||||||
|
.{ship.position[0], ship.position[1], ship.facing,
|
||||||
|
ship.manhattan_distance_from([_]i64{0, 0})});
|
||||||
|
|
||||||
|
// Part 2
|
||||||
|
ship = ShipPosition{};
|
||||||
|
it = std.mem.tokenize(contents, "\n");
|
||||||
|
while (it.next()) |line| {
|
||||||
|
ship.update_part2(line[0], try std.fmt.parseInt(i64, line[1..], 10));
|
||||||
|
std.log.debug("After '{}', ship at ({}, {}), with waypoint ({}, {})",
|
||||||
|
.{line, ship.position[0], ship.position[1],
|
||||||
|
ship.waypoint[0], ship.waypoint[1]});
|
||||||
|
}
|
||||||
|
std.log.info("Ship is at ({},{}) facing {} and waypoint ({}, {}). It has travalled {} manhattan distance from start",
|
||||||
|
.{ship.position[0], ship.position[1], ship.facing,
|
||||||
|
ship.waypoint[0], ship.waypoint[1],
|
||||||
|
ship.manhattan_distance_from([_]i64{0, 0})});
|
||||||
|
}
|
||||||
|
|
||||||
|
const ShipPosition = struct {
|
||||||
|
facing : i64 = 90,
|
||||||
|
position : [2]i64 = [_]i64{0, 0},
|
||||||
|
waypoint: [2]i64 = [_]i64{10, 1},
|
||||||
|
|
||||||
|
pub fn update(self: *ShipPosition, command: u8, value: i64) void {
|
||||||
|
switch(command) {
|
||||||
|
'N' => {
|
||||||
|
self.position[1] += value;
|
||||||
|
},
|
||||||
|
'S' => {
|
||||||
|
self.position[1] -= value;
|
||||||
|
},
|
||||||
|
'E' => {
|
||||||
|
self.position[0] += value;
|
||||||
|
},
|
||||||
|
'W' => {
|
||||||
|
self.position[0] -= value;
|
||||||
|
},
|
||||||
|
'R' => {
|
||||||
|
self.facing += value;
|
||||||
|
},
|
||||||
|
'L' => {
|
||||||
|
self.facing -= value;
|
||||||
|
},
|
||||||
|
'F' => {
|
||||||
|
std.log.debug("Facing before moving forward: {}", .{self.facing});
|
||||||
|
while (self.facing < 0) {
|
||||||
|
self.facing += 360;
|
||||||
|
}
|
||||||
|
if (self.facing >= 360) {
|
||||||
|
self.facing = @intCast(i64, @mod(self.facing, 360));
|
||||||
|
}
|
||||||
|
std.log.debug("Facing after normalizing, before moving forward: {}",
|
||||||
|
.{self.facing});
|
||||||
|
var c : u8 = switch(self.facing) {
|
||||||
|
0 => 'N',
|
||||||
|
90 => 'E',
|
||||||
|
180 => 'S',
|
||||||
|
270 => 'W',
|
||||||
|
else => {
|
||||||
|
std.log.warn("Unexpected facing {}", .{self.facing});
|
||||||
|
unreachable;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
self.update(c, value);
|
||||||
|
},
|
||||||
|
else => {
|
||||||
|
std.log.warn("Unknown command: '{}'", .{command});
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn manhattan_distance_from(self: *ShipPosition, from: [2]i64) u64 {
|
||||||
|
return (std.math.absCast(self.position[0] - from[0])) +
|
||||||
|
(std.math.absCast(self.position[1] - from [1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update_part2(self: *ShipPosition, command: u8, value: i64) void {
|
||||||
|
switch(command) {
|
||||||
|
'N' => {
|
||||||
|
self.waypoint[1] += value;
|
||||||
|
},
|
||||||
|
'S' => {
|
||||||
|
self.waypoint[1] -= value;
|
||||||
|
},
|
||||||
|
'E' => {
|
||||||
|
self.waypoint[0] += value;
|
||||||
|
},
|
||||||
|
'W' => {
|
||||||
|
self.waypoint[0] -= value;
|
||||||
|
},
|
||||||
|
'R' => {
|
||||||
|
// Rotate around the ship
|
||||||
|
self.waypoint = rotate_point(self.waypoint, -value);
|
||||||
|
},
|
||||||
|
'L' => {
|
||||||
|
// Rotate around the ship
|
||||||
|
self.waypoint = rotate_point(self.waypoint, value);
|
||||||
|
},
|
||||||
|
'F' => {
|
||||||
|
// For forward value times towards the waypoint.
|
||||||
|
self.position[0] += self.waypoint[0] * value;
|
||||||
|
self.position[1] += self.waypoint[1] * value;
|
||||||
|
// Waypoint stays relative to ship
|
||||||
|
//self.waypoint[0] = self.position[0] + self.waypoint[0];
|
||||||
|
//self.waypoint[1] = self.position[1] + self.waypoint[1];
|
||||||
|
},
|
||||||
|
else => {
|
||||||
|
std.log.warn("Unknown command: '{}'", .{command});
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn rotate_point(point: [2]i64, degrees: i64) [2]i64 {
|
||||||
|
var radians : f64 = (@intToFloat(f64, degrees) * std.math.pi) / 180.0;
|
||||||
|
var old_x = @intToFloat(f64, point[0]);
|
||||||
|
var old_y = @intToFloat(f64, point[1]);
|
||||||
|
var x : f64 = old_x * std.math.cos(radians) - old_y * std.math.sin(radians);
|
||||||
|
var y : f64 = old_y * std.math.cos(radians) + old_x * std.math.sin(radians);
|
||||||
|
return [2]i64 {
|
||||||
|
@floatToInt(i64, std.math.round(x)),
|
||||||
|
@floatToInt(i64, std.math.round(y)),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
test "part_one" {
|
||||||
|
var data = [_][]const u8 {
|
||||||
|
"F10",
|
||||||
|
"N3",
|
||||||
|
"F7",
|
||||||
|
"R90",
|
||||||
|
"F11",
|
||||||
|
};
|
||||||
|
var ship = ShipPosition{};
|
||||||
|
for (data) |d| {
|
||||||
|
ship.update(d[0], try std.fmt.parseInt(i64, d[1..], 10));
|
||||||
|
}
|
||||||
|
std.testing.expectEqual(ship.position[0], 17);
|
||||||
|
std.testing.expectEqual(ship.position[1], -8);
|
||||||
|
std.testing.expectEqual(ship.manhattan_distance_from([_]i64{0, 0}), 25);
|
||||||
|
}
|
||||||
|
|
||||||
|
test "part_two" {
|
||||||
|
var data = [_][]const u8 {
|
||||||
|
"F10",
|
||||||
|
"N3",
|
||||||
|
"F7",
|
||||||
|
"R90",
|
||||||
|
"F11",
|
||||||
|
};
|
||||||
|
var ship = ShipPosition{};
|
||||||
|
for (data) |d| {
|
||||||
|
ship.update_part2(d[0], try std.fmt.parseInt(i64, d[1..], 10));
|
||||||
|
std.log.warn("After '{}', ship at ({}, {}), with waypoint ({}, {})",
|
||||||
|
.{d, ship.position[0], ship.position[1],
|
||||||
|
ship.waypoint[0], ship.waypoint[1]});
|
||||||
|
}
|
||||||
|
std.testing.expectEqual(ship.position[0], 214);
|
||||||
|
std.testing.expectEqual(ship.position[1], -72);
|
||||||
|
std.testing.expectEqual(ship.manhattan_distance_from([_]i64{0, 0}), 286);
|
||||||
|
}
|
||||||
|
|
||||||
|
// test "rotate" {
|
||||||
|
// var point = [_]i64 {4,-3};
|
||||||
|
// var p = rotate_point(point, 90);
|
||||||
|
// std.testing.expectEqual(p[0], 3);
|
||||||
|
// std.testing.expectEqual(p[1], 4);
|
||||||
|
|
||||||
|
// p = rotate_point(point, 180);
|
||||||
|
// std.testing.expectEqual(p[0], -4);
|
||||||
|
// std.testing.expectEqual(p[1], 3);
|
||||||
|
|
||||||
|
// p = rotate_point(point, 270);
|
||||||
|
// std.testing.expectEqual(p[0], -4);
|
||||||
|
// std.testing.expectEqual(p[1], 3);
|
||||||
|
|
||||||
|
// }
|
Reference in New Issue