112 lines
3.0 KiB
C#
112 lines
3.0 KiB
C#
/*
|
|
* Advent of Code 2016
|
|
* Day 12 (part 1 and 2)
|
|
*/
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
|
|
namespace adventofcode
|
|
{
|
|
class bscott12
|
|
{
|
|
private Dictionary<string, int> registers = new Dictionary<string, int>();
|
|
private int pc = 0;
|
|
|
|
public Dictionary<string, int> Registers
|
|
{
|
|
get { return registers; }
|
|
}
|
|
|
|
|
|
public bscott12()
|
|
{
|
|
for (char i = 'a'; i <= 'd'; i++)
|
|
registers.Add(i.ToString(), 0);
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
for (char i = 'a'; i <= 'd'; i++)
|
|
registers[i.ToString()] = 0;
|
|
pc = 0;
|
|
}
|
|
|
|
public void Process(string[] instructions)
|
|
{
|
|
while(pc < instructions.Length)
|
|
ProcessInstruction(instructions[pc]);
|
|
}
|
|
|
|
public void ProcessInstruction(string instruction)
|
|
{
|
|
string[] arguments = instruction.Split(new char[] { ' ' });
|
|
int value = 0;
|
|
bool branch = false;
|
|
|
|
switch (arguments[0])
|
|
{
|
|
case "cpy":
|
|
if (arguments[1][0] >= '0' && arguments[1][0] <= '9')
|
|
int.TryParse(arguments[1], out value);
|
|
else
|
|
value = registers[arguments[1]];
|
|
|
|
registers[arguments[2]] = value;
|
|
break;
|
|
case "inc":
|
|
registers[arguments[1]]++;
|
|
break;
|
|
case "dec":
|
|
registers[arguments[1]]--;
|
|
break;
|
|
case "jnz":
|
|
if (arguments[1][0] >= '0' && arguments[1][0] <= '9')
|
|
int.TryParse(arguments[1], out value);
|
|
else
|
|
value = registers[arguments[1]];
|
|
|
|
int jumpOffset = int.Parse(arguments[2]);
|
|
if (value != 0)
|
|
{
|
|
pc = pc + jumpOffset;
|
|
branch = true;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if(!branch) pc++;
|
|
}
|
|
}
|
|
|
|
class Program
|
|
{
|
|
static void Main(string[] args)
|
|
{
|
|
bscott12 day12 = new bscott12();
|
|
|
|
string[] input = File.ReadAllLines("input_day12.txt");
|
|
|
|
// part 1
|
|
day12.Process(input);
|
|
Console.Write("Part 1: ");
|
|
for (char i = 'a'; i <= 'd'; i++)
|
|
Console.Write(i.ToString() + " = " + day12.Registers[i.ToString()] + ", ");
|
|
Console.Write("\n");
|
|
|
|
// part 2
|
|
day12.Reset();
|
|
day12.Registers["c"] = 1;
|
|
day12.Process(input);
|
|
|
|
Console.Write("Part 2: ");
|
|
for (char i = 'a'; i <= 'd'; i++)
|
|
Console.Write(i.ToString() + " = " + day12.Registers[i.ToString()] + ", ");
|
|
Console.Write("\n");
|
|
|
|
Console.ReadLine();
|
|
}
|
|
}
|
|
}
|