提交 cc89405f 编写于 作者: 6 635677437d755007c09848d3

java代码不需要固定类名了

上级 374a4b4c
......@@ -15,6 +15,7 @@
2. 各语言代码初始化模版来自斐波那契数列递归算法(一般情况下可用作benchmark)
3. 代码执行超时功能(默认10s)
4. 接口限流(默认5 QPS)
5. java不用固定类名(正则匹配类名后生成对应的文件名)
5. 支持标准输入
以[leetcode 1题](https://leetcode.cn/problems/two-sum/description/) 两数之和为例:
......@@ -39,12 +40,16 @@ language_list = [
"cat > run.go << EOF\n",
"golang"),
Language("java",
"javac Example.java && java Example",
"cat > Example.java << EOF\n",
Language.java_run_way, # 支持特殊的代码文件生成方式
Language.java_file_way,
"java"),
Language("nodejs",
"FORCE_COLOR=0 node run.js",
"cat > run.js << EOF\n",
"javascript")
"javascript"),
Language("lua",
"lua run.lua",
"cat > run.lua << EOF\n",
"lua")
]
```
import logging
import os.path
import regex as re
from typing import Dict
TAG_STR = "webcode:{}-1.0"
DOCKER_CONFIG_DIR = "config/{}"
java_class_name = re.compile(r"(?<=\n|^)(public\s)?(class|interface|enum)\s([^\n\s]*)")
from docker import APIClient
......@@ -35,6 +37,28 @@ class Language:
def set_image(self, image):
self.image = image
@staticmethod
def java_file_way(code):
name = Language.get_file_name_in_java(code)
return "cat > {}.java << EOF\n".format(name) + code + "\nEOF\n"
@staticmethod
def java_run_way(code):
name = Language.get_file_name_in_java(code)
return "javac {}.java && java {}".format(name, name)
# 找到java的文件名
@staticmethod
def get_file_name_in_java(code):
name = "example"
for c in java_class_name.findall(code):
if len(c) != 3 or c[1] != 'class':
continue
if c[0] == 'public':
return c[2]
name = c[2]
return name
def build_image(self):
try:
generator = low_level_client.build(path=DOCKER_CONFIG_DIR.format(self.name),
......@@ -71,8 +95,8 @@ language_list = [
"cat > run.go << EOF\n",
"golang"),
Language("java",
"javac Example.java && java Example",
"cat > Example.java << EOF\n",
Language.java_run_way, # 支持特殊的代码文件生成方式
Language.java_file_way,
"java"),
Language("nodejs",
"FORCE_COLOR=0 node run.js",
......@@ -85,3 +109,18 @@ language_list = [
]
Languages: Dict[str, Language] = {v.name: v for v in language_list}
if __name__ == "__main__":
code = """
class Example {
public static void main(String[] args) {
System.out.print(fib(15) + " via java");
}
}
public class aaaa {
public static void main(String[] args) {
System.out.print(fib(15) + " via java");
}
}
"""
print(Language.get_file_name_in_java(code))
import java.util.*;
// 不要修改class name
public class Example {
static long fib(long n) {
if (n <= 1) return n;
......
docker==6.0.0
Flask==2.2.2
func-timeout==4.3.5
flask_limiter==2.7.0
\ No newline at end of file
flask_limiter==2.7.0
regex==2022.10.31
\ No newline at end of file
......@@ -39,4 +39,4 @@ def index():
if __name__ == "__main__":
t = threading.Thread(target=server.load)
t.start()
app.run("0.0.0.0", 3000, debug=False)
app.run("0.0.0.0", 3000, debug=True)
......@@ -32,16 +32,27 @@ def execute(code, _type, stdin=""):
if _type not in Languages or Languages[_type].image is None:
raise Exception("找不到运行环境,请等待后台创建")
result = ""
command = ""
try:
# 生成代码文件
command = Languages[_type].file_way + code + "\nEOF\n"
# 生成stdin,通过管道给到代码
# step1 生成代码文件
if callable(Languages[_type].file_way):
# 支持特殊文件名的语言
command += Languages[_type].file_way(code)
else:
command = Languages[_type].file_way + code + "\nEOF\n"
# step2 生成stdin,通过管道给到代码
if stdin != "":
command += "cat > stdin << EOF\n" + stdin + "\nEOF\n"
command += "cat stdin | "
# 执行代码
command += Languages[_type].run_way
# print(command)
# step3 执行代码
if callable(Languages[_type].run_way):
command += Languages[_type].run_way(code)
else:
command += Languages[_type].run_way
print(command)
container = client.containers.run(Languages[_type].image, stderr=True, stdout=True, tty=True,
network_disabled=True,
detach=True,
......@@ -70,4 +81,3 @@ if __name__ == "__main__":
load()
res = execute("a=input()\nprint(a=='1234')\n", "python", "1234")
print(res)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册