1
0

Program.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text.RegularExpressions;
  7. namespace D10._1
  8. {
  9. class Map : List<(int x, int y, int vx, int vy)> { }
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. if (args.Length < 1) return;
  15. if (File.Exists(args[0]) == false) return;
  16. var file = File.OpenText(args[0]);
  17. var r = new Regex(@"position=<\s*(?<posx>-?\d+),\s*(?<posy>-?\d+)> velocity=<\s*(?<vx>-?\d+),\s*(?<vy>-?\d+)>");
  18. var map = new Map();
  19. do
  20. {
  21. var line = file.ReadLine();
  22. if (line == null) break;
  23. var result = r.Match(line);
  24. map.Add((
  25. int.Parse(result.Groups["posx"].Value),
  26. int.Parse(result.Groups["posy"].Value),
  27. int.Parse(result.Groups["vx"].Value),
  28. int.Parse(result.Groups["vy"].Value)
  29. ));
  30. } while (true);
  31. int tt = 0;
  32. do
  33. {
  34. for (var i = 0; i< map.Count; ++i)
  35. {
  36. var star = map[i];
  37. star.x += star.vx;
  38. star.y += star.vy;
  39. map[i] = star;
  40. }
  41. } while (isOk(map) == false);
  42. int minX = map.Min(m => m.x);
  43. int minY = map.Min(m => m.y);
  44. int maxX = map.Max(m => m.x);
  45. int maxY = map.Max(m => m.y);
  46. var bmp = new Bitmap(maxX - minX + 1, maxY - minY + 1);
  47. foreach (var star in map)
  48. {
  49. bmp.SetPixel(star.x - minX, star.y - minY, Color.Red);
  50. }
  51. bmp.Save("out.bmp");
  52. }
  53. static bool isOk(Map map)
  54. {
  55. var c = 0;
  56. for (var i = 0; i < map.Count; ++i)
  57. {
  58. if (isIsolated(map, i)) c++;
  59. }
  60. return c < 100;
  61. }
  62. static bool isIsolated(Map map, int current)
  63. {
  64. var currentStar = map[current];
  65. foreach (var star in map)
  66. {
  67. if (star.x == currentStar.x && star.y == currentStar.y)
  68. continue;
  69. if (star.x == currentStar.x && (star.y == currentStar.y + 1 || star.y == currentStar.y - 1))
  70. return false;
  71. if (star.y == currentStar.y && (star.x == currentStar.x + 1 || star.x == currentStar.x - 1))
  72. return false;
  73. }
  74. return true;
  75. }
  76. }
  77. }