// Attempts // semiconductor X XX // loom X XX // mutex X X // sand X // asterisk X // wreath X // dark matter X // ornament X // LLLLLLLHLL public static long Part1(IEnumerable <long> program) { var computer = new IntComputer(false); // helpers void ContinueWith(string input) { computer.Continue(input.Select(c => (long)c)); computer.Continue(new[] { 10L }); } string OutputsToString() { var s = new string(computer.Outputs.Select(o => (char)o).ToArray()); computer.ClearOutputs(); return(s); } var ec = computer.Run(program); var i = 0; while (true) { // render output Console.Write(OutputsToString()); // take and feed input string input; if (i < _initInstructions.Count) { input = _initInstructions[i]; Console.WriteLine(input); } else { break; // move to phase 2 } //input = Console.ReadLine(); ContinueWith(input); i++; } // Phase 2 - search matching combination // we have 8 items, so it is a search from 0 to 255 using binary rep. var items = new[] { "semiconductor", "loom", "mutex", "sand", "asterisk", "wreath", "dark matter", "ornament" }; for (var c = 0; c < 256; c++) { var picks = items.Where((s, p) => (c & (1 << p)) != 0).ToList(); // pick up picks.ForEach(item => ContinueWith($"take {item}")); var o1 = OutputsToString(); Console.WriteLine($"{c,3} picked " + string.Join(", ", picks)); // test ContinueWith("east"); var output = OutputsToString(); if (output.Contains("heavier")) { Console.WriteLine("too light"); } else if (output.Contains("lighter")) { Console.WriteLine("too heavy"); } else { // win? Console.WriteLine(output); return(0); } // drop / reset picks.ForEach(item => ContinueWith($"drop {item}")); } return(1); }