public string Run(Aoc.Framework.Part part) { if (part == Aoc.Framework.Part.Part1) { // Prepare the data Queue <(long, long)> queue = new Queue <(long, long)>(); for (int i = 0; i < _count; ++i) { queue.Enqueue((i + 1, 1)); } // Process the queue while (queue.TryDequeue(out var elf)) { if (!queue.TryDequeue(out var next)) { // The elf is the last one, he won return(elf.Item1.ToString()); } // Steal the presents ! queue.Enqueue((elf.Item1, elf.Item2 + next.Item2)); } return("not found"); } if (part == Aoc.Framework.Part.Part2) { // The same with another structure SparseArray <long> elves = new SparseArray <long>(_count); for (long i = 0; i < elves.Length; ++i) { elves[i] = 1; } // Process the array long current = 0; long opposite = elves.RealLength / 2; while (elves.RealLength > 1) { elves[current] += elves[opposite]; elves.RemoveAt(opposite); if (elves.RealLength % 2 == 0) { opposite = elves.Next(opposite, 2); } else { opposite = elves.Next(opposite, 1); } current = elves.Next(current); } return((current + 1).ToString()); } return(""); }