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()); }
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); }