using System.Collections.Generic;
namespace AdventOfCode2022.Days
public static void Main()
string test20 = "1\r\n2\r\n-3\r\n3\r\n-2\r\n0\r\n4";
Console.WriteLine(Day20.SumOfCoords(test20));
public static int SumOfCoords(string input)
int[] numbers = input.Split("\r\n").Select(n => Int32.Parse(n)).ToArray();
int len = numbers.Length;
List<ListNode> nodes = new();
for (int i = 0; i < len; i++)
nodes.Add(new(num, null, null, i));
for (int i = 0; i < len; i++)
nodes[i].Prev = i != 0 ? nodes[i - 1] : nodes[^1];
nodes[i].Next = i != mod ? nodes[i + 1] : nodes[0];
Dictionary<int, ListNode> indices = nodes.ToDictionary(n => n.Index, n => n);
for (int i = 0; i < len; i++)
ListNode node = indices[i];
if (node.Value % mod == 0)
ListNode.Move(ref node, node.Value);
var zero = nodes.First(n => n.Value == 0);
sum += zero.Traverse(1000).Value;
sum += zero.Traverse(2000).Value;
sum += zero.Traverse(3000).Value;
public int Value { get; }
public ListNode? Prev { get; set; }
public ListNode? Next { get; set; }
public int Index { get; }
public ListNode Traverse(int distance)
for (int i = 0; i < distance; i++)
public static void Move(ref ListNode node, int distance)
for (int i = 0; i > distance; i--)
node.Prev.Next = node.Next;
node.Next.Prev = node.Prev;
for (int i = 0; i < distance; i++)
node.Prev.Next = node.Next;
node.Next.Prev = node.Prev;
public ListNode(int value, ListNode? prev, ListNode? next, int index)