public void Step() { if (terminated) { return; } var op = pos; var line = lines[pos]; var p = line.Split(' '); switch (p[0]) { case "snd": Output.Enqueue(mem.Get(p[1])); sendcount++; break; case "set": mem.Set(p[1], mem.Get(p[2])); break; case "add": mem.Set(p[1], mem.Get(p[1]) + mem.Get(p[2])); break; case "mul": mem.Set(p[1], mem.Get(p[1]) * mem.Get(p[2])); break; case "mod": mem.Set(p[1], mem.Get(p[1]) % mem.Get(p[2])); break; case "rcv": if (!Input.Any()) { waitforinput = true; return; } waitforinput = false; mem.Set(p[1], Input.Dequeue()); break; case "jgz": if (mem.Get(p[1]) > 0) { pos += mem.Get(p[2]); pos--; } break; } pos++; Trace.WriteLine($"{op}: {line} ({pos})"); Trace.WriteLine(mem.ToString()); if (pos < 0 || pos >= lines.Length) { terminated = true; } }
public static long Problem1(string input) { //input = "set a 1\nadd a 2\nmul a a\nmod a 5\nsnd a\nset a 0\nrcv a\njgz a -1\nset a 1\njgz a -2"; var mem = new mem(); var lines = input.Replace("\n", "\r").Split('\r').Where(e => !string.IsNullOrWhiteSpace(e)).ToArray(); long pos = 0; long lastSound = 0; while (true) { var op = pos; var line = lines[pos]; var p = line.Split(' '); switch (p[0]) { case "snd": lastSound = mem.Get(p[1]); break; case "set": mem.Set(p[1], mem.Get(p[2])); break; case "add": mem.Set(p[1], mem.Get(p[1]) + mem.Get(p[2])); break; case "mul": mem.Set(p[1], mem.Get(p[1]) * mem.Get(p[2])); break; case "mod": mem.Set(p[1], mem.Get(p[1]) % mem.Get(p[2])); break; case "rcv": if (mem.Get(p[1]) != 0) { return(lastSound); } break; case "jgz": if (mem.Get(p[1]) > 0) { pos += mem.Get(p[2]); pos--; } break; } pos++; Trace.WriteLine($"{op}: {line} ({pos})"); Trace.WriteLine(mem.ToString()); } }