Пример #1
0
        public ProgramExecutor(ProgramExecutionRequest executionRequest)
        {
            ExecutionRequest = executionRequest;

            ConfigureProcess();
            InitializeExecutionResult();

            void ConfigureProcess()
            {
                _process = new Process
                {
                    EnableRaisingEvents = true,
                    PriorityClass       = ProcessPriorityClass.BelowNormal,
                    StartInfo           = new ProcessStartInfo
                    {
                        RedirectStandardInput  = true,
                        RedirectStandardOutput = true,
                        RedirectStandardError  = true,

                        StandardInputEncoding  = Encoding.UTF8,
                        StandardOutputEncoding = Encoding.UTF8,
                        StandardErrorEncoding  = Encoding.UTF8,

                        CreateNoWindow  = true,
                        WindowStyle     = ProcessWindowStyle.Hidden,
                        UseShellExecute = false,
                        ErrorDialog     = false,

                        FileName         = ExecutionRequest.StartInformation.Path,
                        WorkingDirectory = ExecutionRequest.StartInformation.WorkingDirectory,
                        Arguments        = ExecutionRequest.StartInformation.Arguments
                    }
                };

                // Add custom environment variables
                _process.StartInfo.Environment.Add(ExecutionRequest.StartInformation.Environment);

                if (ExecutionRequest.RunAsFeature.Enabled)
                {
                    _process.StartInfo.UserName = ExecutionRequest.RunAsFeature.UserName;

                    /*
                     * To workaround not implemented
                     * features in current .NET Core
                     * release.
                     */

                    if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                    {
                        // No implementation in other systems
                        _process.StartInfo.PasswordInClearText = ExecutionRequest.RunAsFeature.UserPasswordClearText;

                        // Windows-only feature
                        _process.StartInfo.Domain = ExecutionRequest.RunAsFeature.UserDomain;

                        _process.StartInfo.LoadUserProfile = false;
                    }
                    else
                    {
                        /*
                         * Find a way to run as another user with
                         * password on other operation systems.
                         */
                    }
                }
            }

            void InitializeExecutionResult()
            {
                ExecutionResult = new ProgramExecutionResult
                {
                    RuntimeResourcesUsage = new ProgramExecutionResult.ProgramRuntimeResourcesUsage
                    {
                        DiskSpaceUsage    = 0,
                        PeakMemoryUsage   = 0,
                        ProcessorTime     = 0,
                        RealExecutionTime = 0
                    }
                };
            }
        }
Пример #2
0
        private ProgramExecutionResult CanBeSolvedWithDfs(
            HashSet <ProgramState> stateSet, bool[,] eatenStarsMask, ref ProgramState state, ref int starsEaten, Program program)
        {
            Debug.Assert(state.Instruction == 0);

            for (int instr = 0; instr < program.GetInstructionCountInFunc(state.Func); ++instr)
            {
                state.Instruction = instr;

                // Loop check
                if (stateSet.Contains(state))
                {
                    return(ProgramExecutionResult.Fail);
                }

                FieldColor  currentColor = this.colors[state.Position.X, state.Position.Y];
                ProgramSlot slot         = program.GetProgramSlot(state.Func, state.Instruction);
                if (slot.Action == ProgramAction.None)
                {
                    continue;
                }
                if (slot.Color != FieldColor.None && slot.Color != currentColor)
                {
                    continue;
                }

                if (slot.Action == ProgramAction.Forward || slot.Action == ProgramAction.Left || slot.Action == ProgramAction.Right)
                {
                    switch (slot.Action)
                    {
                    case ProgramAction.Left:
                        state.Dir = (state.Dir - 1 + 4) % 4;
                        break;

                    case ProgramAction.Right:
                        state.Dir = (state.Dir + 1) % 4;
                        break;

                    case ProgramAction.Forward:
                        Coord newPosition = state.Position;
                        newPosition.X += shiftX[state.Dir];
                        newPosition.Y += shiftY[state.Dir];
                        state.Position = newPosition;

                        if (state.Position.X < 0 || state.Position.Y < 0 ||
                            state.Position.X >= this.width || state.Position.Y >= this.height)
                        {
                            return(ProgramExecutionResult.Fail);
                        }
                        if (colors[state.Position.X, state.Position.Y] == FieldColor.None)
                        {
                            return(ProgramExecutionResult.Fail);
                        }

                        // If star was eaten after this turn
                        if (this.stars[state.Position.X, state.Position.Y] && !eatenStarsMask[state.Position.X, state.Position.Y])
                        {
                            eatenStarsMask[state.Position.X, state.Position.Y] = true;
                            starsEaten += 1;
                            if (starsEaten == this.starsCount)
                            {
                                return(ProgramExecutionResult.StarsEaten);
                            }
                        }

                        break;
                    }
                }
                else if (slot.Action == ProgramAction.F1 || slot.Action == ProgramAction.F2 ||
                         slot.Action == ProgramAction.F3 || slot.Action == ProgramAction.F4 ||
                         slot.Action == ProgramAction.F5)
                {
                    ProgramState stateToPass = state;
                    stateToPass.Instruction = 0;

                    switch (slot.Action)
                    {
                    case ProgramAction.F1:
                        stateToPass.Func = 0;
                        break;

                    case ProgramAction.F2:
                        stateToPass.Func = 1;
                        break;

                    case ProgramAction.F3:
                        stateToPass.Func = 2;
                        break;

                    case ProgramAction.F4:
                        stateToPass.Func = 3;
                        break;

                    case ProgramAction.F5:
                        stateToPass.Func = 4;
                        break;
                    }

                    stateSet.Add(state);
                    ProgramExecutionResult result = CanBeSolvedWithDfs(stateSet, eatenStarsMask, ref stateToPass, ref starsEaten, program);
                    stateSet.Remove(state);

                    state.Position = stateToPass.Position;
                    state.Dir      = stateToPass.Dir;
                    if (result != ProgramExecutionResult.StillWorking)
                    {
                        return(result);
                    }
                }
            }

            return(ProgramExecutionResult.StillWorking);
        }