예제 #1
0
        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");
        }
예제 #2
0
        //######################################################################
        // Methods
        //######################################################################

        public static IList <Tuple <char, int> > ProcessInputFile(string path)
        {
            return(Helpers.ProcessInputFile(path, ExtractAction));
        }
예제 #3
0
        //######################################################################
        // Methods
        //######################################################################

        public static IList <string> ProcessInputFile(string path)
        {
            return(Helpers.ProcessInputFile(path, line => line));
        }
예제 #4
0
        //######################################################################
        // Methods
        //######################################################################

        public static IProgram ProcessInputFile(string path)
        {
            return(IProgram.MakeSequence(Helpers.ProcessInputFile(path, StringToProgram)));
        }
예제 #5
0
        //######################################################################
        // Methods
        //######################################################################

        public static IList <IList <char> > ProcessInputFile(string path)
        {
            return(Helpers.ProcessInputFile(path, ToCharList));

            throw new NotImplementedException();
        }
예제 #6
0
        //######################################################################
        // Methods
        //######################################################################

        public static IList <int> ProcessInputFile(string path)
        {
            return(Helpers.ProcessInputFile(path, line => int.Parse(line)));
        }
예제 #7
0
        //######################################################################
        // 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));
        }
예제 #8
0
        //######################################################################
        // Methods
        //######################################################################

        public static IList <PasswordInput> ProcessInputFile(string path)
        {
            return(Helpers.ProcessInputFile(path, StringToPasswordInput));
        }
예제 #9
0
        //######################################################################
        // Methods
        //######################################################################

        public static IList <(int, int)> ProcessInputFile(string path)
        {
            return(Helpers.ProcessInputFile(path, SeatToRowCol));
        }