示例#1
0
        public void SpinToWin()
        {
            var x     = new Position(0, 3);
            var y     = new Position(0, 3);
            var rover = new Rover(x, y, FacingDirection.N);

            rover.RotateLeft();
            Assert.Equal(FacingDirection.W, rover.FacingDirection);
            Assert.Equal(FacingDirection.E, rover.OppositeFacingDirection);
            rover.RotateRight();
            Assert.Equal(FacingDirection.N, rover.FacingDirection);
            Assert.Equal(FacingDirection.S, rover.OppositeFacingDirection);
            rover.RotateRight();
            rover.RotateRight();
            rover.RotateRight();
            Assert.Equal(FacingDirection.W, rover.FacingDirection);
            Assert.Equal(FacingDirection.E, rover.OppositeFacingDirection);
            rover.RotateRight();
            Assert.Equal(FacingDirection.N, rover.FacingDirection);
            Assert.Equal(FacingDirection.S, rover.OppositeFacingDirection);
        }
示例#2
0
 public void Process(string commands)
 {
     var commandChain = commands.Select <char, Action>(c => c switch
     {
         'F' => () => { EnsureCanMove(MoveDirection.F); rover.Move(MoveDirection.F); }
         ,
         'B' => () => { EnsureCanMove(MoveDirection.B); rover.Move(MoveDirection.B); }
         ,
         'L' => () => rover.RotateLeft(),
         'R' => () => rover.RotateRight(),
         _ => throw new NotSupportedException()
     });
示例#3
0
        private string ParseRoverInstructions(string[] instructions)
        {
            StringBuilder output = new StringBuilder();

            for (int i = 1; i < instructions.Length; i += 2)
            {
                var startPosLine = instructions[i];
                if (!IsValidPosition(startPosLine)) // verify the start position is in the valid format
                {
                    output.AppendLine($"Warning: Invalid start position for Rover #{i / 2}. Sipping rover commands.");
                    continue;
                }

                var   startPos = instructions[i].Split(' ');
                Rover rover    = new Rover(int.Parse(startPos[0]), int.Parse(startPos[1]), startPos[2]);

                if (!IsInBounds(rover.Position)) // verify that the given start position is in bounds of the plateau
                {
                    output.AppendLine($"Warning: Invalid start position for Rover #{i / 2}. Sipping rover commands.");
                    continue;
                }

                var commands = instructions[i + 1];

                if (!IsValidCommands(commands)) // verify that the commands are in the valid format
                {
                    output.AppendLine($"Warning: Invalid commands for Rover #{i / 2}. Sipping rover commands.");
                    continue;
                }

                foreach (var command in commands)
                {
                    switch (command)
                    {
                    case 'L':
                    case 'l':
                        rover.RotateLeft();
                        break;

                    case 'R':
                    case 'r':
                        rover.RotateRight();
                        break;

                    case 'M':
                    case 'm':
                        if (IsInBounds(rover.GetNextPosition()))
                        {
                            rover.Position = rover.GetNextPosition();
                        }
                        else
                        {
                            output.AppendLine($"Warning: Cannot move Rover #{i / 2} out of bounds. Move command ignored.");
                        }
                        break;
                    }
                }
                // send updated position back to NASA
                output.AppendLine(rover.ToString());
            }

            return(output.ToString());
        }