public static int Part2() { // TODO: make this more visitor-ey const string path = Helpers.inputPath + @"\day08\input.txt"; IProgram input = ProcessInputFile(path); int programLength = input.Accept(new TotalLength()); IList <(string, int)> instructions = Helpers.ProcessInputFile(path, StringToInstruction); for (int i = 0; i < instructions.Count; i++) { IList <IProgram> newInstructions = instructions.Select((inst, j) => { switch (inst.Item1) { case "acc": return(IProgram.MakeACC(inst.Item2)); case "nop": { if (i == j) { return(IProgram.MakeJMP(inst.Item2)); } else { return(IProgram.MakeNOP(inst.Item2)); } } case "jmp": { if (i == j) { return(IProgram.MakeNOP(inst.Item2)); } else { return(IProgram.MakeJMP(inst.Item2)); } } default: throw new ArgumentException("Invalid opcode."); } }).ToList(); IProgram sequence = IProgram.MakeSequence(newInstructions); Run rv = new Run(programLength); if (sequence.Accept(rv)) { Console.WriteLine("Index changed: " + i); return(rv.Accumulator); } } throw new Exception("Value not found"); }
//###################################################################### // Methods //###################################################################### public static IList <Tuple <char, int> > ProcessInputFile(string path) { return(Helpers.ProcessInputFile(path, ExtractAction)); }
//###################################################################### // Methods //###################################################################### public static IList <string> ProcessInputFile(string path) { return(Helpers.ProcessInputFile(path, line => line)); }
//###################################################################### // Methods //###################################################################### public static IProgram ProcessInputFile(string path) { return(IProgram.MakeSequence(Helpers.ProcessInputFile(path, StringToProgram))); }
//###################################################################### // Methods //###################################################################### public static IList <IList <char> > ProcessInputFile(string path) { return(Helpers.ProcessInputFile(path, ToCharList)); throw new NotImplementedException(); }
//###################################################################### // Methods //###################################################################### public static IList <int> ProcessInputFile(string path) { return(Helpers.ProcessInputFile(path, line => int.Parse(line))); }
//###################################################################### // Parsing //###################################################################### // TODO: parse into dictionary instead of List of tuples public static IList <(string, IList <(string, int)>)> ProcessInputFile(string path) { return(Helpers.ProcessInputFile(path, ExtractBagRelations)); }
//###################################################################### // Methods //###################################################################### public static IList <PasswordInput> ProcessInputFile(string path) { return(Helpers.ProcessInputFile(path, StringToPasswordInput)); }
//###################################################################### // Methods //###################################################################### public static IList <(int, int)> ProcessInputFile(string path) { return(Helpers.ProcessInputFile(path, SeatToRowCol)); }