예제 #1
0
        public long Run(int input)
        {
            var intcode = new Intcode(_program);

            intcode.AddInputs(input);
            return(intcode.Execute().First());
        }
예제 #2
0
        private IEnumerable <(int, int)> GetBounds(
            int maxX   = int.MaxValue,
            int maxY   = int.MaxValue,
            int startY = 0)
        {
            int prevWidth = 0;
            int startX    = 0;

            for (int y = startY; y < maxY; y++)
            {
                bool isFoundFirst     = false;
                int  first            = -1;
                bool isReturnedAnswer = false;
                for (int x = startX; x < maxX; x++)
                {
                    var ic = new Intcode(_program);
                    ic.AddInputs(x, y);
                    var output = (int)ic.Execute().First();
                    if (!isFoundFirst && output == 1)
                    {
                        isFoundFirst = true;
                        first        = x;
                        startX       = x;
                        if (prevWidth > 0)
                        {
                            x += prevWidth - 1;
                        }
                    }
                    else if (!isFoundFirst && x - startX > 10)
                    {
                        prevWidth = 0;
                        yield return(-1, -1);

                        isReturnedAnswer = true;
                        break;
                    }
                    else if (isFoundFirst && output == 0)
                    {
                        prevWidth = x - first - 1;
                        yield return(first, x - 1);

                        isReturnedAnswer = true;
                        break;
                    }
                }
                if (!isReturnedAnswer)
                {
                    if (first == -1)
                    {
                        prevWidth = 0;
                        yield return(-1, -1);
                    }
                    else
                    {
                        prevWidth = maxX - first - 1;
                        yield return(first, maxX - 1);
                    }
                }
            }
        }
예제 #3
0
파일: Day05.cs 프로젝트: jjermanis/aoc2019
        public long DoCalc(int input)
        {
            var intcode = new Intcode(_program);

            intcode.AddInputs(input);
            return(intcode.Execute().Last());
        }
예제 #4
0
        public long Execute(int noun, int verb)
        {
            // This was based on an older version of the Intcode machine. There were no
            // I/O opcodes - it was based on direct reads/writes into memory
            long[] memory = new long[_programData.Length];
            Array.Copy(_programData, memory, _programData.Length);
            var intcode = new Intcode(memory);

            intcode.Poke(1, noun);
            intcode.Poke(2, verb);

            // Run to termination
            intcode.Execute().LastOrDefault();
            return(intcode.Peek(0));
        }
예제 #5
0
파일: Day13.cs 프로젝트: jjermanis/aoc2019
        public int BlockCountExit()
        {
            var intcode = new Intcode(_program);
            var screen  = new Dictionary <(long, long), long>();

            using (var enumer = intcode.Execute().GetEnumerator())
            {
                while (enumer.MoveNext())
                {
                    var x = enumer.Current;
                    enumer.MoveNext();
                    var y = enumer.Current;
                    enumer.MoveNext();
                    var tile = enumer.Current;

                    screen[(x, y)] = tile;
예제 #6
0
파일: Day15.cs 프로젝트: jjermanis/aoc2019
        public (int, int) TraverseMaze(bool drawMaze = false)
        {
            var intcode = new Intcode(_program);

            var resultDistanceToOx      = -1;
            var resultMaxDistanceFromOx = -1;

            var x            = 0;
            var y            = 0;
            var dirIndex     = 0;
            var map          = new Dictionary <(int, int), char>();
            var deadEnds     = new HashSet <(int, int)>();
            var distances    = new Dictionary <(int, int), int>();
            var currDistance = 0;

            map[(0, 0)]       = '.';
예제 #7
0
        public long MaxSignalWithFeedback()
        {
            var max = 0L;

            foreach (var perm in Util.Permute(5, 6, 7, 8, 9))
            {
                int                  intcodeCount = perm.Length;
                Intcode[]            intcodes     = new Intcode[intcodeCount];
                IEnumerator <long>[] icEnums      = new IEnumerator <long> [intcodeCount];
                for (var x = 0; x < intcodeCount; x++)
                {
                    intcodes[x] = new Intcode(_program);
                    intcodes[x].AddInputs(perm[x]);
                    icEnums[x] = intcodes[x].Execute().GetEnumerator();
                }
                intcodes[0].AddInputs(0);

                bool isTerminated = false;
                while (!isTerminated)
                {
                    for (var x = 0; x < intcodeCount; x++)
                    {
                        var isNext = icEnums[x].MoveNext();
                        if (!isNext)
                        {
                            isTerminated = true;
                            break;
                        }
                        NextIntcode(x).AddInputs(icEnums[x].Current);
                    }
                }

                max = Math.Max(max, intcodes[4].LastOutput);

                Intcode NextIntcode(int x) => intcodes[(x + 1) % 5];
            }
            return(max);
        }
예제 #8
0
파일: Day11.cs 프로젝트: jjermanis/aoc2019
        private IDictionary <(int, int), long> GetPainting(int startColor)
        {
            var intcode  = new Intcode(_program);
            var painting = new Dictionary <(int, int), long>();

            painting[(0, 0)] = startColor;