예제 #1
0
        public virtual string Solve()
        {
            var directions = _parser.GetData().Split(", ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

            var q = 0;
            var r = 0;

            foreach (var direction in directions)
            {
                switch (direction)
                {
                case "n": q++; break;

                case "nw": q++; r--;  break;

                case "ne": r++;  break;

                case "s": q--; break;

                case "sw": r--;  break;

                case "se": q--; r++; break;
                }
            }

            return(new AxialHexCoordinate(q, r)
                   .GetDistanceTo(new AxialHexCoordinate(0, 0))
                   .ToString());
        }
예제 #2
0
        public virtual string Solve()
        {
            foreach (var line in _parser.GetData().ToArray())
            {
                var parts = line.Split(' ');

                var commandRegister = parts[0];
                var command         = parts[1];
                var commandValue    = int.Parse(parts[2]);
                var evalRegister    = parts[4];
                var evalOperator    = parts[5];
                var evalValue       = int.Parse(parts[6]);

                if (!Registers.ContainsKey(commandRegister))
                {
                    Registers[commandRegister] = 0;
                }

                if (!Registers.ContainsKey(evalRegister))
                {
                    Registers[evalRegister] = 0;
                }

                if (EvaluateCondition(evalRegister, evalOperator, evalValue))
                {
                    UpdateRegister(commandRegister, command, commandValue);
                }
            }

            return(Registers.Values.Max().ToString());
        }
예제 #3
0
        public virtual string Solve()
        {
            var lines         = Parser.GetData();
            var adjacencyList = BuildAdjacencyList(lines);

            return(GetNumberOfNodesThatRouteToZero(adjacencyList).ToString());
        }
예제 #4
0
        public virtual string Solve()
        {
            var lines   = _parser.GetData();
            var mapping = new Dictionary <string, string>();

            foreach (var line in lines)
            {
                var parts = line.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                var name  = parts[0];
                //var weight = parts[1].Remove(0).Remove(parts[1].Length - 1);
                if (parts.Length > 2)
                {
                    for (var i = 3; i < parts.Length; i++)
                    {
                        var discAbove = parts[i];
                        if (discAbove.EndsWith(","))
                        {
                            discAbove = discAbove.Remove(discAbove.Length - 1);
                        }
                        mapping.Add(discAbove, name);
                    }
                }
            }

            foreach (var holder in mapping.Values)
            {
                if (!mapping.ContainsKey(holder))
                {
                    return(holder);
                }
            }
            return("nope");
        }
예제 #5
0
        public virtual string Solve()
        {
            var computer = new Computer(Parser.GetData().ToArray());

            computer.Run();
            return(computer.LastRecovered.ToString());
        }
예제 #6
0
        public virtual string Solve()
        {
            var computer = new Computer(Parser.GetData().ToArray());

            computer.Run();
            return(computer.MultiplyCount.ToString());
        }
예제 #7
0
        public virtual string Solve()
        {
            var stream = _parser.GetData();

            var garbage      = false;
            var garbageCount = 0;

            for (var index = 0; index < stream.Length; index++)
            {
                var c = stream[index];
                if (c == '!')
                {
                    index++;
                    continue;
                }

                if (garbage)
                {
                    if (c == '>')
                    {
                        garbage = false;
                    }
                    else
                    {
                        garbageCount++;
                    }
                }
                else if (c == '<')
                {
                    garbage = true;
                }
            }
            return(garbageCount.ToString());
        }
예제 #8
0
        public virtual string Solve()
        {
            var        data = _parser.GetData().Split(',').Select(int.Parse).ToArray();
            List <int> program;

            var max = int.MinValue;

            foreach (var phaseSetting in EnumeratePhaseSettings())
            {
                var input  = 0;
                var output = 0;

                for (var i = 0; i < 5; i++)
                {
                    program = data.ToList();
                    output  = IntcodeProcessor.Compute(program, input, phaseSetting[i]);
                    input   = output;
                }

                if (output > max)
                {
                    max = output;
                }
            }

            return(max.ToString());
        }
예제 #9
0
        public virtual string Solve()
        {
            var input = Parser.GetData().ToCharArray();

            // 25 x 6
            var numPixels = 25 * 6;
            var numLayers = input.Length / numPixels;

            var minZeroes = int.MaxValue;
            var result    = 0;

            for (var i = 0; i < numLayers; i++)
            {
                var layerCounts = new Dictionary <char, int> {
                    { '0', 0 }, { '1', 0 }, { '2', 0 }
                };
                for (var j = numPixels * i; j < numPixels * i + numPixels; j++)
                {
                    layerCounts[input[j]]++;
                }

                if (layerCounts['0'] < minZeroes)
                {
                    minZeroes = layerCounts['0'];
                    result    = layerCounts['2'] * layerCounts['1'];
                }
            }

            return(result.ToString());
        }
예제 #10
0
        public virtual string Solve()
        {
            var input         = Parser.GetData();
            var scannerRanges = new Dictionary <int, int>();
            var max           = 0;

            foreach (var depth in input)
            {
                var parts = depth
                            .Split(new[] { ": " }, StringSplitOptions.RemoveEmptyEntries)
                            .Select(int.Parse)
                            .ToArray();

                scannerRanges.Add(parts[0], parts[1]);
                max = parts[0];
            }

            var scannerLocations = new List <int>(new int[max + 1]);
            var severity         = 0;

            for (var layer = 0; layer < scannerLocations.Count; layer++)
            {
                if (scannerRanges.ContainsKey(layer) && scannerLocations[layer] == 0)
                {
                    severity += scannerRanges[layer] * layer;
                }
                //Console.WriteLine($"{layer}: {string.Join(", ", scannerLocations)}");
                AdvanceScanners(scannerLocations, scannerRanges);
            }

            return(severity.ToString());
        }
예제 #11
0
        public virtual string Solve()
        {
            var orbits       = new Dictionary <string, string>();
            var orbitsInputs = _parser.GetData();
            var bodies       = new List <string>();

            foreach (var orbit in orbitsInputs)
            {
                var parts = orbit.Split(')');
                orbits.Add(parts[1], parts[0]);
                if (!bodies.Contains(parts[0]))
                {
                    bodies.Add(parts[0]);
                }
                if (!bodies.Contains(parts[1]))
                {
                    bodies.Add(parts[1]);
                }
            }

            var orbitCount = new Dictionary <string, int>();

            orbitCount.Add("COM", 0);

            foreach (var body in bodies)
            {
                if (body == "COM")
                {
                    continue;
                }
                var found   = false;
                var count   = 1;
                var current = body;
                while (!found)
                {
                    if (orbits.ContainsKey(current))
                    {
                        var next = orbits[current];
                        if (orbitCount.ContainsKey(next))
                        {
                            count += orbitCount[next];
                            found  = true;
                        }
                        else
                        {
                            count++;
                        }
                        current = next;
                    }
                    else
                    {
                        found = true;
                    }
                }
                orbitCount[body] = count;
            }

            return(orbitCount.Values.Sum().ToString());
        }
예제 #12
0
        public virtual string Solve()
        {
            var program = _parser.GetData().Split(',').Select(int.Parse).ToList();

            var output = IntcodeProcessor.Compute(program, 1);

            return(output.ToString());
        }
예제 #13
0
        public virtual string Solve()
        {
            var moves = Parser.GetData().Split(',');

            DanceMoves = GetDanceMoves(moves, Programs);
            PerformDance();
            return(new string(Programs));
        }
예제 #14
0
        public virtual string Solve()
        {
            var program = Parser.GetData().Split(',').Select(long.Parse).ToList();

            var arcade = new ArcadeGame(program);

            arcade.Go();

            return(arcade.BlockTileCount.ToString());
        }
예제 #15
0
        public virtual string Solve()
        {
            var lengths  = Parser.GetData().ParseDelimitedInts(',').ToList();
            var skipSize = 0;
            var head     = Enumerable.Range(0, 256).ToArray().BuildCircularList();
            var current  = head;

            KnotHasher.KnotHash(lengths, ref current, ref skipSize);
            return(GetProduct(head).ToString());
        }
예제 #16
0
        public virtual string Solve()
        {
            var program = Parser.GetData().Split(',').Select(long.Parse).ToList();

            var robot = new PaintingRobot(program);

            robot.Go();

            return(robot.PaintedCells.ToString());
        }
예제 #17
0
        public virtual string Solve()
        {
            var data = _parser.GetData().Split(',').Select(long.Parse).ToArray();

            var input   = 1;
            var program = data.ToList();
            var amp     = new IntcodeComputer(program, input);

            amp.Compute();

            return(amp.Output.ToString());
        }
예제 #18
0
        public virtual string Solve()
        {
            var total = 0;

            foreach (var line in _parser.GetData())
            {
                var numbers = line.ParseDelimitedInts('\t');
                numbers.MinMax(out int min, out int max);
                total += max - min;
            }

            return(total.ToString());
        }
예제 #19
0
        public virtual string Solve()
        {
            var number  = int.Parse(_parser.GetData());
            var mapping = new Dictionary <int, Coordinate>(number);
            var current = 1;

            foreach (var coordinate in SpiralCoordinates.GenerateCounterClockwise(number))
            {
                mapping.Add(current++, coordinate);
            }

            return((Math.Abs(mapping[number].X - mapping[1].X) + Math.Abs(mapping[number].Y - mapping[1].Y)).ToString());
        }
예제 #20
0
        public virtual string Solve()
        {
            var input = Parser.GetData();
            var count = 0;

            for (var i = 0; i < 128; i++)
            {
                var hash   = KnotHasher.ComputeKnotHash($"{input}-{i}");
                var binary = hash.FromHexStringToBinaryString();
                count += binary.Count(b => b == '1');
            }

            return(count.ToString());
        }
예제 #21
0
        public virtual string Solve()
        {
            var noun = 12;
            var verb = 2;

            var program = _parser.GetData().Split(',').Select(int.Parse).ToList();

            program[1] = noun;
            program[2] = verb;

            var output = IntcodeProcessor.Compute(program, 1);

            return(program[0].ToString());
        }
예제 #22
0
        public virtual string Solve()
        {
            var phrases = _parser.GetData().ToArray();
            var count   = 0;

            foreach (var phrase in phrases)
            {
                if (!ContainsAnagrams(phrase))
                {
                    count++;
                }
            }

            return(count.ToString());
        }
예제 #23
0
        public virtual string Solve()
        {
            var range = _parser.GetData().Split('-').Select(int.Parse).ToArray();
            var count = 0;

            for (var i = range[0]; i < range[1]; i++)
            {
                if (IsValid(i))
                {
                    count++;
                }
            }

            return(count.ToString());
        }
예제 #24
0
        public virtual string Solve()
        {
            var lines       = _parser.GetData();
            var mapping     = new Dictionary <string, List <string> >();
            var discWeights = new Dictionary <string, int>();

            foreach (var line in lines)
            {
                var parts       = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                var discHolding = parts[0];
                var weightPart  = parts[1].Remove(parts[1].Length - 1, 1).Remove(0, 1);
                var weight      = int.Parse(weightPart);
                discWeights.Add(discHolding, weight);

                if (parts.Length > 2)
                {
                    for (var i = 3; i < parts.Length; i++)
                    {
                        var discBeingHeld = parts[i];
                        if (discBeingHeld.EndsWith(","))
                        {
                            discBeingHeld = discBeingHeld.Remove(discBeingHeld.Length - 1);
                        }

                        if (!mapping.ContainsKey(discHolding))
                        {
                            mapping[discHolding] = new List <string>();
                        }
                        mapping[discHolding].Add(discBeingHeld);
                    }
                }
            }

            var result = "";

            try
            {
                var top = "dgoocsw";

                GetWeight(top, mapping, discWeights);
            }
            catch (Exception ex)
            {
                result = ex.Message;
            }

            return(result);
        }
예제 #25
0
        public virtual string Solve()
        {
            var number  = int.Parse(_parser.GetData());
            int current = 0;

            foreach (var coordinate in SpiralCoordinates.GenerateCounterClockwise(number))
            {
                current = Math.Max(1, GetValueForCoordinates(coordinate.X, coordinate.Y));
                if (current > number)
                {
                    break;
                }
                _mapping.Add(coordinate, current);
            }

            return(current.ToString());
        }
예제 #26
0
        public virtual string Solve()
        {
            var input = _parser.GetData().Select(int.Parse).ToArray();

            var nextInstruction = 0;
            var steps           = 0;

            while (nextInstruction < input.Length)
            {
                var offset = input[nextInstruction];
                input[nextInstruction]++;
                nextInstruction += offset;
                steps++;
            }

            return(steps.ToString());
        }
예제 #27
0
        public virtual string Solve()
        {
            var banks = FileParser.GetData().ParseDelimitedInts('\t').ToArray();
            var seen  = new HashSet <int>();

            var hash  = banks.CreateHash();
            var count = 0;

            while (!seen.Contains(hash))
            {
                seen.Add(hash);
                hash = GetNextHash(banks);
                count++;
            }

            return(count.ToString());
        }
예제 #28
0
        public virtual string Solve()
        {
            var spin    = int.Parse(Parser.GetData());
            var current = new Node <int>(0);

            current.Next = current;
            for (var i = 1; i <= Spins; i++)
            {
                for (var spinCount = 0; spinCount < spin; spinCount++)
                {
                    current = current.Next;
                }

                current.Next = new Node <int>(i, current.Next);
                current      = current.Next;
            }
            return(current.Next.Value.ToString());
        }
예제 #29
0
        public string Solve()
        {
            var input = _parser.GetData().Trim();

            var sum    = 0;
            var offset = input.Length / 2;

            for (var i = 0; i < input.Length; i++)
            {
                var opposite = (i + offset) % input.Length;
                if (input[i] == input[opposite])
                {
                    sum += input[i] - '0';
                }
            }

            return(sum.ToString());
        }
예제 #30
0
        public virtual string Solve()
        {
            var stream = _parser.GetData();

            var depth   = 0;
            var garbage = false;
            var score   = 0;

            for (var index = 0; index < stream.Length; index++)
            {
                var c = stream[index];
                if (c == '!')
                {
                    index++;
                    continue;
                }

                if (!garbage)
                {
                    switch (c)
                    {
                    case '{':
                        depth++;
                        break;

                    case '}':
                        score += depth;
                        depth--;
                        break;

                    case '<':
                        garbage = true;
                        break;
                    }
                }
                else if (c == '>')
                {
                    garbage = false;
                }
            }
            return(score.ToString());
        }