public static int OJCompareTo(this object obj1, OJContext context, object obj2)
        {
            obj1 = obj1.OJGetValue(context);
            obj2 = obj2.OJGetValue(context);

            if (obj1 == obj2)
            {
                return(0);
            }


            if (obj1 is IComparable cmpValue1 && obj2 is IComparable cmpValue2)
            {
                try
                {
                    return(cmpValue1.CompareTo(cmpValue2));
                }
                catch (Exception)
                {
                    throw new RuntimeException("比较操作作用于两个不同类型的元素了!");
                }
            }
            if (obj1.GetType() == obj2.GetType())
            {
                return(1);
            }
            throw new RuntimeException("比较操作作用于不能进行比较的元素了!");
        }
Beispiel #2
0
 public TestCaseListProvider(Workspace workspace, OJContext context, int problemId, bool isSample)
 {
     _workspace = workspace;
     _context   = context;
     _problemId = problemId;
     _isSample  = isSample;
 }
Beispiel #3
0
 public ProblemProvider(Workspace workspace, OJContext context, Problem problem)
 {
     _workspace = workspace;
     _context   = context;
     _problem   = problem;
     Samples    = new TestCaseListProvider(_workspace, _context, _problem.Id, true);
     Tests      = new TestCaseListProvider(_workspace, _context, _problem.Id, false);
 }
 public static object OJGetValue(this object obj, OJContext context)
 {
     if (obj is Block block)
     {
         obj = block.GetValue();
     }
     while (obj is IOJMethod method)
     {
         obj = method.Invoke(context);
     }
     return(obj);
 }
Beispiel #5
0
        public Workspace(OJContext context, WorkspaceStartup startup)
        {
            _context            = context;
            FileStoreRoot       = startup.FileStoreRoot;
            TestCaseStoreRoot   = Path.Join(FileStoreRoot, PD_Tests);
            SubmissionStoreRoot = Path.Join(FileStoreRoot, PD_Submissions);

            Problems    = new ProblemListProvider(this, _context);
            Submissions = new SubmissionListProvider(this, _context);
            Users       = new UserListProvider(this, _context);
            Roles       = new RoleListProvider(this, _context);
            Statistics  = new StatisticProvider(this, _context);
        }
        public object Invoke(OJContext context, params object[] args)
        {
            if (token.type == TokenType.Sub)
            {
                int value = obj.OJToInt(context);
                return(-value);
            }
            else if (token.type == TokenType.Not)
            {
                bool boolValue = obj.OJToBool(context);
                return(!boolValue);
            }

            return(null);
        }
Beispiel #7
0
        /// <summary>
        /// stmt当作oj函数调用
        ///     当stmt是映射时,需要提供args参数
        /// </summary>
        /// <param name="context"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public object Invoke(OJContext context, params object[] args)
        {
            if (isRemaped)
            {
                if (args.Length != this.args.Count)
                {
                    throw new RuntimeException($"{Name}参数个数不匹配:需要{this.args.Count}个 提供了{args.Length}个");
                }

                for (int i = 0; i < args.Length; i++)
                {
                    this.args[i].SetValue(args[i]);
                }
            }
            return(method.Invoke(context, this.args.ToArray()));
        }
Beispiel #8
0
        public object Invoke(OJContext context, params object[] args)
        {
            //localVar.Clear();

            if (FinalType == FinalReturnType.OJMethod)
            {
                return(method.Invoke(context));
            }

            object returnValue = null;

            foreach (var stmt in stmts)
            {
                returnValue = stmt.Invoke(context, args);
            }
            return(returnValue);
        }
 public static bool OJToBool(this object obj, OJContext context)
 {
     obj = obj.OJGetValue(context);
     if (obj is bool boolValue)
     {
         return(boolValue);
     }
     if (obj is int intValue)
     {
         if (intValue == 0)
         {
             return(false);
         }
         return(true);
     }
     return(false);
 }
Beispiel #10
0
 public static int OJToInt(this object obj, OJContext context)
 {
     obj = obj.OJGetValue(context);
     if (obj is int intValue)
     {
         return(intValue);
     }
     if (obj is bool boolValue)
     {
         if (boolValue)
         {
             return(1);
         }
         return(0);
     }
     return(0);
 }
Beispiel #11
0
 public StatisticProvider(Workspace workspace, OJContext context)
 {
     _workspace = workspace;
     _context   = context;
 }
Beispiel #12
0
 public UserProvider(Workspace workspace, OJContext context, User user)
 {
     _workspace = workspace;
     _context   = context;
     _user      = user;
 }
Beispiel #13
0
        public object Invoke(OJContext context, params object[] args)
        {
            switch (token.type)
            {
            case TokenType.Add:
            {
                var leftValue  = left.OJToInt(context);
                var rightValue = right.OJToInt(context);
                return(leftValue + rightValue);
            }

            case TokenType.Sub:
            {
                var leftValue  = left.OJToInt(context);
                var rightValue = right.OJToInt(context);
                return(leftValue - rightValue);
            }

            case TokenType.Mul:
            {
                var leftValue  = left.OJToInt(context);
                var rightValue = right.OJToInt(context);
                return(leftValue * rightValue);
            }

            case TokenType.Div:
            {
                var leftValue  = left.OJToInt(context);
                var rightValue = right.OJToInt(context);
                if (rightValue == 0)
                {
                    throw new RuntimeException("0不能当作除数");
                }
                return(leftValue / rightValue);
            }

            case TokenType.And:
            {
                var leftValue = left.OJToBool(context);
                if (!leftValue)
                {
                    return(false);
                }
                return(right.OJToBool(context));
            }

            case TokenType.Or:
            {
                var leftValue = left.OJToBool(context);
                if (leftValue)
                {
                    return(true);
                }
                return(right.OJToBool(context));
            }

            case TokenType.Cmp:
            {
                int cmp = left.OJCompareTo(context, right);
                if (cmp == 0)
                {
                    if (token.value == "==" || token.value == "<=" || token.value == ">=")
                    {
                        return(true);
                    }
                    return(false);
                }
                else if (cmp > 0)
                {
                    if (token.value == ">" || token.value == ">=" || token.value == "!=")
                    {
                        return(true);
                    }
                    return(false);
                }
                else         // if (cmp < 0)
                {
                    if (token.value == "<" || token.value == "<=" || token.value == "!=")
                    {
                        return(true);
                    }
                    return(false);
                }
            }
            }

            return(null);
        }
 public SubmissionListProvider(Workspace workspace, OJContext context)
 {
     _workspace = workspace;
     _context   = context;
 }
Beispiel #15
0
 public RoleProvider(Workspace workspace, OJContext context, Role role)
 {
     _workspace = workspace;
     _context   = context;
     _role      = role;
 }
 public ProblemListProvider(Workspace workspace, OJContext context)
 {
     _workspace = workspace;
     _context   = context;
 }
Beispiel #17
0
 public TestCaseProvider(Workspace workspace, OJContext context, TestCase testcase)
 {
     _workspace = workspace;
     _context   = context;
     _testcase  = testcase;
 }
Beispiel #18
0
 public SubmissionProvider(Workspace workspace, OJContext context, Submission submission)
 {
     _workspace  = workspace;
     _context    = context;
     _submission = submission;
 }