parent
7f190fbc74
commit
88d59773bf
@ -0,0 +1,155 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
|
||||||
|
from aoc import get_input # AoC |
||||||
|
import re # regex |
||||||
|
|
||||||
|
navigation = get_input(12).splitlines() |
||||||
|
|
||||||
|
def parseNav(nav): |
||||||
|
regex = r"^([A-Z]{1})([0-9]+)$" |
||||||
|
return re.match(regex, nav).groups() |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
boatfacing = "E" # start facing east |
||||||
|
boatfacingClock = ["E", "S", "W", "N"] |
||||||
|
boatfacingIndex = 0 |
||||||
|
|
||||||
|
boatpos = { |
||||||
|
"N": 0, |
||||||
|
"E": 0 |
||||||
|
} |
||||||
|
|
||||||
|
boatpos2 = { |
||||||
|
"N": 0, |
||||||
|
"E": 0 |
||||||
|
} |
||||||
|
waypoint = { |
||||||
|
"N": 1, |
||||||
|
"E": 10, |
||||||
|
"S": 0, |
||||||
|
"W": 0 |
||||||
|
} |
||||||
|
pointkeys = "N E S W".split(" ") |
||||||
|
|
||||||
|
# W = - E |
||||||
|
# S = - N |
||||||
|
|
||||||
|
def copyList(lst): |
||||||
|
return [elem for elem in lst] |
||||||
|
|
||||||
|
def move(dist, di): |
||||||
|
pos[di] += dist |
||||||
|
|
||||||
|
def rotate( deg, boatclock, face ): |
||||||
|
clock = copyList(boatclock) |
||||||
|
clocklen = len(clock) |
||||||
|
|
||||||
|
facei = clock.index(face) |
||||||
|
rots = int(deg / 90) |
||||||
|
|
||||||
|
facei += rots |
||||||
|
|
||||||
|
while(facei < 0): |
||||||
|
facei += clocklen |
||||||
|
|
||||||
|
|
||||||
|
facei = facei % clocklen |
||||||
|
face = clock[facei] |
||||||
|
return face |
||||||
|
|
||||||
|
|
||||||
|
from collections import OrderedDict |
||||||
|
from itertools import islice, cycle |
||||||
|
|
||||||
|
|
||||||
|
def shift_dict(dct, shift): |
||||||
|
shift %= len(dct) |
||||||
|
return OrderedDict( |
||||||
|
(k, v) |
||||||
|
for k, v in zip(dct.keys(), islice(cycle(dct.values()), shift, None)) |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def calcDistance(pos): |
||||||
|
dist = 0 |
||||||
|
for direction, units in pos.items(): |
||||||
|
dist += abs(units) |
||||||
|
|
||||||
|
return dist |
||||||
|
|
||||||
|
def runNav(nav, pos, facing, facingClock, facingIndex): |
||||||
|
na, num = parseNav(nav) |
||||||
|
num = int(num) |
||||||
|
|
||||||
|
if( na == "N" ): |
||||||
|
pos["N"] += num |
||||||
|
elif( na == "S" ): |
||||||
|
pos["N"] -= num |
||||||
|
|
||||||
|
elif( na == "E" ): |
||||||
|
pos["E"] += num |
||||||
|
elif( na == "W" ): |
||||||
|
pos["E"] -= num |
||||||
|
|
||||||
|
elif( na == "R" ): |
||||||
|
facing = rotate(num, facingClock, facing) |
||||||
|
elif( na == "L" ): |
||||||
|
facing = rotate(-num, facingClock, facing) |
||||||
|
|
||||||
|
elif( na == "F" ): |
||||||
|
if( facing == "N" or facing == "E" ): |
||||||
|
pos[facing] += num |
||||||
|
elif( facing == "W" ): |
||||||
|
pos["E"] -= num |
||||||
|
elif( facing == "S" ): |
||||||
|
pos["N"] -= num |
||||||
|
|
||||||
|
return pos, facing, facingIndex |
||||||
|
|
||||||
|
def wayrotate( deg, point ): |
||||||
|
rots = (int(deg / 90)) * (-1) |
||||||
|
|
||||||
|
point = shift_dict(point, rots) |
||||||
|
|
||||||
|
return point |
||||||
|
|
||||||
|
def forward( way, pos, num ): |
||||||
|
nor = (way["N"] - way["S"]) * num |
||||||
|
eas = (way["E"] - way["W"]) * num |
||||||
|
|
||||||
|
pos["N"] += nor |
||||||
|
pos["E"] += eas |
||||||
|
|
||||||
|
return pos |
||||||
|
|
||||||
|
def runNavWay( nav, way, pos ): |
||||||
|
na, num = parseNav(nav) |
||||||
|
num = int(num) |
||||||
|
|
||||||
|
if( na in pointkeys ): |
||||||
|
way[na] += num |
||||||
|
elif( na == "R" ): |
||||||
|
way = wayrotate(num, way) |
||||||
|
elif( na == "L" ): |
||||||
|
way = wayrotate(-num, way) |
||||||
|
|
||||||
|
elif( na == "F" ): |
||||||
|
pos = forward( way, pos, num ) |
||||||
|
|
||||||
|
return pos, way |
||||||
|
|
||||||
|
for nav in navigation: |
||||||
|
boatpos, boatfacing, boatfacingIndex = runNav(nav, boatpos, boatfacing, boatfacingClock, boatfacingIndex) |
||||||
|
|
||||||
|
#print(f"\nPOS {boatfacing=} {boatpos=}") |
||||||
|
|
||||||
|
|
||||||
|
for nav in navigation: |
||||||
|
boatpos2, waypoint = runNavWay(nav, waypoint, boatpos2) |
||||||
|
|
||||||
|
#print(f"\n POS {boatpos2=} {waypoint=}") |
||||||
|
|
||||||
|
print("Part1:", calcDistance(boatpos)) |
||||||
|
print("Part2:", calcDistance(boatpos2)) |
Loading…
Reference in new issue