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() });
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); }
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()); }