using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Text.RegularExpressions; namespace D10._1 { class Map : List<(int x, int y, int vx, int vy)> { } class Program { static void Main(string[] args) { if (args.Length < 1) return; if (File.Exists(args[0]) == false) return; var file = File.OpenText(args[0]); var r = new Regex(@"position=<\s*(?-?\d+),\s*(?-?\d+)> velocity=<\s*(?-?\d+),\s*(?-?\d+)>"); var map = new Map(); do { var line = file.ReadLine(); if (line == null) break; var result = r.Match(line); map.Add(( int.Parse(result.Groups["posx"].Value), int.Parse(result.Groups["posy"].Value), int.Parse(result.Groups["vx"].Value), int.Parse(result.Groups["vy"].Value) )); } while (true); int tt = 0; do { for (var i = 0; i< map.Count; ++i) { var star = map[i]; star.x += star.vx; star.y += star.vy; map[i] = star; } } while (isOk(map) == false); int minX = map.Min(m => m.x); int minY = map.Min(m => m.y); int maxX = map.Max(m => m.x); int maxY = map.Max(m => m.y); var bmp = new Bitmap(maxX - minX + 1, maxY - minY + 1); foreach (var star in map) { bmp.SetPixel(star.x - minX, star.y - minY, Color.Red); } bmp.Save("out.bmp"); } static bool isOk(Map map) { var c = 0; for (var i = 0; i < map.Count; ++i) { if (isIsolated(map, i)) c++; } return c < 100; } static bool isIsolated(Map map, int current) { var currentStar = map[current]; foreach (var star in map) { if (star.x == currentStar.x && star.y == currentStar.y) continue; if (star.x == currentStar.x && (star.y == currentStar.y + 1 || star.y == currentStar.y - 1)) return false; if (star.y == currentStar.y && (star.x == currentStar.x + 1 || star.x == currentStar.x - 1)) return false; } return true; } } }