Example #1
0
        public static void Task2()
        {
            List <OpCodeTest> opcodes = new List <OpCodeTest>();
            int lineCounter           = 0;

            using (StreamReader reader = new StreamReader(inputPath))
            {
                string line, line2, line3;

                while ((line = reader.ReadLine()) != null)
                {
                    line2 = reader.ReadLine();
                    line3 = reader.ReadLine();
                    reader.ReadLine(); // Skip empty line
                    lineCounter += 4;

                    if (string.IsNullOrEmpty(line) && string.IsNullOrEmpty(line2))
                    {
                        lineCounter -= 2;
                        break;
                    }

                    string[] beforeStr   = line.Split(',');
                    string[] instruction = line2.Split(' ');
                    string[] afterStr    = line3.Split(',');

                    int[] before = new int[4];
                    int[] after  = new int[4];

                    before[0] = int.Parse(beforeStr[0].Substring(beforeStr[0].Length - 1));
                    before[1] = int.Parse(beforeStr[1].Trim());
                    before[2] = int.Parse(beforeStr[2].Trim());
                    before[3] = int.Parse(beforeStr[3].Substring(1, 1));

                    after[0] = int.Parse(afterStr[0].Substring(afterStr[0].Length - 1));
                    after[1] = int.Parse(afterStr[1].Trim());
                    after[2] = int.Parse(afterStr[2].Trim());
                    after[3] = int.Parse(afterStr[3].Substring(1, 1));

                    int[] instr = new int[] { int.Parse(instruction[0]), int.Parse(instruction[1]), int.Parse(instruction[2]), int.Parse(instruction[3]) };

                    opcodes.Add(new OpCodeTest(instr, before, after));
                }
            }

            Dictionary <int, List <OpCode.Codes> > operations = new Dictionary <int, List <OpCode.Codes> >();

            foreach (var o in opcodes)
            {
                if (!operations.ContainsKey(o.Instruction[0]))
                {
                    operations.Add(o.Instruction[0], new List <OpCode.Codes>());
                }

                List <OpCode.Codes> codes = operations[o.Instruction[0]];

                if (o.Addr())
                {
                    if (!codes.Contains(OpCode.Codes.addr))
                    {
                        codes.Add(OpCode.Codes.addr);
                    }
                }
                if (o.Addi())
                {
                    if (!codes.Contains(OpCode.Codes.addi))
                    {
                        codes.Add(OpCode.Codes.addi);
                    }
                }
                if (o.Mulr())
                {
                    if (!codes.Contains(OpCode.Codes.mulr))
                    {
                        codes.Add(OpCode.Codes.mulr);
                    }
                }
                if (o.Muli())
                {
                    if (!codes.Contains(OpCode.Codes.muli))
                    {
                        codes.Add(OpCode.Codes.muli);
                    }
                }
                if (o.Banr())
                {
                    if (!codes.Contains(OpCode.Codes.banr))
                    {
                        codes.Add(OpCode.Codes.banr);
                    }
                }
                if (o.Bani())
                {
                    if (!codes.Contains(OpCode.Codes.bani))
                    {
                        codes.Add(OpCode.Codes.bani);
                    }
                }
                if (o.Borr())
                {
                    if (!codes.Contains(OpCode.Codes.borr))
                    {
                        codes.Add(OpCode.Codes.borr);
                    }
                }
                if (o.Bori())
                {
                    if (!codes.Contains(OpCode.Codes.bori))
                    {
                        codes.Add(OpCode.Codes.bori);
                    }
                }
                if (o.Setr())
                {
                    if (!codes.Contains(OpCode.Codes.setr))
                    {
                        codes.Add(OpCode.Codes.setr);
                    }
                }
                if (o.Seti())
                {
                    if (!codes.Contains(OpCode.Codes.seti))
                    {
                        codes.Add(OpCode.Codes.seti);
                    }
                }
                if (o.Gtir())
                {
                    if (!codes.Contains(OpCode.Codes.gtir))
                    {
                        codes.Add(OpCode.Codes.gtir);
                    }
                }
                if (o.Gtri())
                {
                    if (!codes.Contains(OpCode.Codes.gtri))
                    {
                        codes.Add(OpCode.Codes.gtri);
                    }
                }
                if (o.Gtrr())
                {
                    if (!codes.Contains(OpCode.Codes.gtrr))
                    {
                        codes.Add(OpCode.Codes.gtrr);
                    }
                }
                if (o.Eqir())
                {
                    if (!codes.Contains(OpCode.Codes.eqir))
                    {
                        codes.Add(OpCode.Codes.eqir);
                    }
                }
                if (o.Eqri())
                {
                    if (!codes.Contains(OpCode.Codes.eqri))
                    {
                        codes.Add(OpCode.Codes.eqri);
                    }
                }
                if (o.Eqrr())
                {
                    if (!codes.Contains(OpCode.Codes.eqrr))
                    {
                        codes.Add(OpCode.Codes.eqrr);
                    }
                }
            }

            while (operations.Any(o => o.Value.Count > 1))
            {
                for (int i = 0; i < operations.Count; i++)
                {
                    if (operations[i].Count == 1)
                    {
                        for (int j = 0; j < operations.Count; j++)
                        {
                            if (j == i)
                            {
                                continue;
                            }

                            if (operations[j].Contains(operations[i][0]))
                            {
                                operations[j].Remove(operations[i][0]);
                            }
                        }
                    }
                }
            }

            int[]  register = new int[] { 0, 0, 0, 0 };
            OpCode opCode   = new OpCode(operations);

            using (StreamReader reader = new StreamReader(inputPath))
            {
                string line;
                int    lineCntr = 0;

                while ((line = reader.ReadLine()) != null)
                {
                    if (lineCntr < lineCounter)
                    {
                        lineCntr++;
                        continue;
                    }

                    string[] opStr = line.Split(' ');
                    int[]    op    = new int[] { int.Parse(opStr[0]), int.Parse(opStr[1]), int.Parse(opStr[2]), int.Parse(opStr[3]) };

                    opCode.Exec(register, op);
                }
            }

            Console.WriteLine(register[0]);
        }