-
Notifications
You must be signed in to change notification settings - Fork 0
/
AdventOfCode - Day12.2.ps1
52 lines (46 loc) · 1.48 KB
/
AdventOfCode - Day12.2.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
$moves = new-object System.Collections.ArrayList
Get-Content -Path '.\ferry moves day 12.txt' | ForEach-OBject {
if ($_ -match "([N|S|E|W|L|R|F])(\d+)") {
$move = New-Object -TypeName PSObject -Property @{
'Action'=$Matches[1];
'Distance'=[int]$Matches[2];
}
$moves += $move
}
}
function rotateWayPoint($direction, [ref] $horizontal, [ref] $vertical) {
if ($direction -eq 'R') {
$tmp = $horizontal.Value
$horizontal.Value = $vertical.Value
$vertical.Value = -1 * $tmp
} else {
$tmp = $horizontal.Value
$horizontal.Value = -1 * $vertical.Value
$vertical.Value = $tmp
}
}
$shipHorizontal = 0
$shipVertical = 0
$wpHorizontal = 10
$wpVertical = 1
foreach ($move in $moves) {
switch ($move.Action) {
'N' { $wpVertical += $move.Distance }
'S' { $wpVertical -= $move.Distance }
'E' { $wpHorizontal += $move.Distance }
'W' { $wpHorizontal -= $move.Distance }
'F' {
$shipHorizontal += $wpHorizontal * $move.Distance
$shipVertical += $wpVertical * $move.Distance
}
'R' { for ($i = 0; $i -lt $move.Distance / 90; $i++) {
rotateWaypoint $move.Action ([ref] $wpHorizontal) ([ref]$wpVertical)
}
}
'L' { for ($i = 0; $i -lt $move.Distance / 90; $i++) {
rotateWaypoint $move.Action ([ref] $wpHorizontal) ([ref] $wpVertical)
}
}
}
}
[Math]::Abs($shipVertical) + [Math]::Abs($shipHorizontal)