day12: solve part 1 & 2
This commit is contained in:
parent
ac9c3551f9
commit
a2fcbe9849
4 changed files with 1708 additions and 0 deletions
774
day12/part1/input
Normal file
774
day12/part1/input
Normal file
|
@ -0,0 +1,774 @@
|
|||
E2
|
||||
L180
|
||||
S4
|
||||
R90
|
||||
S1
|
||||
F49
|
||||
N2
|
||||
F18
|
||||
N2
|
||||
L180
|
||||
S5
|
||||
L90
|
||||
E3
|
||||
N2
|
||||
F11
|
||||
L180
|
||||
N5
|
||||
W3
|
||||
L180
|
||||
W2
|
||||
N5
|
||||
F80
|
||||
R90
|
||||
F89
|
||||
N1
|
||||
L180
|
||||
N2
|
||||
R180
|
||||
E4
|
||||
R90
|
||||
S1
|
||||
L90
|
||||
N5
|
||||
R180
|
||||
N2
|
||||
F17
|
||||
L90
|
||||
E2
|
||||
F58
|
||||
W5
|
||||
L90
|
||||
W3
|
||||
N3
|
||||
F78
|
||||
L90
|
||||
N4
|
||||
L90
|
||||
F15
|
||||
W1
|
||||
R90
|
||||
S1
|
||||
W4
|
||||
R90
|
||||
F41
|
||||
W4
|
||||
S4
|
||||
F37
|
||||
E5
|
||||
S1
|
||||
E3
|
||||
F19
|
||||
R90
|
||||
S1
|
||||
W4
|
||||
S2
|
||||
E2
|
||||
L180
|
||||
F51
|
||||
W5
|
||||
R90
|
||||
F76
|
||||
E2
|
||||
F40
|
||||
N4
|
||||
R180
|
||||
E5
|
||||
N3
|
||||
F72
|
||||
S4
|
||||
R90
|
||||
F99
|
||||
E3
|
||||
F76
|
||||
W5
|
||||
R90
|
||||
E2
|
||||
S5
|
||||
R180
|
||||
F76
|
||||
N4
|
||||
L180
|
||||
F10
|
||||
F83
|
||||
S1
|
||||
F46
|
||||
L90
|
||||
S5
|
||||
E1
|
||||
S1
|
||||
F14
|
||||
N4
|
||||
E1
|
||||
R180
|
||||
E1
|
||||
R180
|
||||
S3
|
||||
F52
|
||||
L90
|
||||
S4
|
||||
L90
|
||||
W3
|
||||
F18
|
||||
S2
|
||||
F81
|
||||
L180
|
||||
F76
|
||||
L180
|
||||
W1
|
||||
S2
|
||||
F73
|
||||
N2
|
||||
F77
|
||||
W1
|
||||
F28
|
||||
L180
|
||||
N2
|
||||
F76
|
||||
L180
|
||||
W5
|
||||
F61
|
||||
N4
|
||||
E2
|
||||
R180
|
||||
S2
|
||||
L90
|
||||
F14
|
||||
R180
|
||||
N5
|
||||
E4
|
||||
F11
|
||||
E1
|
||||
L90
|
||||
N3
|
||||
E3
|
||||
F58
|
||||
W3
|
||||
F72
|
||||
W1
|
||||
N2
|
||||
W5
|
||||
F44
|
||||
L90
|
||||
W4
|
||||
F37
|
||||
L90
|
||||
F4
|
||||
W5
|
||||
N3
|
||||
F57
|
||||
N4
|
||||
L90
|
||||
S2
|
||||
F43
|
||||
S4
|
||||
W3
|
||||
S5
|
||||
F84
|
||||
S2
|
||||
L90
|
||||
N1
|
||||
R180
|
||||
W3
|
||||
L180
|
||||
N2
|
||||
W3
|
||||
R90
|
||||
N2
|
||||
R90
|
||||
F66
|
||||
L90
|
||||
F73
|
||||
E4
|
||||
S2
|
||||
L270
|
||||
W2
|
||||
E2
|
||||
S4
|
||||
E1
|
||||
R90
|
||||
W1
|
||||
F49
|
||||
L270
|
||||
F70
|
||||
S3
|
||||
W1
|
||||
N2
|
||||
E1
|
||||
F65
|
||||
W3
|
||||
R90
|
||||
F27
|
||||
E5
|
||||
F80
|
||||
S4
|
||||
W5
|
||||
F68
|
||||
E5
|
||||
R90
|
||||
F94
|
||||
W2
|
||||
L90
|
||||
F37
|
||||
L180
|
||||
E1
|
||||
F38
|
||||
N2
|
||||
F15
|
||||
N4
|
||||
E3
|
||||
L90
|
||||
E1
|
||||
R90
|
||||
S1
|
||||
E5
|
||||
N4
|
||||
N2
|
||||
E4
|
||||
L270
|
||||
N4
|
||||
R90
|
||||
E1
|
||||
S4
|
||||
E4
|
||||
F71
|
||||
E2
|
||||
R180
|
||||
N5
|
||||
E3
|
||||
F17
|
||||
L90
|
||||
N2
|
||||
W1
|
||||
L90
|
||||
F62
|
||||
W1
|
||||
F85
|
||||
W1
|
||||
L180
|
||||
F33
|
||||
S4
|
||||
W1
|
||||
N5
|
||||
F81
|
||||
W2
|
||||
R90
|
||||
S2
|
||||
F49
|
||||
L180
|
||||
S5
|
||||
F4
|
||||
W4
|
||||
N3
|
||||
W1
|
||||
F17
|
||||
R90
|
||||
W4
|
||||
N4
|
||||
E4
|
||||
N3
|
||||
L90
|
||||
S2
|
||||
R90
|
||||
S3
|
||||
L90
|
||||
E4
|
||||
R90
|
||||
S5
|
||||
F88
|
||||
S1
|
||||
L180
|
||||
N5
|
||||
E5
|
||||
F55
|
||||
R90
|
||||
F81
|
||||
E5
|
||||
L180
|
||||
R90
|
||||
F55
|
||||
R90
|
||||
W5
|
||||
F13
|
||||
R90
|
||||
N5
|
||||
F58
|
||||
L180
|
||||
S5
|
||||
F27
|
||||
E4
|
||||
S3
|
||||
F42
|
||||
R90
|
||||
F39
|
||||
W3
|
||||
S3
|
||||
F31
|
||||
S4
|
||||
L90
|
||||
W1
|
||||
S3
|
||||
W3
|
||||
N4
|
||||
W2
|
||||
S3
|
||||
L90
|
||||
F61
|
||||
E1
|
||||
F23
|
||||
S2
|
||||
F31
|
||||
S3
|
||||
L180
|
||||
W1
|
||||
N1
|
||||
L90
|
||||
N3
|
||||
F81
|
||||
E2
|
||||
N1
|
||||
R90
|
||||
F64
|
||||
S4
|
||||
F88
|
||||
E1
|
||||
N5
|
||||
W1
|
||||
S3
|
||||
F10
|
||||
N5
|
||||
L90
|
||||
F58
|
||||
S1
|
||||
R90
|
||||
E3
|
||||
L90
|
||||
N4
|
||||
F94
|
||||
S1
|
||||
W1
|
||||
S4
|
||||
L90
|
||||
F51
|
||||
L180
|
||||
N4
|
||||
R90
|
||||
L90
|
||||
N4
|
||||
F66
|
||||
W2
|
||||
S3
|
||||
S3
|
||||
W4
|
||||
F68
|
||||
L90
|
||||
F42
|
||||
E1
|
||||
F43
|
||||
R90
|
||||
N3
|
||||
F20
|
||||
E1
|
||||
N3
|
||||
E4
|
||||
N3
|
||||
F4
|
||||
S4
|
||||
R180
|
||||
W1
|
||||
R270
|
||||
N3
|
||||
F86
|
||||
L90
|
||||
E5
|
||||
F84
|
||||
N3
|
||||
W3
|
||||
F16
|
||||
L90
|
||||
N2
|
||||
E3
|
||||
L90
|
||||
S5
|
||||
E5
|
||||
F53
|
||||
L270
|
||||
N2
|
||||
F91
|
||||
R90
|
||||
E5
|
||||
N4
|
||||
F57
|
||||
E5
|
||||
S5
|
||||
F61
|
||||
S4
|
||||
F89
|
||||
E3
|
||||
N3
|
||||
N5
|
||||
F3
|
||||
S5
|
||||
F59
|
||||
E5
|
||||
F66
|
||||
R180
|
||||
S1
|
||||
W1
|
||||
N2
|
||||
R180
|
||||
S4
|
||||
E2
|
||||
L90
|
||||
N1
|
||||
W2
|
||||
F13
|
||||
L90
|
||||
E5
|
||||
F6
|
||||
W3
|
||||
F78
|
||||
E1
|
||||
F7
|
||||
W1
|
||||
N4
|
||||
W5
|
||||
F58
|
||||
R90
|
||||
E4
|
||||
N3
|
||||
E5
|
||||
N3
|
||||
W1
|
||||
S3
|
||||
R90
|
||||
F16
|
||||
L90
|
||||
F93
|
||||
R270
|
||||
N5
|
||||
F2
|
||||
W1
|
||||
S3
|
||||
F54
|
||||
R270
|
||||
F18
|
||||
R180
|
||||
F95
|
||||
L90
|
||||
W1
|
||||
E4
|
||||
N2
|
||||
W1
|
||||
L90
|
||||
S2
|
||||
L90
|
||||
W2
|
||||
S4
|
||||
F92
|
||||
W2
|
||||
S3
|
||||
R180
|
||||
N5
|
||||
E3
|
||||
N5
|
||||
E5
|
||||
F22
|
||||
F88
|
||||
S3
|
||||
E2
|
||||
R90
|
||||
S5
|
||||
W1
|
||||
L90
|
||||
E4
|
||||
F77
|
||||
N1
|
||||
W3
|
||||
F14
|
||||
E3
|
||||
R90
|
||||
W1
|
||||
F21
|
||||
N1
|
||||
F58
|
||||
W4
|
||||
N2
|
||||
R90
|
||||
N2
|
||||
W4
|
||||
F68
|
||||
W5
|
||||
N3
|
||||
L90
|
||||
F22
|
||||
R90
|
||||
F90
|
||||
F84
|
||||
S5
|
||||
F30
|
||||
N1
|
||||
W4
|
||||
R90
|
||||
F17
|
||||
R90
|
||||
W4
|
||||
S5
|
||||
E2
|
||||
N1
|
||||
F92
|
||||
N2
|
||||
R180
|
||||
N5
|
||||
E2
|
||||
R90
|
||||
F38
|
||||
R90
|
||||
F15
|
||||
E5
|
||||
N4
|
||||
N4
|
||||
E4
|
||||
S4
|
||||
F92
|
||||
R90
|
||||
F22
|
||||
S3
|
||||
W4
|
||||
N3
|
||||
E1
|
||||
R180
|
||||
F96
|
||||
L90
|
||||
E1
|
||||
N1
|
||||
F9
|
||||
W2
|
||||
N4
|
||||
F17
|
||||
N2
|
||||
R90
|
||||
F76
|
||||
S2
|
||||
F5
|
||||
S5
|
||||
F34
|
||||
R90
|
||||
F7
|
||||
N4
|
||||
F83
|
||||
N5
|
||||
L90
|
||||
W1
|
||||
S3
|
||||
R90
|
||||
S3
|
||||
W2
|
||||
S3
|
||||
F51
|
||||
N5
|
||||
W4
|
||||
F8
|
||||
E3
|
||||
F10
|
||||
N5
|
||||
F39
|
||||
S3
|
||||
E2
|
||||
L90
|
||||
E5
|
||||
L90
|
||||
N5
|
||||
E2
|
||||
N3
|
||||
F42
|
||||
S3
|
||||
F38
|
||||
N5
|
||||
F19
|
||||
F97
|
||||
W2
|
||||
R180
|
||||
S4
|
||||
E4
|
||||
S2
|
||||
W3
|
||||
F39
|
||||
W4
|
||||
F70
|
||||
S1
|
||||
W1
|
||||
R90
|
||||
F41
|
||||
L90
|
||||
E1
|
||||
N1
|
||||
E3
|
||||
W5
|
||||
F13
|
||||
E4
|
||||
F2
|
||||
R180
|
||||
F27
|
||||
E4
|
||||
N2
|
||||
L270
|
||||
E1
|
||||
N3
|
||||
W4
|
||||
F81
|
||||
W3
|
||||
R90
|
||||
E1
|
||||
F57
|
||||
S5
|
||||
R90
|
||||
F13
|
||||
L180
|
||||
N5
|
||||
F98
|
||||
F32
|
||||
N3
|
||||
R90
|
||||
N3
|
||||
W3
|
||||
S3
|
||||
W3
|
||||
N4
|
||||
F73
|
||||
L180
|
||||
N1
|
||||
E4
|
||||
F7
|
||||
E4
|
||||
R90
|
||||
N4
|
||||
R90
|
||||
S2
|
||||
E5
|
||||
F32
|
||||
S2
|
||||
N5
|
||||
W3
|
||||
R90
|
||||
W5
|
||||
S2
|
||||
L90
|
||||
F4
|
||||
R270
|
||||
N5
|
||||
E3
|
||||
L90
|
||||
S5
|
||||
F24
|
||||
N4
|
||||
R90
|
||||
F27
|
||||
L90
|
||||
F16
|
||||
R90
|
||||
N2
|
||||
R90
|
||||
N3
|
||||
L90
|
||||
S3
|
||||
L90
|
||||
F85
|
||||
S3
|
||||
F47
|
||||
N1
|
||||
E1
|
||||
N3
|
||||
R270
|
||||
S2
|
||||
L90
|
||||
F50
|
||||
L90
|
||||
S2
|
||||
F23
|
||||
N4
|
||||
L180
|
||||
E3
|
||||
F91
|
||||
R90
|
||||
E1
|
||||
W4
|
||||
F81
|
||||
W5
|
||||
R90
|
||||
F46
|
||||
E1
|
||||
W1
|
||||
F91
|
||||
N5
|
||||
W5
|
||||
N3
|
||||
W1
|
||||
L90
|
||||
F60
|
||||
S2
|
||||
L90
|
||||
E1
|
||||
F82
|
||||
S3
|
||||
W5
|
||||
N5
|
||||
F90
|
||||
E3
|
||||
S1
|
||||
F61
|
||||
E4
|
||||
F98
|
||||
R180
|
||||
F8
|
||||
R270
|
||||
F73
|
||||
W4
|
||||
L90
|
||||
W5
|
||||
L90
|
||||
F86
|
||||
W5
|
||||
L180
|
||||
F61
|
||||
N5
|
||||
F88
|
||||
E2
|
||||
L270
|
||||
F90
|
||||
N5
|
||||
F21
|
||||
R270
|
||||
F40
|
||||
L90
|
||||
W1
|
||||
N2
|
||||
L90
|
||||
E2
|
||||
S5
|
||||
E2
|
||||
S1
|
||||
E5
|
||||
N3
|
||||
F51
|
||||
S1
|
||||
F58
|
||||
W3
|
||||
L180
|
||||
F13
|
||||
R90
|
||||
N1
|
||||
F79
|
||||
W2
|
||||
F61
|
||||
R90
|
||||
F22
|
||||
E2
|
||||
N5
|
||||
F1
|
||||
S4
|
||||
F99
|
||||
S1
|
||||
S3
|
||||
E2
|
||||
F97
|
89
day12/part1/main.d
Normal file
89
day12/part1/main.d
Normal file
|
@ -0,0 +1,89 @@
|
|||
import std;
|
||||
|
||||
void main()
|
||||
{
|
||||
slurp!(char, ulong)("input", "%c%d").getManhattanDistanceForInstructions.writeln;
|
||||
}
|
||||
|
||||
enum Direction
|
||||
{
|
||||
east = 0,
|
||||
north = 1,
|
||||
west = 2,
|
||||
south = 3
|
||||
}
|
||||
|
||||
alias Instruction = Tuple!(char, ulong);
|
||||
|
||||
struct ShipState
|
||||
{
|
||||
immutable long posX = 0;
|
||||
immutable long posY = 0;
|
||||
immutable Direction direction = Direction.east;
|
||||
|
||||
private auto calculateXMovement(Direction direction, ulong value)
|
||||
{
|
||||
switch (direction) with (Direction)
|
||||
{
|
||||
case east:
|
||||
return value;
|
||||
case west:
|
||||
return -value;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
private auto calculateYMovement(Direction direction, ulong value)
|
||||
{
|
||||
switch (direction) with (Direction)
|
||||
{
|
||||
case north:
|
||||
return value;
|
||||
case south:
|
||||
return -value;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
ShipState withInstructionApplied(Instruction instruction)
|
||||
{
|
||||
return [
|
||||
'E': (ulong value) => ShipState(posX + value, posY, direction),
|
||||
'N': (ulong value) => ShipState(posX, posY + value, direction),
|
||||
'W': (ulong value) => ShipState(posX - value, posY, direction),
|
||||
'S': (ulong value) => ShipState(posX, posY - value, direction),
|
||||
'L': (ulong value) => ShipState(posX, posY,
|
||||
((direction + value / 90) % 4).to!Direction),
|
||||
'R': (ulong value) => ShipState(posX, posY,
|
||||
((direction - value / 90 + 4) % 4).to!Direction),
|
||||
'F': (ulong value) => ShipState(posX + calculateXMovement(direction,
|
||||
value), posY + calculateYMovement(direction, value), direction)
|
||||
][instruction[0]](instruction[1]);
|
||||
}
|
||||
|
||||
ShipState withInstructionsApplied(Instruction[] instructions)
|
||||
{
|
||||
if (instructions.empty)
|
||||
{
|
||||
return this;
|
||||
}
|
||||
return withInstructionApplied(instructions[0]).withInstructionsApplied(instructions[1 .. $]);
|
||||
}
|
||||
}
|
||||
|
||||
auto getManhattanDistanceForInstructions(Instruction[] instructions)
|
||||
{
|
||||
auto finalState = ShipState().withInstructionsApplied(instructions);
|
||||
return abs(finalState.posX) + abs(finalState.posY);
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
auto input = [
|
||||
tuple('F', 10UL), tuple('N', 3UL), tuple('F', 7UL), tuple('R', 90UL),
|
||||
tuple('F', 11UL)
|
||||
];
|
||||
assert(input.getManhattanDistanceForInstructions == 25);
|
||||
}
|
774
day12/part2/input
Normal file
774
day12/part2/input
Normal file
|
@ -0,0 +1,774 @@
|
|||
E2
|
||||
L180
|
||||
S4
|
||||
R90
|
||||
S1
|
||||
F49
|
||||
N2
|
||||
F18
|
||||
N2
|
||||
L180
|
||||
S5
|
||||
L90
|
||||
E3
|
||||
N2
|
||||
F11
|
||||
L180
|
||||
N5
|
||||
W3
|
||||
L180
|
||||
W2
|
||||
N5
|
||||
F80
|
||||
R90
|
||||
F89
|
||||
N1
|
||||
L180
|
||||
N2
|
||||
R180
|
||||
E4
|
||||
R90
|
||||
S1
|
||||
L90
|
||||
N5
|
||||
R180
|
||||
N2
|
||||
F17
|
||||
L90
|
||||
E2
|
||||
F58
|
||||
W5
|
||||
L90
|
||||
W3
|
||||
N3
|
||||
F78
|
||||
L90
|
||||
N4
|
||||
L90
|
||||
F15
|
||||
W1
|
||||
R90
|
||||
S1
|
||||
W4
|
||||
R90
|
||||
F41
|
||||
W4
|
||||
S4
|
||||
F37
|
||||
E5
|
||||
S1
|
||||
E3
|
||||
F19
|
||||
R90
|
||||
S1
|
||||
W4
|
||||
S2
|
||||
E2
|
||||
L180
|
||||
F51
|
||||
W5
|
||||
R90
|
||||
F76
|
||||
E2
|
||||
F40
|
||||
N4
|
||||
R180
|
||||
E5
|
||||
N3
|
||||
F72
|
||||
S4
|
||||
R90
|
||||
F99
|
||||
E3
|
||||
F76
|
||||
W5
|
||||
R90
|
||||
E2
|
||||
S5
|
||||
R180
|
||||
F76
|
||||
N4
|
||||
L180
|
||||
F10
|
||||
F83
|
||||
S1
|
||||
F46
|
||||
L90
|
||||
S5
|
||||
E1
|
||||
S1
|
||||
F14
|
||||
N4
|
||||
E1
|
||||
R180
|
||||
E1
|
||||
R180
|
||||
S3
|
||||
F52
|
||||
L90
|
||||
S4
|
||||
L90
|
||||
W3
|
||||
F18
|
||||
S2
|
||||
F81
|
||||
L180
|
||||
F76
|
||||
L180
|
||||
W1
|
||||
S2
|
||||
F73
|
||||
N2
|
||||
F77
|
||||
W1
|
||||
F28
|
||||
L180
|
||||
N2
|
||||
F76
|
||||
L180
|
||||
W5
|
||||
F61
|
||||
N4
|
||||
E2
|
||||
R180
|
||||
S2
|
||||
L90
|
||||
F14
|
||||
R180
|
||||
N5
|
||||
E4
|
||||
F11
|
||||
E1
|
||||
L90
|
||||
N3
|
||||
E3
|
||||
F58
|
||||
W3
|
||||
F72
|
||||
W1
|
||||
N2
|
||||
W5
|
||||
F44
|
||||
L90
|
||||
W4
|
||||
F37
|
||||
L90
|
||||
F4
|
||||
W5
|
||||
N3
|
||||
F57
|
||||
N4
|
||||
L90
|
||||
S2
|
||||
F43
|
||||
S4
|
||||
W3
|
||||
S5
|
||||
F84
|
||||
S2
|
||||
L90
|
||||
N1
|
||||
R180
|
||||
W3
|
||||
L180
|
||||
N2
|
||||
W3
|
||||
R90
|
||||
N2
|
||||
R90
|
||||
F66
|
||||
L90
|
||||
F73
|
||||
E4
|
||||
S2
|
||||
L270
|
||||
W2
|
||||
E2
|
||||
S4
|
||||
E1
|
||||
R90
|
||||
W1
|
||||
F49
|
||||
L270
|
||||
F70
|
||||
S3
|
||||
W1
|
||||
N2
|
||||
E1
|
||||
F65
|
||||
W3
|
||||
R90
|
||||
F27
|
||||
E5
|
||||
F80
|
||||
S4
|
||||
W5
|
||||
F68
|
||||
E5
|
||||
R90
|
||||
F94
|
||||
W2
|
||||
L90
|
||||
F37
|
||||
L180
|
||||
E1
|
||||
F38
|
||||
N2
|
||||
F15
|
||||
N4
|
||||
E3
|
||||
L90
|
||||
E1
|
||||
R90
|
||||
S1
|
||||
E5
|
||||
N4
|
||||
N2
|
||||
E4
|
||||
L270
|
||||
N4
|
||||
R90
|
||||
E1
|
||||
S4
|
||||
E4
|
||||
F71
|
||||
E2
|
||||
R180
|
||||
N5
|
||||
E3
|
||||
F17
|
||||
L90
|
||||
N2
|
||||
W1
|
||||
L90
|
||||
F62
|
||||
W1
|
||||
F85
|
||||
W1
|
||||
L180
|
||||
F33
|
||||
S4
|
||||
W1
|
||||
N5
|
||||
F81
|
||||
W2
|
||||
R90
|
||||
S2
|
||||
F49
|
||||
L180
|
||||
S5
|
||||
F4
|
||||
W4
|
||||
N3
|
||||
W1
|
||||
F17
|
||||
R90
|
||||
W4
|
||||
N4
|
||||
E4
|
||||
N3
|
||||
L90
|
||||
S2
|
||||
R90
|
||||
S3
|
||||
L90
|
||||
E4
|
||||
R90
|
||||
S5
|
||||
F88
|
||||
S1
|
||||
L180
|
||||
N5
|
||||
E5
|
||||
F55
|
||||
R90
|
||||
F81
|
||||
E5
|
||||
L180
|
||||
R90
|
||||
F55
|
||||
R90
|
||||
W5
|
||||
F13
|
||||
R90
|
||||
N5
|
||||
F58
|
||||
L180
|
||||
S5
|
||||
F27
|
||||
E4
|
||||
S3
|
||||
F42
|
||||
R90
|
||||
F39
|
||||
W3
|
||||
S3
|
||||
F31
|
||||
S4
|
||||
L90
|
||||
W1
|
||||
S3
|
||||
W3
|
||||
N4
|
||||
W2
|
||||
S3
|
||||
L90
|
||||
F61
|
||||
E1
|
||||
F23
|
||||
S2
|
||||
F31
|
||||
S3
|
||||
L180
|
||||
W1
|
||||
N1
|
||||
L90
|
||||
N3
|
||||
F81
|
||||
E2
|
||||
N1
|
||||
R90
|
||||
F64
|
||||
S4
|
||||
F88
|
||||
E1
|
||||
N5
|
||||
W1
|
||||
S3
|
||||
F10
|
||||
N5
|
||||
L90
|
||||
F58
|
||||
S1
|
||||
R90
|
||||
E3
|
||||
L90
|
||||
N4
|
||||
F94
|
||||
S1
|
||||
W1
|
||||
S4
|
||||
L90
|
||||
F51
|
||||
L180
|
||||
N4
|
||||
R90
|
||||
L90
|
||||
N4
|
||||
F66
|
||||
W2
|
||||
S3
|
||||
S3
|
||||
W4
|
||||
F68
|
||||
L90
|
||||
F42
|
||||
E1
|
||||
F43
|
||||
R90
|
||||
N3
|
||||
F20
|
||||
E1
|
||||
N3
|
||||
E4
|
||||
N3
|
||||
F4
|
||||
S4
|
||||
R180
|
||||
W1
|
||||
R270
|
||||
N3
|
||||
F86
|
||||
L90
|
||||
E5
|
||||
F84
|
||||
N3
|
||||
W3
|
||||
F16
|
||||
L90
|
||||
N2
|
||||
E3
|
||||
L90
|
||||
S5
|
||||
E5
|
||||
F53
|
||||
L270
|
||||
N2
|
||||
F91
|
||||
R90
|
||||
E5
|
||||
N4
|
||||
F57
|
||||
E5
|
||||
S5
|
||||
F61
|
||||
S4
|
||||
F89
|
||||
E3
|
||||
N3
|
||||
N5
|
||||
F3
|
||||
S5
|
||||
F59
|
||||
E5
|
||||
F66
|
||||
R180
|
||||
S1
|
||||
W1
|
||||
N2
|
||||
R180
|
||||
S4
|
||||
E2
|
||||
L90
|
||||
N1
|
||||
W2
|
||||
F13
|
||||
L90
|
||||
E5
|
||||
F6
|
||||
W3
|
||||
F78
|
||||
E1
|
||||
F7
|
||||
W1
|
||||
N4
|
||||
W5
|
||||
F58
|
||||
R90
|
||||
E4
|
||||
N3
|
||||
E5
|
||||
N3
|
||||
W1
|
||||
S3
|
||||
R90
|
||||
F16
|
||||
L90
|
||||
F93
|
||||
R270
|
||||
N5
|
||||
F2
|
||||
W1
|
||||
S3
|
||||
F54
|
||||
R270
|
||||
F18
|
||||
R180
|
||||
F95
|
||||
L90
|
||||
W1
|
||||
E4
|
||||
N2
|
||||
W1
|
||||
L90
|
||||
S2
|
||||
L90
|
||||
W2
|
||||
S4
|
||||
F92
|
||||
W2
|
||||
S3
|
||||
R180
|
||||
N5
|
||||
E3
|
||||
N5
|
||||
E5
|
||||
F22
|
||||
F88
|
||||
S3
|
||||
E2
|
||||
R90
|
||||
S5
|
||||
W1
|
||||
L90
|
||||
E4
|
||||
F77
|
||||
N1
|
||||
W3
|
||||
F14
|
||||
E3
|
||||
R90
|
||||
W1
|
||||
F21
|
||||
N1
|
||||
F58
|
||||
W4
|
||||
N2
|
||||
R90
|
||||
N2
|
||||
W4
|
||||
F68
|
||||
W5
|
||||
N3
|
||||
L90
|
||||
F22
|
||||
R90
|
||||
F90
|
||||
F84
|
||||
S5
|
||||
F30
|
||||
N1
|
||||
W4
|
||||
R90
|
||||
F17
|
||||
R90
|
||||
W4
|
||||
S5
|
||||
E2
|
||||
N1
|
||||
F92
|
||||
N2
|
||||
R180
|
||||
N5
|
||||
E2
|
||||
R90
|
||||
F38
|
||||
R90
|
||||
F15
|
||||
E5
|
||||
N4
|
||||
N4
|
||||
E4
|
||||
S4
|
||||
F92
|
||||
R90
|
||||
F22
|
||||
S3
|
||||
W4
|
||||
N3
|
||||
E1
|
||||
R180
|
||||
F96
|
||||
L90
|
||||
E1
|
||||
N1
|
||||
F9
|
||||
W2
|
||||
N4
|
||||
F17
|
||||
N2
|
||||
R90
|
||||
F76
|
||||
S2
|
||||
F5
|
||||
S5
|
||||
F34
|
||||
R90
|
||||
F7
|
||||
N4
|
||||
F83
|
||||
N5
|
||||
L90
|
||||
W1
|
||||
S3
|
||||
R90
|
||||
S3
|
||||
W2
|
||||
S3
|
||||
F51
|
||||
N5
|
||||
W4
|
||||
F8
|
||||
E3
|
||||
F10
|
||||
N5
|
||||
F39
|
||||
S3
|
||||
E2
|
||||
L90
|
||||
E5
|
||||
L90
|
||||
N5
|
||||
E2
|
||||
N3
|
||||
F42
|
||||
S3
|
||||
F38
|
||||
N5
|
||||
F19
|
||||
F97
|
||||
W2
|
||||
R180
|
||||
S4
|
||||
E4
|
||||
S2
|
||||
W3
|
||||
F39
|
||||
W4
|
||||
F70
|
||||
S1
|
||||
W1
|
||||
R90
|
||||
F41
|
||||
L90
|
||||
E1
|
||||
N1
|
||||
E3
|
||||
W5
|
||||
F13
|
||||
E4
|
||||
F2
|
||||
R180
|
||||
F27
|
||||
E4
|
||||
N2
|
||||
L270
|
||||
E1
|
||||
N3
|
||||
W4
|
||||
F81
|
||||
W3
|
||||
R90
|
||||
E1
|
||||
F57
|
||||
S5
|
||||
R90
|
||||
F13
|
||||
L180
|
||||
N5
|
||||
F98
|
||||
F32
|
||||
N3
|
||||
R90
|
||||
N3
|
||||
W3
|
||||
S3
|
||||
W3
|
||||
N4
|
||||
F73
|
||||
L180
|
||||
N1
|
||||
E4
|
||||
F7
|
||||
E4
|
||||
R90
|
||||
N4
|
||||
R90
|
||||
S2
|
||||
E5
|
||||
F32
|
||||
S2
|
||||
N5
|
||||
W3
|
||||
R90
|
||||
W5
|
||||
S2
|
||||
L90
|
||||
F4
|
||||
R270
|
||||
N5
|
||||
E3
|
||||
L90
|
||||
S5
|
||||
F24
|
||||
N4
|
||||
R90
|
||||
F27
|
||||
L90
|
||||
F16
|
||||
R90
|
||||
N2
|
||||
R90
|
||||
N3
|
||||
L90
|
||||
S3
|
||||
L90
|
||||
F85
|
||||
S3
|
||||
F47
|
||||
N1
|
||||
E1
|
||||
N3
|
||||
R270
|
||||
S2
|
||||
L90
|
||||
F50
|
||||
L90
|
||||
S2
|
||||
F23
|
||||
N4
|
||||
L180
|
||||
E3
|
||||
F91
|
||||
R90
|
||||
E1
|
||||
W4
|
||||
F81
|
||||
W5
|
||||
R90
|
||||
F46
|
||||
E1
|
||||
W1
|
||||
F91
|
||||
N5
|
||||
W5
|
||||
N3
|
||||
W1
|
||||
L90
|
||||
F60
|
||||
S2
|
||||
L90
|
||||
E1
|
||||
F82
|
||||
S3
|
||||
W5
|
||||
N5
|
||||
F90
|
||||
E3
|
||||
S1
|
||||
F61
|
||||
E4
|
||||
F98
|
||||
R180
|
||||
F8
|
||||
R270
|
||||
F73
|
||||
W4
|
||||
L90
|
||||
W5
|
||||
L90
|
||||
F86
|
||||
W5
|
||||
L180
|
||||
F61
|
||||
N5
|
||||
F88
|
||||
E2
|
||||
L270
|
||||
F90
|
||||
N5
|
||||
F21
|
||||
R270
|
||||
F40
|
||||
L90
|
||||
W1
|
||||
N2
|
||||
L90
|
||||
E2
|
||||
S5
|
||||
E2
|
||||
S1
|
||||
E5
|
||||
N3
|
||||
F51
|
||||
S1
|
||||
F58
|
||||
W3
|
||||
L180
|
||||
F13
|
||||
R90
|
||||
N1
|
||||
F79
|
||||
W2
|
||||
F61
|
||||
R90
|
||||
F22
|
||||
E2
|
||||
N5
|
||||
F1
|
||||
S4
|
||||
F99
|
||||
S1
|
||||
S3
|
||||
E2
|
||||
F97
|
71
day12/part2/main.d
Normal file
71
day12/part2/main.d
Normal file
|
@ -0,0 +1,71 @@
|
|||
import std;
|
||||
|
||||
void main()
|
||||
{
|
||||
slurp!(char, long)("input", "%c%d").getManhattanDistanceForInstructions.writeln;
|
||||
}
|
||||
|
||||
alias Instruction = Tuple!(char, long);
|
||||
|
||||
alias RelativeWaypoint = Tuple!(long, long);
|
||||
|
||||
auto rotateLeft(RelativeWaypoint relativeWaypoint, long n)
|
||||
{
|
||||
n = (n + 4) % 4;
|
||||
if (n == 0)
|
||||
return relativeWaypoint;
|
||||
|
||||
return tuple(-relativeWaypoint[1], relativeWaypoint[0]).rotateLeft(n - 1);
|
||||
}
|
||||
|
||||
struct ShipState
|
||||
{
|
||||
immutable long posX = 0;
|
||||
immutable long posY = 0;
|
||||
|
||||
RelativeWaypoint relativeWaypoint = tuple(10, 1);
|
||||
|
||||
ShipState withInstructionApplied(Instruction instruction)
|
||||
{
|
||||
return [
|
||||
'E': (long value) => ShipState(posX, posY,
|
||||
tuple(relativeWaypoint[0] + value, relativeWaypoint[1])),
|
||||
'N': (long value) => ShipState(posX, posY,
|
||||
tuple(relativeWaypoint[0], relativeWaypoint[1] + value)),
|
||||
'W': (long value) => ShipState(posX, posY,
|
||||
tuple(relativeWaypoint[0] - value, relativeWaypoint[1])),
|
||||
'S': (long value) => ShipState(posX, posY,
|
||||
tuple(relativeWaypoint[0], relativeWaypoint[1] - value)),
|
||||
'L': (long value) => ShipState(posX, posY,
|
||||
relativeWaypoint.rotateLeft(value / 90)),
|
||||
'R': (long value) => ShipState(posX, posY,
|
||||
relativeWaypoint.rotateLeft((360 - value) / 90)),
|
||||
'F': (long value) => ShipState(posX + relativeWaypoint[0] * value,
|
||||
posY + relativeWaypoint[1] * value, relativeWaypoint)
|
||||
][instruction[0]](instruction[1]);
|
||||
}
|
||||
|
||||
ShipState withInstructionsApplied(Instruction[] instructions)
|
||||
{
|
||||
if (instructions.empty)
|
||||
{
|
||||
return this;
|
||||
}
|
||||
return withInstructionApplied(instructions[0]).withInstructionsApplied(instructions[1 .. $]);
|
||||
}
|
||||
}
|
||||
|
||||
auto getManhattanDistanceForInstructions(Instruction[] instructions)
|
||||
{
|
||||
auto finalState = ShipState().withInstructionsApplied(instructions);
|
||||
return abs(finalState.posX) + abs(finalState.posY);
|
||||
}
|
||||
|
||||
unittest
|
||||
{
|
||||
auto input = [
|
||||
tuple('F', 10L), tuple('N', 3L), tuple('F', 7L), tuple('R', 90L),
|
||||
tuple('F', 11L)
|
||||
];
|
||||
assert(input.getManhattanDistanceForInstructions == 286);
|
||||
}
|
Loading…
Reference in a new issue