Пример #1
0
        /// <inheritdoc/>
        public IEnumerable <string> RunTask1(string input, bool shouldVisualise)
        {
            var title = " is the lowest positive integer that can be used to initialize register a";

            if (!shouldVisualise)
            {
                yield return(this.FastLoop(input).ToString() + title);

                yield break;
            }

            var found   = false;
            var value   = 1;
            var spinner = new Spinner();

            while (!found)
            {
                var compRabbit = new PrototypeComputer.PrototypeComputer(input);
                var compTurtle = new PrototypeComputer.PrototypeComputer(input);

                compRabbit.SetRegister("a", value);
                compTurtle.SetRegister("a", value);

                while (compRabbit.State.CanRun && compTurtle.State.CanRun)
                {
                    compRabbit.RunNext();
                    compRabbit.RunNext();
                    compTurtle.RunNext();

                    if (compRabbit.State.Equals(compTurtle.State))
                    {
                        // Infinite loop detected.
                        if (this.IsSignal(compRabbit.State.Out))
                        {
                            yield return("Calculating.. " + spinner.State + " " + value.ToString());

                            found = true;
                        }

                        break;
                    }
                }

                spinner.Turn();
                ++value;
            }

            yield return(value.ToString() + title);
        }
Пример #2
0
        private int FastLoop(string input)
        {
            var comp      = new PrototypeComputer.PrototypeComputer(input);
            var baseValue = int.Parse(comp.State.Instructions[1].Args[0]) * int.Parse(comp.State.Instructions[2].Args[0]);

            var value = 0;

            while (value < baseValue)
            {
                value <<= 1;
                ++value;
                value <<= 1;
            }

            return(value - baseValue);
        }
Пример #3
0
        private IEnumerable <string> SimplifiedProgram(string program, int input)
        {
            var comp = new PrototypeComputer.PrototypeComputer(program);

            if (!int.TryParse(comp.State.Instructions[19].Args[0], out var left) ||
                !int.TryParse(comp.State.Instructions[20].Args[0], out var right))
            {
                yield return("Wrong input!.\nThis solution abuses fact that program should calculate factorial of 7 and add multiply arguments of instructions #19 and #20.");

                yield break;
            }

            long value = left * right;

            value += Utils.Factorial(input);

            yield return(value.ToString() + " should be sent to the safe.");
        }