import Foundation let input = loadData(day: 12) let scanner = Scanner(string: input) var position = (north: 0, east: 0) var waypoint = (north: 1, east: 10) var direction = 0 /* while !scanner.isAtEnd { guard let instruction = scanner.scanCharacter(), let value = scanner.scanInt() else { fatalError("Invalid input") } switch instruction { case "N": position.north += value case "S": position.north -= value case "E": position.east += value case "W": position.east -= value case "L": direction = (360 + direction - value) % 360 case "R": direction = (direction + value) % 360 case "F": switch direction { case 0: position.east += value case 90: position.north -= value case 180: position.east -= value case 270: position.north += value default: fatalError("Invalid direction") } default: fatalError("Invalid command") } } */ func turn(_ degrees: Int) -> (north: Int, east: Int) { switch degrees { case 0: return waypoint case 90: return (-waypoint.east, waypoint.north) case 180: return (-waypoint.north, -waypoint.east) case 270: return (waypoint.east, -waypoint.north) default: fatalError("Invalid direction") } } while !scanner.isAtEnd { guard let instruction = scanner.scanCharacter(), let value = scanner.scanInt() else { fatalError("Invalid input") } switch instruction { case "N": waypoint.north += value case "S": waypoint.north -= value case "E": waypoint.east += value case "W": waypoint.east -= value case "R": waypoint = turn(value) case "L": waypoint = turn(360 - value) case "F": position.north += value * waypoint.north position.east += value * waypoint.east default: fatalError("Invalid command") } } print(abs(position.north) + abs(position.east))