private Status CheckCurrentPoint(DroidPoint currentPoint, Droid droid) { var statusResult = droid.Move(currentPoint); droid.ReturnHome(); return(statusResult); }
public string CalculatePart1(string inputFile) { var program = GetProgram(inputFile); var droid = new Droid(program); var startPoint = new DroidPoint(0, 0, null); var map = new Dictionary <DroidPoint, Status>(); map.Add(startPoint, Status.Empty); var queue = new Queue <DroidPoint>(); EnqueuePoints(startPoint, Movement.East); EnqueuePoints(startPoint, Movement.West); EnqueuePoints(startPoint, Movement.North); EnqueuePoints(startPoint, Movement.South); while (queue.Any()) { var currentPoint = queue.Dequeue(); if (map.ContainsKey(currentPoint)) { continue; } var status = CheckCurrentPoint(currentPoint, droid); map.Add(currentPoint, status); if (status == Status.Empty) { EnqueuePoints(currentPoint, Movement.East); EnqueuePoints(currentPoint, Movement.West); EnqueuePoints(currentPoint, Movement.North); EnqueuePoints(currentPoint, Movement.South); } else if (status == Status.Oxygen) { return((currentPoint.HomePath.GetPathToHome().Count() + 1).ToString()); } } return(0.ToString()); void EnqueuePoints(DroidPoint currentPoint, Movement movement) { var newPoint = currentPoint.GetPoint(movement); if (!map.ContainsKey(newPoint)) { queue.Enqueue(newPoint); } } }
public Status Move(Movement movement) { var status = (Status)_runner.Run((int)movement); if (status != Status.Wall) { _fromHome.Push(movement); _position = _position.GetPoint(movement); } return(status); }
public Status Move(DroidPoint point) { Status status = Status.Empty; var currentPoint = point; foreach (var pathPoint in point.GetPathToHome().Reverse().Skip(1).Append(point)) { var movement = _position.GetMovement(pathPoint); status = Move(movement); } return(status); }
public void ReturnHome() { while (_fromHome.TryPop(out var movement)) { var moveTo = GetReverse(movement); var status = (Status)_runner.Run((int)moveTo); _position = _position.GetPoint(moveTo); if (status != Status.Empty) { throw new Exception("Invalid returning home"); } } if (!_position.Equals(_homePoint)) { throw new Exception("Invalid returning home"); } }