111 lines
3.9 KiB
C#
111 lines
3.9 KiB
C#
// See https://aka.ms/new-console-template for more information
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace day05
|
|
{
|
|
class Program
|
|
{
|
|
public static void Main(string[] args)
|
|
{
|
|
Console.WriteLine("Hello from day05");
|
|
string input = File.ReadAllText(@"./input.txt");
|
|
string[] lines = input.Split(
|
|
new string[] { Environment.NewLine },
|
|
StringSplitOptions.None
|
|
);
|
|
Console.WriteLine((lines[0].Length / 4) + 1);
|
|
List<char>[] stacks = new List<char>[(lines[0].Length / 4) + 1];
|
|
List<char>[] stacks2 = new List<char>[(lines[0].Length / 4) + 1];
|
|
for (int i = 0; i < stacks.Length; i++)
|
|
{
|
|
stacks[i] = new List<char>();
|
|
stacks2[i] = new List<char>();
|
|
}
|
|
int instructionsStartLine = 0;
|
|
foreach (var line in lines.Select((val, index) => new { val, index }))
|
|
{
|
|
if (line.val.Length > 0)
|
|
{
|
|
if (line.val[0].Equals('m'))
|
|
{
|
|
Console.WriteLine("Read all Elements");
|
|
instructionsStartLine = line.index;
|
|
break;
|
|
}
|
|
for (int i = 0; i < line.val.Length; i += 4)
|
|
{
|
|
if (line.val[i].Equals('['))
|
|
{
|
|
Console.WriteLine("Gotcha" + line.val[i + 1]);
|
|
stacks[i / 4].Add(line.val[i + 1]);
|
|
stacks2[i / 4].Add(line.val[i + 1]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (int i = 0; i < stacks.Length; i++)
|
|
{
|
|
stacks[i].Reverse();
|
|
stacks2[i].Reverse();
|
|
}
|
|
List<Instruction> instrucList = new List<Instruction>();
|
|
for (int i = instructionsStartLine; i < lines.Length; i++)
|
|
{
|
|
List<int> nums = new List<int>();
|
|
foreach (string word in lines[i].Split(" "))
|
|
{
|
|
if (Regex.IsMatch(word, "^[\\d+$]"))
|
|
{
|
|
nums.Add(int.Parse(word));
|
|
}
|
|
}
|
|
if (nums.Count > 0)
|
|
{
|
|
instrucList.Add(new Instruction(nums[0], nums[1], nums[2]));
|
|
}
|
|
}
|
|
foreach (Instruction instruc in instrucList)
|
|
{
|
|
List<char> part2Items = new List<char>();
|
|
for (int i = 0; i < instruc.Ammont; i++)
|
|
{
|
|
// Part 1
|
|
stacks[instruc.Destination].Add(stacks[instruc.Source].Last());
|
|
stacks[instruc.Source].RemoveAt(stacks[instruc.Source].Count - 1);
|
|
part2Items.Add(stacks2[instruc.Source].Last());
|
|
stacks2[instruc.Source].RemoveAt(stacks2[instruc.Source].Count - 1);
|
|
}
|
|
part2Items.Reverse();
|
|
stacks2[instruc.Destination].AddRange(part2Items);
|
|
}
|
|
// Print Results
|
|
Console.WriteLine("Part 1 Results:\n");
|
|
foreach (List<char> stack in stacks)
|
|
{
|
|
Console.Write(stack[stack.Count - 1] + "\t");
|
|
|
|
}
|
|
Console.WriteLine();
|
|
Console.WriteLine("Part 2 Results:\n");
|
|
foreach (List<char> stack in stacks2)
|
|
{
|
|
Console.Write(stack[stack.Count - 1] + "\t");
|
|
}
|
|
}
|
|
}
|
|
|
|
struct Instruction
|
|
{
|
|
public Instruction(int ammont, int source, int destination)
|
|
{
|
|
Ammont = ammont;
|
|
Source = source - 1;
|
|
Destination = destination - 1;
|
|
}
|
|
|
|
public int Ammont { get; }
|
|
public int Source { get; }
|
|
public int Destination { get; }
|
|
}
|
|
}
|