public int FirstVisitedDistance(string input) { HashSet <Location> visits = new HashSet <Location>(); var instructions = input.Split(',') .Select(x => { var instruction = x.Trim(); return(new Vector { Direction = instruction.Substring(0, 1) == "R" ? 90 : -90, Magnitude = Convert.ToInt32(instruction.Substring(1)) }); }); CurrentCompassBearing = CompassBearing.North; CurrentLocation = new Location(0, 0); foreach (var vector in instructions) { SetNewDirection(vector.Direction); var found = UpdateLocationWithTracking(visits, vector.Magnitude); if (found) { break; } } return(Math.Abs(CurrentLocation.X) + Math.Abs(CurrentLocation.Y)); }
public void SetNewDirection(int turn) { var newBearing = (Convert.ToInt32(CurrentCompassBearing) + turn); if (newBearing < 0) { newBearing += 360; } CurrentCompassBearing = (CompassBearing)(newBearing % 360); }
private string GetNextPath(CompassBearing bearing) { switch (bearing) { case CompassBearing.North: return("U"); case CompassBearing.East: return("R"); case CompassBearing.South: return("D"); case CompassBearing.West: return("L"); } throw new Exception("Invalid enum passed in"); }
public Day17MazeState(Day17MazeState state, CompassBearing direction) { Path = state.Path; Location = new Location(state.Location.X, state.Location.Y); Path = state.Path + GetNextPath(direction); if (direction == CompassBearing.North) { Location.Y--; } else if (direction == CompassBearing.East) { Location.X++; } else if (direction == CompassBearing.South) { Location.Y++; } else if (direction == CompassBearing.West) { Location.X--; } }