using System.Collections.Frozen; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.Intrinsics.X86; using System.Text; using Microsoft.CodeAnalysis; using Microsoft.VisualBasic; using Spectre.Console; namespace AdventOfCode.Days; public class Day25 : Day { public override int Number => 25; public override string Name => "Code Chronicle"; public override void RunPart1(bool display = true) { var (locks, keys) = ParseInput(); var workingPairs = 0; foreach (var lockToTest in locks) { foreach (var key in keys) { if (lockToTest.Height1 + key.Height1 < 6 && lockToTest.Height2 + key.Height2 < 6 && lockToTest.Height3 + key.Height3 < 6 && lockToTest.Height4 + key.Height4 < 6 && lockToTest.Height5 + key.Height5 < 6) { workingPairs++; } } } if (display) { AnsiConsole.MarkupLine($"[green]Amont of unique key/lock pairs that fit: [yellow]{workingPairs}[/][/]"); } } public override void RunPart2(bool display = true) { } private (List Locks, List Keys) ParseInput() { var locks = new List(); var keys = new List(); Span itemHeights = stackalloc int[5]; var input = Input.AsSpan(); foreach (var itemRange in input.Split($"{Environment.NewLine}{Environment.NewLine}")) { var item = input[itemRange]; var lines = item.EnumerateLines(); var isKey = false; // Reset item heights itemHeights[0] = -1; itemHeights[1] = -1; itemHeights[2] = -1; itemHeights[3] = -1; itemHeights[4] = -1; for (var height = 0; height <= 6; height++) { lines.MoveNext(); var line = lines.Current; if (height is 0) { isKey = line is "....."; continue; } for (var i = 0; i < 5; i++) { if (isKey && line[i] is '#' && itemHeights[i] is -1) { itemHeights[i] = 6 - height; } else if (!isKey && line[i] is '.' && itemHeights[i] is -1) { itemHeights[i] = height - 1; } } } if (isKey) { keys.Add(new Key(itemHeights[0], itemHeights[1], itemHeights[2], itemHeights[3], itemHeights[4])); } else { locks.Add(new Lock(itemHeights[0], itemHeights[1], itemHeights[2], itemHeights[3], itemHeights[4])); } } return (locks, keys); } private readonly record struct Lock(int Height1, int Height2, int Height3, int Height4, int Height5); private readonly record struct Key(int Height1, int Height2, int Height3, int Height4, int Height5); }