Exemple #1
0
        /// <summary>
        /// Main Method
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            List <FinalResult> inputesList = new List <FinalResult>();
            string             line;
            bool isContinue = true;

            try
            {
                Console.WriteLine(SystemMessages.WelcomeMessage);
                Console.WriteLine(SystemMessages.DisplayOutput);

ContinueInput:
                inputesList = new List <FinalResult>();
                Console.WriteLine(SystemMessages.SeparatorLine);
                Console.WriteLine(SystemMessages.Inputs);
                Console.WriteLine(SystemMessages.SeparatorLine);
                do
                {
                    line = Console.ReadLine();
                    inputesList.Add(new FinalResult {
                        Input = line
                    });
                } while (!String.IsNullOrWhiteSpace(line) && line.ToLower() != "c" && isContinue);

                ////Call function to process the inputes and provide output
                inputesList = ProcessRequest.CalculateResult(inputesList);

                ////Display Output
                if (inputesList?.Count > 0)
                {
                    Console.WriteLine(SystemMessages.SeparatorLine);
                    Console.WriteLine(SystemMessages.OutputMessage);
                    Console.WriteLine(SystemMessages.SeparatorLine);
                    if (inputesList[0].ErrorMessage?.Length > 0)
                    {
                        Console.WriteLine(inputesList[0].ErrorMessage);
                        goto NextInputRequied;
                    }
                    else
                    {
                        if (inputesList?.Count > 2)
                        {
                            for (int i = 1; i < inputesList.Count - 1; i++)
                            {
                                Console.WriteLine(inputesList[i].ErrorMessage?.Length > 0 ? inputesList[i].ErrorMessage : inputesList[i].Output);
                            }

                            goto NextInputRequied;
                        }
                        else
                        {
                            Console.WriteLine(SystemMessages.NoInstructionFound);
                            goto NextInputRequied;
                        }
                    }
                }

                //// Ask to Continue OR Exit
NextInputRequied:
                Console.WriteLine(SystemMessages.ContinueMessage);
                char answer = Convert.ToChar(Console.ReadLine().ToLower());
                if (answer == 'y')
                {
                    goto ContinueInput;
                }
                else if (answer == 'n')
                {
                    isContinue = false;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(SystemMessages.ErrorMessage);
                ErrorLog.LogError(ex);
            }
            finally
            {
            }
        }
Exemple #2
0
        public static List <FinalResult> CalculateResult(List <FinalResult> finalResults)
        {
            int    start, maxX, maxY, initialX, initialY, nextX = 0;
            int    nextY = 0;
            char   initialDirection = Char.MinValue;
            string inputValue, instructionValue = string.Empty;
            bool   isLost = false;

            try
            {
                //// Check if there any inputes or not
                if (finalResults?.Count > 0)
                {
                    int.TryParse(finalResults[0].Input, out start);

                    //// Check the upper right coordinate is correct or not
                    if (start > 0 && start.ToString().Length == 2)
                    {
                        maxX = Convert.ToInt32(start.ToString().Substring(0, 1));
                        maxY = Convert.ToInt32(start.ToString().Substring(1, 1));

                        //// loop throught the jellyfish instruction line by line
                        for (int i = 1; i < finalResults.Count - 1; i++)
                        {
                            inputValue = finalResults[i].Input;
                            var inputs = inputValue.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);

                            //// check the starting position and initial direction
                            if (inputs?.Length > 0 && inputs.Length == 2)
                            {
                                if (int.TryParse(inputs[0][0].ToString(), out initialX) && int.TryParse(inputs[0][1].ToString(), out initialY))
                                {
                                    nextX = initialX;
                                    nextY = initialY;

                                    initialDirection = inputs[0].ToString().Length == 3 ? inputs[0].ToString()[2] : Char.MinValue;
                                    if (nextX >= 0 && nextY >= 0 &&
                                        (initialDirection == Constants.NORTH_DIRECTION || initialDirection == Constants.SOUTH_DIRECTION || initialDirection == Constants.WEST_DIRECTION || initialDirection == Constants.EAST_DIRECTION))
                                    {
                                        instructionValue = inputs[1];

                                        //// loop throught the jellyfish instruction by char
                                        foreach (char charItem in instructionValue)
                                        {
                                            isLost = false;
                                            if (charItem == Constants.FORWARD_DIRECTION || charItem == Constants.RIGHT_MOVE || charItem == Constants.LEFT_MOVE)
                                            {
                                                switch (charItem)
                                                {
                                                //// Check for Forward Direction
                                                case Constants.FORWARD_DIRECTION:
                                                    switch (initialDirection)
                                                    {
                                                    case Constants.NORTH_DIRECTION:
                                                        if (!(nextY + 1 > maxY))
                                                        {
                                                            nextY++;
                                                        }
                                                        else
                                                        {
                                                            isLost = true;
                                                        }
                                                        break;

                                                    case Constants.SOUTH_DIRECTION:
                                                        if (!(nextY - 1 < 0))
                                                        {
                                                            nextY--;
                                                        }
                                                        else
                                                        {
                                                            isLost = true;
                                                        }
                                                        break;

                                                    case Constants.EAST_DIRECTION:
                                                        if (!(nextX + 1 > maxX))
                                                        {
                                                            nextX++;
                                                        }
                                                        else
                                                        {
                                                            isLost = true;
                                                        }
                                                        break;

                                                    case Constants.WEST_DIRECTION:
                                                        if (!(nextX - 1 < 0))
                                                        {
                                                            nextX--;
                                                        }
                                                        else
                                                        {
                                                            isLost = true;
                                                        }
                                                        break;

                                                    default:
                                                        break;
                                                    }

                                                    break;

                                                //// Check for Right Move
                                                case Constants.RIGHT_MOVE:
                                                    switch (initialDirection)
                                                    {
                                                    case Constants.NORTH_DIRECTION:
                                                        initialDirection = Constants.EAST_DIRECTION;
                                                        break;

                                                    case Constants.SOUTH_DIRECTION:
                                                        initialDirection = Constants.WEST_DIRECTION;
                                                        break;

                                                    case Constants.EAST_DIRECTION:
                                                        initialDirection = Constants.SOUTH_DIRECTION;
                                                        break;

                                                    case Constants.WEST_DIRECTION:
                                                        initialDirection = Constants.NORTH_DIRECTION;
                                                        break;

                                                    default:
                                                        break;
                                                    }
                                                    break;

                                                //// Check for Left Move
                                                case Constants.LEFT_MOVE:
                                                    switch (initialDirection)
                                                    {
                                                    case Constants.NORTH_DIRECTION:
                                                        initialDirection = Constants.WEST_DIRECTION;
                                                        break;

                                                    case Constants.SOUTH_DIRECTION:
                                                        initialDirection = Constants.EAST_DIRECTION;
                                                        break;

                                                    case Constants.EAST_DIRECTION:
                                                        initialDirection = Constants.NORTH_DIRECTION;
                                                        break;

                                                    case Constants.WEST_DIRECTION:
                                                        initialDirection = Constants.SOUTH_DIRECTION;
                                                        break;

                                                    default:
                                                        break;
                                                    }
                                                    break;
                                                }

                                                //If jellyfish is lost save the actual coordinates for next jellyfish move
                                                if (isLost)
                                                {
                                                    if (!(i > 1 && finalResults[i - 1]?.IsLost == true && finalResults[i - 1].LostX == nextX && finalResults[i - 1].LostY == nextY))
                                                    {
                                                        finalResults[i].IsLost = true;
                                                        finalResults[i].LostX  = nextX;
                                                        finalResults[i].LostY  = nextY;
                                                        break;
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                finalResults[i].ErrorMessage = SystemMessages.ValidInstructionString.Replace("{1}", (i + 1).ToString());
                                                break;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        finalResults[i].ErrorMessage = SystemMessages.ValidFirstString.Replace("{1}", (i + 1).ToString());
                                    }
                                }
                                else
                                {
                                    finalResults[i].ErrorMessage = SystemMessages.ValidFirstTwoDigit.Replace("{1}", (i + 1).ToString());
                                }
                            }
                            else
                            {
                                finalResults[i].ErrorMessage = SystemMessages.ValidLineInputMessage.Replace("{1}", (i + 1).ToString());
                            }

                            //// Add final output
                            if (finalResults[i].IsLost)
                            {
                                finalResults[i].Output = nextX.ToString() + nextY.ToString() + initialDirection.ToString() + Constants.LOST;
                            }
                            else
                            {
                                finalResults[i].Output = nextX.ToString() + nextY.ToString() + initialDirection.ToString();
                            }
                        }
                    }
                    else
                    {
                        finalResults[0].ErrorMessage = SystemMessages.ValidStartNumber;
                    }
                }
                else
                {
                    finalResults[0].ErrorMessage = SystemMessages.ValidInput;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(SystemMessages.ErrorMessage);
                ErrorLog.LogError(ex);
            }

            return(finalResults);
        }