Esempio n. 1
0
        private string PartA(IEnumerable <string> data)
        {
            var gameKid = new GameKid();
            var cart    = GameKidCart.Parse(data);

            gameKid.RunCart(cart);

            return("Accumulator = " + gameKid.Accumulator);
        }
Esempio n. 2
0
            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);
                    }
                }
            }
Esempio n. 3
0
        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");
        }