コード例 #1
0
        // 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);
        }