public static RoverMovementCalculatorInput CreateFromInputFormat(string inputFormat)
        {
            var inputLines = inputFormat
                             .Split(new[] { Environment.NewLine }, StringSplitOptions.None)
                             .Select(i => i.Trim()).ToArray();
            var upRightCoordinateOfPlateau = Position.CreateFromPositionFormat(inputLines[0]);

            var inputLinesWithRoverNumber = inputLines.Skip(1)
                                            .Select((l, i) => new { Line = l, RoverNumber = (int)Math.Floor((double)i / 2) })
                                            .ToArray();
            var positions       = inputLinesWithRoverNumber.Where((l, i) => i % 2 == 0).ToArray();
            var controlCommands = inputLinesWithRoverNumber.Where((l, i) => i % 2 == 1).ToArray();

            var roverPositionAndControlSignals = positions
                                                 .Join(controlCommands,
                                                       x => x.RoverNumber,
                                                       y => y.RoverNumber,
                                                       (position, commands) =>
            {
                var roverPosition       = RoverPosition.CreateFromPositionFormat(position.Line);
                var roverControlSignals =
                    commands.Line.Select(c => c.RoverControlSignalFromControlLetter()).ToArray();

                return(new RoverPositionAndControlSignals(roverPosition, roverControlSignals));
            }).ToArray();

            return(new RoverMovementCalculatorInput(upRightCoordinateOfPlateau, roverPositionAndControlSignals));
        }
		public static RoverPosition CreateFromPositionFormat(string format)
		{
			var paramsAsString = format.Split(' ');
			if (paramsAsString.Length != 3) throw new ArgumentException($"Invalid position: {format}");

			if (!int.TryParse(paramsAsString[0], out var x)) throw new ArgumentException($"Invalid position: {format}");
			if (!int.TryParse(paramsAsString[1], out var y)) throw new ArgumentException($"Invalid position: {format}");
			if (string.IsNullOrEmpty(paramsAsString[2])) throw new ArgumentException($"Invalid position: {format}");

			var heading = paramsAsString[2].CardinalCompassPointFromShortCode();

			var roverPositon = new RoverPosition(x, y, heading);

			return roverPositon;
		}
 public RoverPositionAndControlSignals(RoverPosition roverPosition,
                                       IReadOnlyList <RoverControlSignal> roverControlSignals)
 {
     RoverPosition       = roverPosition;
     RoverControlSignals = roverControlSignals;
 }