Initial Commit
This commit is contained in:
176
2022/Day20CSharp/Advent2022_Day20.cs
Normal file
176
2022/Day20CSharp/Advent2022_Day20.cs
Normal file
@@ -0,0 +1,176 @@
|
||||
// See https://aka.ms/new-console-template for more information
|
||||
|
||||
using System.Numerics;
|
||||
|
||||
var exampleData = new ProblemData("example-input.txt");
|
||||
Console.WriteLine("Grove Coordinates, Example: " + exampleData.GetGroveCoordinates(1,1));
|
||||
|
||||
var puzzleData = new ProblemData("puzzle-input.txt");
|
||||
Console.WriteLine("Grove Coordinates, Puzzle: " + puzzleData.GetGroveCoordinates(1,1));
|
||||
|
||||
Console.WriteLine("Grove Coordinates, Example Decrypted: " + exampleData.GetGroveCoordinates(811589153, 10));
|
||||
Console.WriteLine("Grove Coordinates, Puzzle Decrypted: " + puzzleData.GetGroveCoordinates(811589153, 10));
|
||||
|
||||
|
||||
class Item
|
||||
{
|
||||
public Item(BigInteger value)
|
||||
{
|
||||
Value = value;
|
||||
}
|
||||
|
||||
public BigInteger Value { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Value.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
class CircularList
|
||||
{
|
||||
public List<Item> Items;
|
||||
|
||||
public CircularList()
|
||||
{
|
||||
Items = new List<Item>();
|
||||
}
|
||||
|
||||
public void Add(Item item)
|
||||
{
|
||||
Items.Add(item);
|
||||
}
|
||||
|
||||
public void Move(int oldIndex, int newIndex)
|
||||
{
|
||||
if (oldIndex == newIndex) return;
|
||||
|
||||
var temp = Items[oldIndex];
|
||||
|
||||
if (newIndex == 0)
|
||||
{
|
||||
Items.RemoveAt(oldIndex);
|
||||
Items.Add(temp);
|
||||
}
|
||||
else if (newIndex == Items.Count - 1)
|
||||
{
|
||||
Items.RemoveAt(oldIndex);
|
||||
Items.Insert(0, temp);
|
||||
}
|
||||
else
|
||||
{
|
||||
Items.RemoveAt(oldIndex);
|
||||
Items.Insert(newIndex, temp);
|
||||
}
|
||||
}
|
||||
|
||||
public static void PrintList(CircularList list)
|
||||
{
|
||||
for (int ci = 0; ci < list.Items.Count; ci++)
|
||||
{
|
||||
if (ci != 0) Console.Write(", ");
|
||||
Console.Write(list.Items[ci]);
|
||||
}
|
||||
Console.WriteLine();
|
||||
}
|
||||
|
||||
public static CircularList GetMixedList(CircularList source, BigInteger decryptionKey, int mixes)
|
||||
{
|
||||
var newList = new CircularList();
|
||||
|
||||
for (int i = 0; i < source.Items.Count; i++)
|
||||
{
|
||||
source.Items[i].Value *= decryptionKey;
|
||||
|
||||
newList.Items.Add(source.Items[i]);
|
||||
}
|
||||
|
||||
for (int mixNum = 0; mixNum < mixes; mixNum++)
|
||||
{
|
||||
if (DebugPrint) Console.WriteLine("Starting mix {0} of {1}", mixNum + 1, mixes);
|
||||
|
||||
for (int i = 0; i < source.Items.Count; i++)
|
||||
{
|
||||
if (DebugPrint) Console.WriteLine("|- Mixing item {0} of {1}", i + 1, source.Items.Count);
|
||||
|
||||
var item = source.Items[i];
|
||||
|
||||
int currentIndex = newList.Items.IndexOf(item);
|
||||
int direction = item.Value > 0 ? 1 : -1;
|
||||
int newIndex = currentIndex;
|
||||
|
||||
BigInteger max = BigInteger.Abs(item.Value) % (source.Items.Count-1);
|
||||
|
||||
for (BigInteger j = 0; j < max; j++)
|
||||
{
|
||||
if (direction == 1 && newIndex == source.Items.Count - 1) newIndex = 1;
|
||||
else if (direction == -1 && newIndex == 0) newIndex = source.Items.Count - 2;
|
||||
else newIndex += direction;
|
||||
}
|
||||
|
||||
newList.Move(currentIndex, newIndex);
|
||||
}
|
||||
}
|
||||
|
||||
return newList;
|
||||
}
|
||||
|
||||
public static bool DebugPrint { get; set; } = false;
|
||||
}
|
||||
|
||||
class ProblemData
|
||||
{
|
||||
private CircularList Numbers { get; set; }
|
||||
|
||||
public CircularList GetMixedList(BigInteger decryptionKey, int mixes)
|
||||
{
|
||||
|
||||
return CircularList.GetMixedList(Numbers, decryptionKey, mixes);
|
||||
}
|
||||
|
||||
public BigInteger GetGroveCoordinates(BigInteger decryptionKey, int mixes)
|
||||
{
|
||||
BigInteger sum = 0;
|
||||
|
||||
var list = GetMixedList(decryptionKey, mixes);
|
||||
|
||||
int index = list.Items.FindIndex(x => x.Value == 0);
|
||||
|
||||
for (int i = 0; i <= 3000; i++)
|
||||
{
|
||||
if (i % 1000 == 0)
|
||||
{
|
||||
sum += list.Items[index].Value;
|
||||
}
|
||||
|
||||
if (index == list.Items.Count-1)
|
||||
{
|
||||
index = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
public ProblemData(string filename)
|
||||
{
|
||||
Numbers = new CircularList();
|
||||
|
||||
using (StreamReader reader = System.IO.File.OpenText(filename))
|
||||
{
|
||||
while (!reader.EndOfStream)
|
||||
{
|
||||
var line = reader.ReadLine();
|
||||
if (line == null) throw new InvalidDataException();
|
||||
|
||||
var value = Int32.Parse(line);
|
||||
|
||||
Numbers.Add(new Item(value));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user