public static int Problem1(string input) { var mem = new mem(); var lines = input.Replace("\n", "\r").Split('\r').Where(e => !string.IsNullOrWhiteSpace(e)).ToArray(); long pos = 0; var mulcount = 0; var timesincemul = 0; var l = 0; while (timesincemul < 1_000_000 && pos >= 0 && pos < lines.Count()) { var op = pos; var line = lines[pos]; var p = line.Split(' '); timesincemul++; switch (p[0]) { case "set": mem.Set(p[1], mem.Get(p[2])); break; case "sub": 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])); mulcount++; timesincemul = 0; break; case "jnz": if (mem.Get(p[1]) != 0) { pos += mem.Get(p[2]); pos--; } break; } pos++; //Trace.WriteLine($"{op}: {line} ({pos})"); //Trace.WriteLine(mem.ToString()); l++; if (l % 1000 == 0) { Trace.WriteLine($"{l}: {timesincemul}"); } } return(mulcount); }
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()); } }