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);
        }
Esempio n. 3
0
        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);
        }