Initial Commit

This commit is contained in:
Jose Caban
2025-11-30 20:28:10 -05:00
commit e9ac699e67
209 changed files with 39737 additions and 0 deletions

View 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));
}
}
}
}