private string PartA(IEnumerable <string> data) { var gameKid = new GameKid(); var cart = GameKidCart.Parse(data); gameKid.RunCart(cart); return("Accumulator = " + gameKid.Accumulator); }
public bool RunCart(GameKidCart cart) { Accumulator = 0; Address = 0; UsedInstructions.Clear(); while (true) { if (Address >= cart.Instructions.Length) { Console.WriteLine("Finished"); return(true); } var i = cart.Instructions[Address]; if (UsedInstructions.Contains(Address)) { Log("INFINITE LOOP", i); return(false); } UsedInstructions.Add(Address); Log("", i); switch (i.Operation) { case "acc": Accumulator += i.Argument; Address += 1; break; case "nop": Address += 1; break; case "jmp": Address += i.Argument; break; default: Log("UNSUPPORTED", i); return(false); } } }
private string PartB(IEnumerable <string> data) { var gameKid = new GameKid(); var cart = GameKidCart.Parse(data); gameKid.RunCart(cart); var usedInstructions = gameKid.UsedInstructions.ToArray(); // narrow our search by only modifying instructions we actually use foreach (var i in usedInstructions) { var instruction = cart.Instructions[i]; var prevOp = instruction.Operation; if (prevOp == "jmp") { instruction.Operation = "nop"; } else if (prevOp == "nop") { instruction.Operation = "jmp"; } else { continue; } if (gameKid.RunCart(cart)) { return("Fixed Accumulator = " + gameKid.Accumulator); } // undo instruction.Operation = prevOp; } return("Failed"); }