Initial Commit
This commit is contained in:
171
2024/Day03CSharp/Program.cs
Normal file
171
2024/Day03CSharp/Program.cs
Normal file
@@ -0,0 +1,171 @@
|
||||
using System.Numerics;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
var exParsed = new Day03Parsed("example-input.txt");
|
||||
var ex2Parsed = new Day03Parsed("example-input2.txt");
|
||||
|
||||
Console.WriteLine("Example Part01: {0}", exParsed.GetPart01());
|
||||
Console.WriteLine("Example Part02: {0}", ex2Parsed.GetPart02());
|
||||
|
||||
var pzParsed = new Day03Parsed("puzzle-input.txt");
|
||||
|
||||
Console.WriteLine("Puzzle Part01: {0}", pzParsed.GetPart01());
|
||||
Console.WriteLine("Puzzle Part02: {0}", pzParsed.GetPart02());
|
||||
|
||||
|
||||
public class Mul
|
||||
{
|
||||
private static readonly int INVALID_VALUE = 9999;
|
||||
|
||||
private int leftOperand = INVALID_VALUE;
|
||||
private int rightOperand = INVALID_VALUE;
|
||||
|
||||
public int LeftOperand { get { return leftOperand; } }
|
||||
public int RightOperand { get { return rightOperand; } }
|
||||
|
||||
public Mul(string line)
|
||||
{
|
||||
try
|
||||
{
|
||||
var split = line.Split(',');
|
||||
|
||||
// left side
|
||||
var leftOperand = split[0].Substring("mul(".Length);
|
||||
System.Diagnostics.Debug.Assert(leftOperand.Length <= 3);
|
||||
|
||||
this.leftOperand = Int32.Parse(leftOperand);
|
||||
|
||||
// right side
|
||||
var rightOperand = split[1].Split(')')[0];
|
||||
System.Diagnostics.Debug.Assert(rightOperand.Length <= 3);
|
||||
|
||||
this.rightOperand = Int32.Parse(rightOperand);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsValid()
|
||||
{
|
||||
return leftOperand != INVALID_VALUE && rightOperand != INVALID_VALUE;
|
||||
}
|
||||
|
||||
public int GetResult()
|
||||
{
|
||||
if (!IsValid()) throw new Exception("OBJECT INVALID YO");
|
||||
|
||||
return leftOperand * rightOperand;
|
||||
}
|
||||
}
|
||||
|
||||
class Day03Parsed : AdventCommon.ParsedInput
|
||||
{
|
||||
public Day03Parsed(string fileName) : base(fileName)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private int part01 = 0;
|
||||
private int part02 = 0;
|
||||
|
||||
private void UpdatePart01(string line)
|
||||
{
|
||||
string pattern = @"mul\([0-9]{1,3},[0-9]{1,3}\)";
|
||||
|
||||
var m = Regex.Match(line, pattern);
|
||||
|
||||
while (m.Success)
|
||||
{
|
||||
var mul = new Mul(m.Value);
|
||||
part01 += mul.GetResult();
|
||||
|
||||
//Console.WriteLine("'{0}' found at position {1}", m.Value, m.Index);
|
||||
m = m.NextMatch();
|
||||
}
|
||||
}
|
||||
|
||||
private bool UpdatePart02(string line, bool lastMul)
|
||||
{
|
||||
bool mulEnabled = lastMul;
|
||||
|
||||
SortedDictionary<int, string> ops = new SortedDictionary<int, string>();
|
||||
|
||||
string[] patterns = [
|
||||
@"mul\([0-9]{1,3},[0-9]{1,3}\)",
|
||||
@"do\(\)",
|
||||
@"don't\(\)"
|
||||
];
|
||||
|
||||
foreach (var pattern in patterns)
|
||||
{
|
||||
for (var r = Regex.Match(line, pattern); r.Success; r = r.NextMatch())
|
||||
{
|
||||
ops.Add(r.Index, r.Value);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var op in ops)
|
||||
{
|
||||
//Console.WriteLine("{ " + op.Value + " }");
|
||||
|
||||
string canary = "mul(549,60)";
|
||||
if (op.Value.Contains(canary))
|
||||
{
|
||||
//Console.WriteLine("poop");
|
||||
}
|
||||
|
||||
if (mulEnabled)
|
||||
{
|
||||
var m = new Mul(op.Value);
|
||||
|
||||
if (m.IsValid())
|
||||
{
|
||||
part02 += m.GetResult();
|
||||
|
||||
// Console.WriteLine("Added: {0}", m.GetResult());
|
||||
//Console.WriteLine("New: {0}", part02);
|
||||
}
|
||||
|
||||
// m not valid, is it a don't?
|
||||
if (op.Value.Contains("don't"))
|
||||
{
|
||||
//Console.WriteLine("Setting do() to false");
|
||||
mulEnabled = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (op.Value.Contains("do()"))
|
||||
{
|
||||
//Console.WriteLine("Setting do() to true");
|
||||
mulEnabled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mulEnabled;
|
||||
}
|
||||
|
||||
private bool lastMulEnabled = true;
|
||||
|
||||
public override bool ParseLine(string line, object? context = null)
|
||||
{
|
||||
UpdatePart01(line);
|
||||
|
||||
lastMulEnabled = UpdatePart02(line, lastMulEnabled);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override int GetPart01()
|
||||
{
|
||||
return part01;
|
||||
}
|
||||
|
||||
public override int GetPart02()
|
||||
{
|
||||
return part02;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user