Ejemplo n.º 1
0
        public string ResolvePart1(string[] inputs)
        {
            List <NanoBot> nanoBots     = NanoBot.ListFromStrings(inputs);
            NanoBot        bestNanoBot  = nanoBots.OrderBy(nanoBot => nanoBot.Range).LastOrDefault();
            int            countInRange = nanoBots.Where(nanoBot => bestNanoBot.InRange(nanoBot)).Count();

            return(countInRange.ToString());
        }
Ejemplo n.º 2
0
        public string ResolvePart2(string[] inputs)
        {
            List <NanoBot> nanoBots = NanoBot.ListFromStrings(inputs);
            long           maxX     = long.MinValue;
            long           maxY     = long.MinValue;
            long           maxZ     = long.MinValue;
            long           minX     = long.MaxValue;
            long           minY     = long.MaxValue;
            long           minZ     = long.MaxValue;

            foreach (NanoBot nanoBot in nanoBots)
            {
                if (nanoBot.X < minX)
                {
                    minX = nanoBot.X;
                }
                if (nanoBot.X > maxX)
                {
                    maxX = nanoBot.X;
                }
                if (nanoBot.Y < minY)
                {
                    minY = nanoBot.Y;
                }
                if (nanoBot.Y > maxY)
                {
                    maxY = nanoBot.Y;
                }
                if (nanoBot.Z < minZ)
                {
                    minZ = nanoBot.Z;
                }
                if (nanoBot.Z > maxZ)
                {
                    maxZ = nanoBot.Z;
                }
            }
            long sizeX = maxX - minX;
            long sizeY = maxY - minY;
            long sizeZ = maxZ - minZ;
            long scale = Math.Min(sizeX, Math.Min(sizeY, sizeZ));

            do
            {
                scale /= 2;
                if (scale <= 0)
                {
                    scale = 1;
                }

                long bestX     = 0;
                long bestY     = 0;
                long bestZ     = 0;
                long bestCount = 0;
                for (long k = minZ; k <= maxZ; k += scale)
                {
                    for (long j = minY; j <= maxY; j += scale)
                    {
                        for (long i = minX; i <= maxX; i += scale)
                        {
                            int count = 0;
                            foreach (NanoBot nanoBot in nanoBots)
                            {
                                if (nanoBot.InRange(i, j, k, scale))
                                {
                                    count++;
                                }
                            }
                            if (count > bestCount)
                            {
                                bestX     = i;
                                bestY     = j;
                                bestZ     = k;
                                bestCount = count;
                            }
                        }
                    }
                }

                minX = bestX - scale;
                maxX = bestX + scale;
                minY = bestY - scale;
                maxY = bestY + scale;
                minZ = bestZ - scale;
                maxZ = bestZ + scale;

                if (scale == 1)
                {
                    long distance = bestX + bestY + bestZ;
                    return(distance.ToString());
                }
            } while (true);
        }