public RoverRobotAndMovements GetData(int defaultValue = 0) { var filePath = Path.GetFullPath(System.IO.Directory.GetParent(System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString()).ToString() + @ConfigurationHelper.DataPath); var robotProps = GetJRobotData(filePath); var roverRobotAndMovements = new RoverRobotAndMovements(); if (robotProps != null) { var listData = MapRoverRobotListData(robotProps); if (listData != null && listData.Any() && listData[defaultValue] != null) { roverRobotAndMovements = listData[defaultValue]; } } return(roverRobotAndMovements); }
private List <RoverRobotAndMovements> MapRoverRobotListData(JObject jsonObj) { var strPlateuSurfaces = string.Empty; var strRobotPosition = string.Empty; var strRobotMovements = string.Empty; var roverRobotAndMovementsList = new List <RoverRobotAndMovements>(); if (jsonObj["Inputs"] != null) { var inputs = jsonObj["Inputs"].ToList(); foreach (var item in inputs) { var movementList = new List <Movement>(); var roverRobotAndMovements = new RoverRobotAndMovements() { RoverRobot = new RoverRobot { FacingDirection = Directions.N, LandedPlateu = new Plateu { XSurfaceLength = 0, YSurfaceLength = 0 }, Position = new Position { CoordinateX = 0, CoordinateY = 0 } } }; strPlateuSurfaces = item[0].ToString(); strRobotPosition = item[1].ToString(); strRobotMovements = item[2].ToString(); if (!string.IsNullOrEmpty(strPlateuSurfaces)) { var strPlateuSurfaceList = strPlateuSurfaces.Trim().Split(' '); if (strPlateuSurfaceList != null && strPlateuSurfaceList.Any() && strPlateuSurfaceList.Count() == 2) { roverRobotAndMovements.RoverRobot.LandedPlateu.XSurfaceLength = Convert.ToInt32(strPlateuSurfaceList[0]); roverRobotAndMovements.RoverRobot.LandedPlateu.YSurfaceLength = Convert.ToInt32(strPlateuSurfaceList[1]); } } if (!string.IsNullOrEmpty(strRobotPosition)) { var strRobotPositionList = strRobotPosition.Trim().Split(' '); if (strRobotPositionList != null && strRobotPositionList.Any() && strRobotPositionList.Count() == 3) { roverRobotAndMovements.RoverRobot.Position.CoordinateX = Convert.ToInt32(strRobotPositionList[0]); roverRobotAndMovements.RoverRobot.Position.CoordinateY = Convert.ToInt32(strRobotPositionList[1]); roverRobotAndMovements.RoverRobot.FacingDirection = (Directions)Enum.Parse(typeof(Directions), strRobotPositionList[2]); } } if (!string.IsNullOrEmpty(strRobotMovements)) { var strRobotMovementList = strRobotMovements.ToUpper().Trim().ToCharArray(); if (strRobotMovementList != null && strRobotMovementList.Any()) { var movementStep = 0; foreach (var movementItem in strRobotMovementList) { var movement = new Movement(); var currentRotation = (Rotations)Enum.Parse(typeof(Rotations), movementItem.ToString()); if (movementList != null && movementList.Any() && (movementList.LastOrDefault().Rotation == currentRotation && currentRotation == Rotations.M)) { movementList.LastOrDefault().Count++; } else { movementStep++; movement.Rotation = currentRotation; movement.Step = movementStep; movement.Count = 1; movementList.Add(movement); } } roverRobotAndMovements.Movements = movementList; } } roverRobotAndMovementsList.Add(roverRobotAndMovements); } } return(roverRobotAndMovementsList); }
public RoverOperationResult OperateRoverRobotFromJsonData(RoverRobotAndMovements roverRobotAndMovements) { var resultObj = new RoverOperationResult { SkippedPositions = new List <Position>() }; try { if (roverRobotAndMovements != null && roverRobotAndMovements.Movements != null && roverRobotAndMovements.Movements.Any() && roverRobotAndMovements.RoverRobot != null) { MoveResult moveResult = null; foreach (var movement in roverRobotAndMovements.Movements) { moveResult = null; switch (movement.Rotation) { case Rotations.M: moveResult = MoveForward(roverRobotAndMovements.RoverRobot.Position, roverRobotAndMovements.RoverRobot.FacingDirection, movement.Count); if (moveResult != null) { roverRobotAndMovements.RoverRobot.Position = moveResult.Position; } break; case Rotations.L: roverRobotAndMovements.RoverRobot.FacingDirection = RotateLeft(roverRobotAndMovements.RoverRobot.FacingDirection); break; case Rotations.R: roverRobotAndMovements.RoverRobot.FacingDirection = RotateRight(roverRobotAndMovements.RoverRobot.FacingDirection); break; default: resultObj.Result = -1; resultObj.ResultMessage = ($"Invalid Movement {movement.Rotation.ToString()}"); break; } if (moveResult != null && moveResult.Result && moveResult.isSkipped) { resultObj.Result = 1; resultObj.SkippedPositions.Add(moveResult.skippedPosition); resultObj.ResultMessage += $"\n !!! Skipped Old Occurenced Error Coordinates ({moveResult.skippedPosition.CoordinateX} , {moveResult.skippedPosition.CoordinateY})"; } else if (moveResult != null && !moveResult.Result) { resultObj.Result = -1; resultObj.ResultMessage += $"\n !!! An error occured while the robot was moving On ({roverRobotAndMovements.RoverRobot.Position.CoordinateX} , {roverRobotAndMovements.RoverRobot.Position.CoordinateY}) Coordinates"; break; } else if (roverRobotAndMovements.RoverRobot.Position.CoordinateX < 0 || roverRobotAndMovements.RoverRobot.Position.CoordinateX > roverRobotAndMovements.RoverRobot.LandedPlateu.XSurfaceLength || roverRobotAndMovements.RoverRobot.Position.CoordinateY < 0 || roverRobotAndMovements.RoverRobot.Position.CoordinateY > roverRobotAndMovements.RoverRobot.LandedPlateu.YSurfaceLength) { resultObj.Result = -1; resultObj.ResultMessage = $"!!! Position exceeded plateau limits (0 , 0) and ({roverRobotAndMovements.RoverRobot.LandedPlateu.XSurfaceLength} , {roverRobotAndMovements.RoverRobot.LandedPlateu.YSurfaceLength})"; break; } } } else { resultObj.Result = -1; resultObj.ResultMessage = $"!!! There is Missing Information Of RoverRobot"; } if (resultObj.Result != -1) { resultObj.Result = 1; resultObj.ResultMessage += "\n Succes"; resultObj.RoverRobotAndMovements = roverRobotAndMovements; } } catch (Exception ex) { } return(resultObj); }