Exemplo n.º 1
0
        public void Should_ComputeCorrectSignal(int[] expected, int[] data)
        {
            var program = IntCodeProgram.New();

            program.Compute(data);
            Assert.Equal(expected, program.Output.Select(val => (int)val).ToArray());
        }
Exemplo n.º 2
0
        public void Should_OutputLargeNumberInTheMiddle()
        {
            var data    = new BigInteger[] { 104, 1125899906842624, 99 };
            var program = IntCodeProgram.New();

            program.Compute(IntCodeData.FromBigIntArray(data));
            var number = program.Output.Single();

            Assert.Equal(IntCodeValue.FromBigInteger(data[1]), number);
        }
Exemplo n.º 3
0
        public void Should_Output16DigitNumber()
        {
            var data    = new int[] { 1102, 34915192, 34915192, 7, 4, 7, 99, 0 };
            var program = IntCodeProgram.New();

            program.Compute(IntCodeData.FromIntArray(data));
            var number = program.Output.Single();

            Assert.Equal(16, number.ToString().Length);
        }
Exemplo n.º 4
0
        public int ComputeSignal(IList <IntCodeValue> phaseSettings, int[] data)
        {
            var amplifiers = new IIntCodeProgram[phaseSettings.Count];
            var firstInput = new BlockingCollection <IntCodeValue>();

            for (var i = 0; i < amplifiers.Length; i++)
            {
                var input = i == 0 ? firstInput : amplifiers[i - 1].Output;
                input.Add(phaseSettings[i]);

                if (_feedbackLoop && i == amplifiers.Length - 1)
                {
                    amplifiers[i] = IntCodeProgram.New(input, firstInput);
                }
                else
                {
                    amplifiers[i] = IntCodeProgram.New(input);
                }
            }

            var tasks = amplifiers.Select(program =>
                                          Task.Factory.StartNew(() => program.Compute(data.ToArray()), TaskCreationOptions.LongRunning));

            firstInput.Add(IntCodeValue.FromInt(0));

            Task.WhenAll(tasks).Wait(TimeoutMs);

            var took = amplifiers.Last().Output.TryTake(out var signal);

            if (!took)
            {
                throw new InvalidOperationException("No output found.");
            }

            if (amplifiers.Last().Output.Count != 0)
            {
                throw new InvalidOperationException("There's still output in the last amplifier.");
            }

            return((int)signal);
        }
Exemplo n.º 5
0
        public void Should_ReturnCorrectResult(int[] data, int[] expected)
        {
            var result = IntCodeProgram.New().Compute(data);

            Assert.Equal(expected, result);
        }
Exemplo n.º 6
0
 public int ComputeAndGetOutput(int[] data)
 {
     return(IntCodeProgram.New().Compute(data)[0]);
 }
Exemplo n.º 7
0
 protected virtual IIntCodeProgram CreateIntCodeProgram(BlockingCollection <IntCodeValue> input)
 {
     return(IntCodeProgram.New(input));
 }