1
0
www.mikescher.com/www/statics/aoc/2018/12_solution-2.linq
2019-12-02 14:27:20 +01:00

60 lines
1.9 KiB
C#

<Query Kind="Statements" />
var input_initial = File.ReadAllLines(Path.Combine(Path.GetDirectoryName(Util.CurrentQueryPath), @"12_input.txt"))[0].Substring(15).Select(p => p == '#' ? 1 : 0).ToArray();
var input_rules = File
.ReadAllLines(Path.Combine(Path.GetDirectoryName(Util.CurrentQueryPath), @"12_input.txt"))
.Skip(1)
.Where(p => !string.IsNullOrWhiteSpace(p))
.Select(p => (p.Split(' ')[0].Select(q => q == '#' ? 1 : 0).ToArray(), p.Split(' ')[2][0] == '#' ? 1 : 0))
.Select(p => (p.Item1.Reverse().Select((u, i) => (u << i)).Aggregate((s, t) => s | t), p.Item2))
.OrderBy(p => p.Item1)
.Select(p => p.Item2)
.ToArray();
int LEN = 2 * 2000 + input_initial.Length + 2 * 2000;
int OFF = LEN / 2 - input_initial.Length / 2;
int[] pots = new int[LEN];
int[] ipots = new int[LEN];
//input_initial.Dump();
//input_rules.Dump();
for (int i = 0; i < input_initial.Length; i++) pots[i + OFF] = input_initial[i];
int hashOffset = 0;
string lastHash = "";
for (long gen = 0; gen < 50000000000L; gen++)
{
for (int p = 2; p < pots.Length - 2; p++)
{
var rule = (pots[p - 2] << 4) | (pots[p - 1] << 3) | (pots[p - 0] << 2) | (pots[p + 1] << 1) | (pots[p + 2] << 0);
ipots[p] = input_rules[rule];
}
for (int p = 0, q = 0; p < pots.Length; pots[p++] = ipots[q++]);
var currHash = string.Join("", pots.SkipWhile(p => p == 0).Reverse().SkipWhile(p => p == 0).Select(p => p.ToString()));
if (currHash == lastHash)
{
checked
{
var hashOffsetNew = pots.TakeWhile(p => p == 0).Count();
var drift = (hashOffsetNew - hashOffset);
var score_curr = pots.Select((p, i) => (p, i - OFF)).Where(p => p.p > 0).Sum(p => p.Item2);
var count_curr = pots.Sum();
var score_Future = score_curr + (50_000_000_000 - (gen + 1)) * count_curr;
score_Future.Dump();
$"stable after {gen} Generations with generational drift of {drift}".Dump();
return;
}
}
lastHash = currHash;
hashOffset = pots.TakeWhile(p => p==0).Count();
}
"ERROR - UNSTABLE".Dump();