コード例 #1
0
        private static int CountNanoBotInRange(NanoBot coord, List <NanoBot> nanoBots)
        {
            int nanoBotsInRange = 0;

            foreach (var item in nanoBots)
            {
                if (item.ManhattanDistanceFrom(coord) <= item.Radius)
                {
                    nanoBotsInRange++;
                }
            }

            return(nanoBotsInRange);
        }
コード例 #2
0
 public long ManhattanDistanceFrom(NanoBot nanoBot)
 {
     return(Math.Abs(nanoBot.X - X) + Math.Abs(nanoBot.Y - Y) + Math.Abs(nanoBot.Z - Z));
 }
コード例 #3
0
        static void Main(string[] args)
        {
            var lines = File.ReadAllLines("input.txt")
                        .Where(l => !string.IsNullOrWhiteSpace(l))
                        .ToList();

            Regex rx = new Regex(@"pos=<(-?\d+),(-?\d+),(-?\d+)>, r=(\d+)");

            List <NanoBot> nanoBots = new List <NanoBot>();

            foreach (var item in lines)
            {
                MatchCollection matches = rx.Matches(item);

                foreach (Match match in matches)
                {
                    var groups = match.Groups;

                    long px = long.Parse(groups[1].ToString(), System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture);
                    long py = long.Parse(groups[2].ToString(), System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture);
                    long pz = long.Parse(groups[3].ToString(), System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture);
                    long r  = long.Parse(groups[4].ToString(), System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture);

                    nanoBots.Add(new NanoBot(px, py, pz, r));
                }
            }

            var bestRadius = nanoBots.Max(n => n.Radius);
            var nanoBot    = nanoBots.First(n => n.Radius == bestRadius);

            Console.WriteLine(nanoBots.Where(n => n.ManhattanDistanceFrom(nanoBot) <= bestRadius).Count());

            Random rand = new Random(DateTime.Now.Millisecond);

            //int minx = (int)nanoBots.Min(n => n.X);
            //int miny = (int)nanoBots.Min(n => n.Y);
            //int minz = (int)nanoBots.Min(n => n.Z);

            //int maxx = (int)nanoBots.Max(n => n.X);
            //int maxy = (int)nanoBots.Max(n => n.Y);
            //int maxz = (int)nanoBots.Max(n => n.Z);

            int minx = 18140327 - 400000; // (int)nanoBots.Min(n => n.X);
            int miny = 52767466 - 400000; // (int)nanoBots.Min(n => n.Y);
            int minz = 58536384 - 400000; // (int)nanoBots.Min(n => n.Z);

            int maxx = 18140327 + 400000; // (int)nanoBots.Min(n => n.X);
            int maxy = 52767466 + 400000; // (int)nanoBots.Min(n => n.Y);
            int maxz = 58536384 + 400000; // (int)nanoBots.Min(n => n.Z);

            int  nanoBotCount     = 0;
            long shortestDistance = long.MaxValue;

            while (nanoBotCount < 1000)
            {
                long x       = rand.Next(minx, maxx);
                long y       = rand.Next(miny, maxy);
                long z       = rand.Next(minz, maxz);
                var  testBot = new NanoBot(x, y, z, 0);
                var  c       = CountNanoBotInRange(testBot, nanoBots);
                if (c >= nanoBotCount && testBot.ManhattanDistance < shortestDistance)
                {
                    nanoBotCount     = c;
                    shortestDistance = testBot.ManhattanDistance;
                    Console.WriteLine($"{x},{y},{z} - {nanoBotCount} - {shortestDistance}");
                }
            }

            // 133894881 (to high)
            // 19210606,52359779,59674126 - 878 - 131244511
            // 18887560,53186405,58963532 - 907 - 131037497
            // 18140327,52767466,58536384 - 910 - 129444177
            // 18174334,52961133,58308710 - 910 - 129444177
        }