static void Main(string[] args) { // part 1 var part_1_cups = "362981754".Select(c => Convert.ToInt64(c.ToString())).ToList(); move_cups(ref part_1_cups, 100); var cups_after_one = new StringBuilder(); var output_cup_index = part_1_cups.IndexOf(1) + 1; for (var i = 0; i < part_1_cups.Count - 1; i++, output_cup_index++) { if (output_cup_index == part_1_cups.Count) { output_cup_index = 0; } cups_after_one.Append(part_1_cups[output_cup_index].ToString()); } Console.WriteLine(cups_after_one.ToString()); // part 2 var part_2_cups = "362981754".Select(c => Convert.ToInt64(c.ToString())).ToList(); var part_2_cup_dictionary = new Dictionary <long, CircularListNode>(); var part_2_cups_max = part_2_cups.Max(); var part_2_cups_min = part_2_cups.Min(); for (var i = part_2_cups_max + 1; i <= 1_000_000; i++) { part_2_cups.Add(i); } part_2_cups_max = 1_000_000; var list_head = new CircularListNode(part_2_cups[0]); var current_cup = list_head; part_2_cup_dictionary[part_2_cups[0]] = list_head; for (var i = 1; i < part_2_cups.Count; i++) { current_cup.Next = new CircularListNode(part_2_cups[i]); current_cup = current_cup.Next; part_2_cup_dictionary[part_2_cups[i]] = current_cup; } current_cup.Next = list_head; move_cups(ref list_head, 10_000_000, part_2_cups_min, part_2_cups_max, part_2_cup_dictionary); Console.WriteLine(part_2_cup_dictionary[1].Next.value * part_2_cup_dictionary[1].Next.Next.value); }
// the fast way static void move_cups(ref CircularListNode _current_cup, int _moves, long _min_value, long _max_value, Dictionary <long, CircularListNode> _cup_dictionary) { // perform moves for (var i = 0; i < _moves; i++) { var triplet_head = _current_cup.Next; _current_cup.Next = triplet_head.Next.Next.Next; triplet_head.Next.Next.Next = null; var destination_cup_value = _current_cup.value - 1; while ( triplet_head.value == destination_cup_value || triplet_head.Next.value == destination_cup_value || triplet_head.Next.Next.value == destination_cup_value ) { destination_cup_value--; } if (destination_cup_value < _min_value) { destination_cup_value = _max_value; } while ( triplet_head.value == destination_cup_value || triplet_head.Next.value == destination_cup_value || triplet_head.Next.Next.value == destination_cup_value ) { destination_cup_value--; } var destination_cup_node = _cup_dictionary[destination_cup_value]; triplet_head.Next.Next.Next = destination_cup_node.Next; destination_cup_node.Next = triplet_head; _current_cup = _current_cup.Next; } }
public CircularListNode(long _value) { this.value = _value; this.Next = null; }