fix day 15
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Ben Harris 2021-11-09 16:59:05 -05:00
parent 2c9737d6d2
commit f6b72dd9ee
1 changed files with 27 additions and 16 deletions

View File

@ -17,20 +17,27 @@ public sealed class Day15 : Day
var halt = IntCodeVM.HaltType.Waiting; var halt = IntCodeVM.HaltType.Waiting;
while (halt == IntCodeVM.HaltType.Waiting) while (halt == IntCodeVM.HaltType.Waiting)
{ {
var direction = currentLocation!.NextDirection(); var direction = currentLocation.NextDirection();
if (direction <= 4) if (direction <= 4)
{ {
var (x, y) = currentLocation.Neighbor(direction); var (x, y) = currentLocation.Neighbor(direction);
if (Location.GetLocation(x, y) == null) if (Location.GetLocation(x, y) == null)
{ {
halt = vm.Run(direction); halt = vm.Run(direction);
currentLocation = vm.Result switch switch (vm.Result)
{ {
Location.Wall => new Location(x, y, Location.Opposites[direction], Location.Wall), case Location.Wall:
Location.Empty => new Location(x, y, Location.Opposites[direction]), _ = new Location(x, y, Location.Opposites[direction], Location.Wall);
Location.System => new Location(x, y, Location.Opposites[direction], Location.System), break;
_ => throw new Exception($"Unknown IntCodeVM response: {vm.Result}"), case Location.Empty:
}; currentLocation = new Location(x, y, Location.Opposites[direction]);
break;
case Location.System:
currentLocation = new Location(x, y, Location.Opposites[direction], Location.System);
break;
default:
throw new Exception($"Unknown IntCodeVM response: {vm.Result}");
}
} }
} }
else else
@ -39,11 +46,15 @@ public sealed class Day15 : Day
if (direction > 0) if (direction > 0)
{ {
halt = vm.Run(direction); halt = vm.Run(direction);
currentLocation = vm.Result switch switch (vm.Result)
{ {
Location.Empty or Location.System => Location.GetLocation(currentLocation.Neighbor(direction)), case Location.Empty:
_ => throw new Exception($"Unknown or unexpected response for previous room: {vm.Result}"), case Location.System:
}; currentLocation = Location.GetLocation(currentLocation.Neighbor(direction));
break;
default:
throw new Exception($"Unknown or unexpected response for previous room: {vm.Result}");
}
} }
else else
{ {
@ -79,10 +90,10 @@ public sealed class Day15 : Day
currentLocation = Location.OxygenLocation; currentLocation = Location.OxygenLocation;
var distance = 0; var distance = 0;
while (currentLocation?.PreviousDirection != 0) while (currentLocation.PreviousDirection != 0)
{ {
distance++; distance++;
currentLocation = Location.GetLocation(currentLocation!.PreviousLocation()); currentLocation = Location.GetLocation(currentLocation.PreviousLocation());
} }
return $"{distance}"; return $"{distance}";
@ -143,7 +154,7 @@ public sealed class Day15 : Day
AllLocations.Add((x, y), this); AllLocations.Add((x, y), this);
} }
public static Location? OxygenLocation { get; private set; } public static Location OxygenLocation { get; private set; }
public int PreviousDirection { get; } public int PreviousDirection { get; }
private int X { get; } private int X { get; }
private int Y { get; } private int Y { get; }
@ -193,12 +204,12 @@ public sealed class Day15 : Day
return searchDirection++; return searchDirection++;
} }
public static Location? GetLocation(int x, int y) public static Location GetLocation(int x, int y)
{ {
return AllLocations.ContainsKey((x, y)) ? AllLocations[(x, y)] : null; return AllLocations.ContainsKey((x, y)) ? AllLocations[(x, y)] : null;
} }
public static Location? GetLocation((int x, int y) coords) public static Location GetLocation((int x, int y) coords)
{ {
return GetLocation(coords.x, coords.y); return GetLocation(coords.x, coords.y);
} }