public void Move(String instruction) { Match m = InstructionRegex.Match(instruction); char key = m.Groups[1].Value[0]; long value = long.Parse(m.Groups[2].Value); switch (key) { case 'N': case 'S': case 'E': case 'W': m_Waypoint.Move(key, value); break; case 'L': m_Waypoint.Rotate((int)(360 - value % 360)); break; case 'R': m_Waypoint.Rotate((int)(value % 360)); break; case 'F': Distance_NS += value * m_Waypoint.Distance_NS; Distance_EW += value * m_Waypoint.Distance_EW; break; } }
public int Solve() { var instructions = Input.SplitByNewLines().Select(line => InstructionRegex.Match(line)); var registers = new Dictionary <string, int>(); foreach (var instruction in instructions) { var registerToModify = instruction.Groups["targetreg"].Value; var registerToTest = instruction.Groups["testreg"].Value; var valueToTestAgainst = registers.ContainsKey(registerToTest) ? registers[registerToTest] : 0; var valueToTest = int.Parse(instruction.Groups["testval"].Value); var testSucceeded = false; switch (instruction.Groups["cond"].Value) { case ">": testSucceeded = valueToTestAgainst > valueToTest; break; case ">=": testSucceeded = valueToTestAgainst >= valueToTest; break; case "==": testSucceeded = valueToTestAgainst == valueToTest; break; case "!=": testSucceeded = valueToTestAgainst != valueToTest; break; case "<": testSucceeded = valueToTestAgainst < valueToTest; break; case "<=": testSucceeded = valueToTestAgainst <= valueToTest; break; default: throw new InvalidOperationException($"Unable to parse condition in {instruction.Value}"); } var valueToChangeBy = testSucceeded ? int.Parse(instruction.Groups["val"].Value) : 0; if (instruction.Groups["op"].Value == "dec") { valueToChangeBy = -valueToChangeBy; } registers[registerToModify] = (registers.ContainsKey(registerToModify) ? registers[registerToModify] : 0) + valueToChangeBy; } return(registers.Max(regWithValue => regWithValue.Value)); }