Created
December 7, 2015 16:01
-
-
Save johnboker/50cd503d10e051be08a8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
namespace AdventOfCodeDay7 | |
{ | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
var input = new List<string>(); | |
var sr = new StreamReader("../../input1.txt"); // select part one or two here. | |
string line; | |
while ((line = sr.ReadLine()) != null) | |
{ | |
input.Add(line); | |
} | |
var wires = new List<Expr>(); | |
foreach (var w in input) | |
{ | |
var expr = new Expr(); | |
var parts1 = w.Split(new[] { " -> " }, StringSplitOptions.None); | |
expr.Name = parts1[1]; | |
var parts2 = parts1[0].Split(' '); | |
if (parts2.Length == 3) | |
{ | |
expr.Operands.Add(new Item(parts2[0], null)); | |
expr.Operands.Add(new Item(parts2[2], null)); | |
expr.Operator = parts2[1]; | |
} | |
else if (parts2.Length == 2) | |
{ | |
expr.Operands.Add(new Item(parts2[1], null)); | |
expr.Operator = parts2[0]; | |
} | |
else if (parts2.Length == 1) | |
{ | |
expr.Operands.Add(new Item(parts2[0], null)); | |
expr.Operator = "EQUALS"; | |
} | |
wires.Add(expr); | |
} | |
int cnt = 0; | |
while ((cnt = EvaluateAll(wires)) > 0) | |
{ | |
var done = wires.Where(a => a.Value != null).ToList(); | |
var notDone = wires.Where(a => a.Value == null); | |
foreach (var nd in notDone) | |
{ | |
foreach (var operand in nd.Operands) | |
{ | |
foreach (var d in done) | |
{ | |
if (operand.SValue == d.Name) | |
{ | |
operand.Value = d.Value; | |
} | |
} | |
} | |
} | |
Console.WriteLine(cnt); | |
} | |
Console.WriteLine("a = " + wires.FirstOrDefault(a => a.Name == "a").Value); | |
Console.ReadLine(); | |
} | |
public static int EvaluateAll(List<Expr> wires) | |
{ | |
var unsolved = wires.Where(a => a.Value == null); | |
foreach (var w in unsolved) | |
{ | |
var c = 0; | |
foreach (var o in w.Operands) | |
{ | |
ushort n; | |
if (ushort.TryParse(o.SValue, out n)) | |
{ | |
c++; | |
o.Value = n; | |
} | |
} | |
if (w.Operands.All(a => a.Value != null)) | |
{ | |
w.Value = Evaluate(w.Operator, w.Operands); | |
} | |
} | |
return wires.Count(a => a.Value == null); | |
} | |
public static ushort Evaluate(string oper, List<Item> operands) | |
{ | |
if (operands.Count() == 2) | |
{ | |
switch (oper) | |
{ | |
case "AND": | |
return (ushort)(operands[0].Value.Value & operands[1].Value.Value); | |
case "OR": | |
return (ushort)(operands[0].Value.Value | operands[1].Value.Value); | |
case "LSHIFT": | |
return (ushort)(operands[0].Value.Value << operands[1].Value.Value); | |
case "RSHIFT": | |
return (ushort)(operands[0].Value.Value >> operands[1].Value.Value); | |
} | |
} | |
else if (operands.Count() == 1) | |
{ | |
switch (oper) | |
{ | |
case "EQUALS": | |
return operands[0].Value.Value; | |
case "NOT": | |
return (ushort)(~operands[0].Value.Value); | |
} | |
} | |
Console.WriteLine("oh noes, something's wrong!"); | |
return 0; | |
} | |
public class Expr | |
{ | |
public string Name { get; set; } | |
public ushort? Value { get; set; } | |
public List<Item> Operands { get; set; } = new List<Item>(); | |
public string Operator { get; set; } | |
} | |
public class Item | |
{ | |
public Item(string s, ushort? v) | |
{ | |
SValue = s; | |
Value = v; | |
} | |
public string SValue { get; set; } | |
public ushort? Value { get; set; } | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment