コード例 #1
0
        public Span <int> Run(int input)
        {
            var programSpan        = program.AsSpan();
            var instructionPointer = 0;

            while (true)
            {
                var opCodeText          = programSpan[instructionPointer].ToString();
                var paramModeRepository = ParameterModeRepository.ParseFromOpCode(opCodeText);
                var extractor           = new ParameterExtractor(paramModeRepository);

                var parsedOpCode = opCodeText.Length > 1 ? int.Parse(opCodeText.Substring(opCodeText.Length - 2, 2)) : programSpan[instructionPointer];

                switch (parsedOpCode)
                {
                case 1:
                    Operation(programSpan, instructionPointer, (a, b) => a + b, extractor);
                    instructionPointer += 4;
                    break;

                case 2:
                    Operation(programSpan, instructionPointer, (a, b) => a * b, extractor);
                    instructionPointer += 4;
                    break;

                case 3:

                    programSpan[programSpan[instructionPointer + 1]] = input;
                    instructionPointer += 2;
                    break;

                case 4:
                    var outputValue = extractor.GetParameterValue(programSpan, 0, instructionPointer);
                    Console.WriteLine(outputValue);
                    instructionPointer += 2;
                    break;

                case 5:
                    JumpToWhenTrue(programSpan, ref instructionPointer, extractor, v => v != 0);
                    break;

                case 6:
                    JumpToWhenTrue(programSpan, ref instructionPointer, extractor, v => v == 0);
                    break;

                case 7:
                    WriteTrueIfTrueAt(programSpan, ref instructionPointer, extractor, (a, b) => a < b);

                    break;

                case 8:
                    WriteTrueIfTrueAt(programSpan, ref instructionPointer, extractor, (a, b) => a == b);
                    break;

                case 99:
                    return(programSpan);
                }
            }
        }
コード例 #2
0
 public ParameterExtractor(ParameterModeRepository paramModeRepository)
 {
     this.paramModeRepository = paramModeRepository;
 }