Program.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using System;
  2. using System.Collections;
  3. using System.Text;
  4. namespace D16._1
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. Console.WriteLine($"Part 1 : {FillHardDrive(args[0], 272)}");
  11. Console.WriteLine($"Part 2 : {FillHardDrive(args[0], 35651584)}");
  12. }
  13. private static string FillHardDrive(string input, int diskSize)
  14. {
  15. bool[] bs = new bool[input.Length];
  16. for (int i = 0; i < input.Length; i++)
  17. bs[i] = input[i] == '1' ? true : false;
  18. var ba = new BitArray(bs);
  19. while (ba.Length < diskSize)
  20. {
  21. var bab = new BitArray(ba.Length * 2 + 1);
  22. var l = ba.Count;
  23. for (int i = 0; i < l; ++i)
  24. {
  25. bab.Set(i, ba.Get(i));
  26. bab.Set(l + l - i, !ba.Get(i));
  27. }
  28. ba = bab;
  29. }
  30. int le = diskSize;
  31. while (ba.Length > 17)
  32. {
  33. le /= 2;
  34. BitArray cs = new BitArray(le);
  35. for (int i = 0; i < le; ++i)
  36. {
  37. var p = ((ba.Get(i * 2) ? 1 : 0) << 1) + (ba.Get(i * 2 + 1) ? 1 : 0);
  38. cs.Set(i, p == 0b11 || p == 0b00);
  39. }
  40. ba = cs;
  41. }
  42. var sb = new StringBuilder();
  43. foreach (bool b in ba) sb.Append(b ? "1" : "0");
  44. return sb.ToString();
  45. }
  46. }
  47. }