示例#1
0
        public void TryFindFixedBootCodeTest()
        {
            // For example, consider the same program from above:
            // nop + 0
            // acc + 1
            // jmp + 4
            // acc + 3
            // jmp - 3
            // acc - 99
            // acc + 1
            // jmp - 4
            // acc + 6
            // If you change the first instruction from nop +0 to jmp +0, it
            // would create a single - instruction infinite loop, never leaving
            // that instruction.If you change almost any of the jmp
            // instructions, the program will still eventually find another
            // jmp instruction and loop forever.
            // However, if you change the second - to - last instruction
            // (from jmp -4 to nop - 4), the program terminates! The
            // instructions are visited in this order:
            // nop + 0 | 1
            // acc + 1 | 2
            // jmp + 4 | 3
            // acc + 3 |
            // jmp - 3 |
            // acc - 99 |
            // acc + 1 | 4
            // nop - 4 | 5
            // acc + 6 | 6
            // After the last instruction(acc +6), the program terminates by
            // attempting to run the instruction below the last instruction in
            // the file. With this change, after the program terminates, the
            // accumulator contains the value 8(acc + 1, acc + 1, acc + 6).
            var testData = new List <Tuple <IList <string>, int> >()
            {
                new Tuple <IList <string>, int>(
                    new List <string>()
                {
                    "nop +0",
                    "acc +1",
                    "jmp +4",
                    "acc +3",
                    "jmp -3",
                    "acc -99",
                    "acc +1",
                    "jmp -4",
                    "acc +6"
                }, 8)
            };

            foreach (var testExample in testData)
            {
                var bootCode = BootCodeHelper.ParseInputLines(testExample.Item1);
                var foundSuccessfulProgram = BootCodeHelper.TryFindFixedProgram(bootCode, out _, out int actual);
                Assert.True(foundSuccessfulProgram);
                Assert.Equal(testExample.Item2, actual);
            }
        }