public string PartTwo() { var N = 1000000; var cups = new int[N]; var highestCup = CupLabels.Max(); for (var i = 0; i < N; i++) { if (i < highestCup) { cups[i] = CupLabels[i]; } else { cups[i] = i + 1; } } var cupCircle = new CupCircle(cups); PlayNMoves(cupCircle, N * 10, cupCircle.CupWithLabel(CupLabels[0]), N); var cup1 = cupCircle.CupWithLabel(1).Next; var cup2 = cup1.Next; var result = (Int64)cup1.Label * (Int64)cup2.Label; return(result.ToString()); }
private static void Run(CupCircle circle, int iterations) { var current = circle.Start; for (int i = 0; i < iterations; i++) { var pickup1 = circle.Next(current); var pickup2 = circle.Next(pickup1); var pickup3 = circle.Next(pickup2); var destination = current; do { destination--; if (destination == 0) { destination = circle.Max; } }while (destination == pickup1 || destination == pickup2 || destination == pickup3); circle.Link(current, circle.Next(pickup3)); circle.Link(pickup3, circle.Next(destination)); circle.Link(destination, pickup1); current = circle.Next(current); } }
private void PlayNMoves(CupCircle cupCircle, int nMoves, Cup firstCup, int highestCupLabel) { var cup = firstCup; for (var move = 0; move < nMoves; move++) { var pickedUpCups = cupCircle.PickUpNextThreeCups(cup); var pickedUpLabels = new int[3]; var currentCup = pickedUpCups; for (var i = 0; i < 3; i++) { pickedUpLabels[i] = currentCup.Label; currentCup = currentCup.Next; } var destination = cup.Label > 1 ? cup.Label - 1 : highestCupLabel; while (pickedUpLabels.Contains(destination)) { destination = destination > 1 ? destination - 1 : highestCupLabel; } var destinationCup = cupCircle.CupWithLabel(destination); cupCircle.PlaceCupsAfter(pickedUpCups, destinationCup); cup = cup.Next; } }
public object GetResult1() { Cups = new CupCircle(startingCups); RunFor(100); return(FormatResult()); }
private static string Part1(string input, int iterations = 100) { var cups = Parse(input); var circle = new CupCircle(cups); Run(circle, iterations); return(string.Join("", circle.From(1).Skip(1))); }
private static long Part2(string input) { var cups = Parse(input); var circle = new CupCircle(cups, 1000000); Run(circle, 10000000); var star1 = circle.Next(1); var star2 = circle.Next(star1); return((long)star1 * (long)star2); }
public string PartOne() { var cupCircle = new CupCircle(CupLabels); PlayNMoves(cupCircle, 100, cupCircle.CupWithLabel(CupLabels[0]), CupLabels.Max()); var cup = cupCircle.CupWithLabel(1); var labels = ""; for (var i = 0; i < CupLabels.Length - 1; i++) { cup = cup.Next; labels += cup.Label.ToString(); } return(labels); }
public object GetResult2() { var allCups = new long[1000000]; for (int n = 0; n < allCups.Length; n++) { allCups[n] = n + 1; } for (int n = 0; n < startingCups.Length; n++) { allCups[n] = startingCups[n]; } Cups = new CupCircle(allCups); RunFor(10000000); var cup1 = Cups.Cups[0]; return(cup1.ClockWise.Number * cup1.ClockWise.ClockWise.Number); }