private static void Play(string prefix, int numberOfPlayers, int numberOfMarbels) { var currentPlayer = 0; var score = new long[numberOfPlayers + 1]; var gamefield = new LinkedList <int>(); LinkedListNode <int> currentNode = gamefield.AddFirst(0); var consoleSpinner = new ConsoleSpiner(); for (var i = 1; i <= numberOfMarbels; i++) { currentPlayer = Math.Max(1, ++currentPlayer % (numberOfPlayers + 1)); if (i % 23 == 0) { score[currentPlayer] += i; var moveLeft = 7; while (moveLeft > 0) { moveLeft--; currentNode = currentNode.Previous ?? gamefield.Last; } score[currentPlayer] += currentNode.Value; LinkedListNode <int> next = currentNode.Next ?? gamefield.First; gamefield.Remove(currentNode); currentNode = next; } else { currentNode = gamefield.AddAfter(currentNode.Next ?? gamefield.First, i); } if (i % 1000 == 0) { consoleSpinner.Spin(); } } consoleSpinner.Done(); Console.WriteLine($"{prefix}: The winning elfs score is \"{score.Max()}\""); }
private static void Main(string[] args) { ManualResetEvent ctrlC = GetExitEvent(); var recipes = new LinkedList <Recipe>(); var elves = new[] { new Elf(), new Elf() }; var sequence = "030121"; int numberOfRecipes = int.Parse(sequence); elves[0].CurrentRecipe = recipes.AddFirst(new Recipe(GetNextReceipeIndex(), 3)); elves[1].CurrentRecipe = recipes.AddLast(new Recipe(GetNextReceipeIndex(), 7)); var consoleSpinner = new ConsoleSpiner(); for (var i = 0; i < numberOfRecipes + 10; i++) { if (i % 1000 == 0) { consoleSpinner.Spin(); } GenerateRecipes(recipes, elves); } consoleSpinner.Done(); LinkedListNode <Recipe> next = recipes.First; for (var i = 0; i < numberOfRecipes; i++) { next = next.Next; } var sb = new StringBuilder(); for (var j = 0; j < 10; j++) { sb.Append(next.Value.Score); next = next.Next; } Console.WriteLine($"Day 14: The score of the next then recipes after the first \"{numberOfRecipes}\" is \"{sb}\""); next = recipes.First; var predicate = new int[sequence.Length]; var k = 0; while (true) { k++; if (k % 100000 == 0) { consoleSpinner.Spin(); } Array.Copy(predicate, 1, predicate, 0, predicate.Length - 1); predicate[predicate.Length - 1] = next.Value.Score; if (string.Join("", predicate) == sequence) { break; } if (next.Next == null) { GenerateRecipes(recipes, elves); } next = next.Next; } consoleSpinner.Done(); Console.WriteLine($"Part Two: \"{next.Previous.Value.Index + 1 - sequence.Length}\" recipies appear on the scoreboard to the left."); ctrlC.WaitOne(); }