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