| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- using System;
- using System.Collections;
- using System.Text;
- namespace D16._1
- {
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine($"Part 1 : {FillHardDrive(args[0], 272)}");
- Console.WriteLine($"Part 2 : {FillHardDrive(args[0], 35651584)}");
- }
- private static string FillHardDrive(string input, int diskSize)
- {
- bool[] bs = new bool[input.Length];
- for (int i = 0; i < input.Length; i++)
- bs[i] = input[i] == '1' ? true : false;
- var ba = new BitArray(bs);
- while (ba.Length < diskSize)
- {
- var bab = new BitArray(ba.Length * 2 + 1);
- var l = ba.Count;
- for (int i = 0; i < l; ++i)
- {
- bab.Set(i, ba.Get(i));
- bab.Set(l + l - i, !ba.Get(i));
- }
- ba = bab;
- }
- int le = diskSize;
- while (ba.Length > 17)
- {
- le /= 2;
- BitArray cs = new BitArray(le);
- for (int i = 0; i < le; ++i)
- {
- var p = ((ba.Get(i * 2) ? 1 : 0) << 1) + (ba.Get(i * 2 + 1) ? 1 : 0);
- cs.Set(i, p == 0b11 || p == 0b00);
- }
- ba = cs;
- }
- var sb = new StringBuilder();
- foreach (bool b in ba) sb.Append(b ? "1" : "0");
- return sb.ToString();
- }
- }
- }
|