Add scoring system with JSON configuration and point calculation logic

This commit is contained in:
2025-01-21 17:41:02 +09:00
parent 4243edfbfb
commit 9b29147f94
4 changed files with 574 additions and 0 deletions

65
main.py
View File

@@ -0,0 +1,65 @@
from jsonpath_ng.ext import parse
import json
# 파일 경로 설정
project_json_path = '/Users/waterdrw/Works/KAIT/Entry-Scoring/sample/제2410회 코딩활용능력 2급 B형 정답/project.json'
scoring_json_path = '/Users/waterdrw/Works/KAIT/Entry-Scoring/scoring.json'
# JSON 파일 읽기
def read_json(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
return json.load(file)
# 요소 탐색 함수
def find_element(project_data, jsonpath_expr):
jsonpath_expr = parse(jsonpath_expr)
return [match.value for match in jsonpath_expr.find(project_data)]
# 요소 탐색 함수
def find_script_element(project_data, jsonpath_expr):
jsonpath_expr = parse(jsonpath_expr)
match = jsonpath_expr.find(project_data)
return match[0].value
# main 함수
def main():
project_data = read_json(project_json_path)
scoring_data = read_json(scoring_json_path)
total_points = 0
for key, value in scoring_data.items():
ele = value.get('ele')
type = value.get('type')
blocks = value.get('blocks')
if type == "scene":
exists = find_element(project_data, ele)
if exists:
# print(f"No elements found for {ele}")
total_points += value.get('points')
# else:
# print(f"Element '{ele}' exists in project.json: {exists}")
if type == "script":
exists = find_script_element(project_data, ele)
temp = json.loads(exists)
for block in blocks:
block_exists = find_element(temp, block.get('ele'))
# 블록에 따라 params 값이나 statements 값이 있는 경우 처리 추가 필요
if block_exists:
total_points += block.get('points')
# else:
# print(f"No elements found for {block.get('ele')}")
print(f"Total Points: {total_points}")
if __name__ == "__main__":
main()

51
scorer.py Normal file
View File

@@ -0,0 +1,51 @@
import json
def load_json(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
return json.load(file)
def compare_params(params1, params2):
if len(params1) != len(params2):
return False
for p1, p2 in zip(params1, params2):
if p1 != p2:
return False
return True
def calculate_points(project_data, scoring_data):
total_points = 0
for key, criteria in scoring_data.items():
ele = criteria['ele']
arg = criteria['arg']
value = criteria['value']
if ele == "scenes":
for scene in project_data['scenes']:
if scene.get(arg) == value:
points = criteria['points']
total_points += points
break
elif ele == "objects":
for obj in project_data['objects']:
if obj.get(arg) == value:
if 'script' in criteria:
for script_criteria in criteria['script']:
for script in json.loads(obj['script']):
if script['type'] == script_criteria['type']:
if 'params' in script_criteria:
if compare_params(script['params'], script_criteria['params']):
total_points += script_criteria['points']
else:
total_points += script_criteria['points']
return total_points
def main():
project_data = load_json('sample/제2410회 코딩활용능력 2급 B형 정답/project.json')
scoring_data = load_json('scoring.json')
total_points = calculate_points(project_data, scoring_data)
print(f"Total Points: {total_points}")
if __name__ == "__main__":
main()

29
scoring.json Normal file
View File

@@ -0,0 +1,29 @@
{
"0": {
"type": "scene",
"ele": "$.scenes[0].name",
"value": "장면 1",
"points": 10
},
"1": {
"type": "scene",
"ele": "$.scenes[1].name",
"value": "장면 2",
"points": 10
},
"2": {
"type": "script",
"ele": "$.objects[?(@.name=='미어캣')].script[*]",
"blocks": [
{
"ele": "$[*][?(@.type=='hide')]",
"points": 10
},
{
"ele": "$[*][?(@.type=='set_scale_size')].params[0].params[0]",
"points": 10
}
]
}
}

429
scripts.json Normal file
View File

@@ -0,0 +1,429 @@
[
[
{
"id": "w44a",
"x": 50,
"y": 30,
"type": "when_run_button_click",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "lks0",
"x": 0,
"y": 0,
"type": "hide",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "3wtk",
"x": 0,
"y": 0,
"type": "set_scale_size",
"params": [
{
"id": "cs1e",
"x": 0,
"y": 0,
"type": "number",
"params": [
"60"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "0ihj",
"x": 0,
"y": 0,
"type": "repeat_inf",
"params": [
null,
null
],
"statements": [
[
{
"id": "orn8",
"x": 0,
"y": 0,
"type": "locate_xy",
"params": [
{
"id": "dmfl",
"x": 0,
"y": 0,
"type": "calc_rand",
"params": [
null,
{
"id": "8u37",
"x": 0,
"y": 0,
"type": "number",
"params": [
"-200"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null,
{
"id": "ouuv",
"x": 0,
"y": 0,
"type": "number",
"params": [
"200"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "8j47",
"x": 0,
"y": 0,
"type": "calc_rand",
"params": [
null,
{
"id": "669m",
"x": 0,
"y": 0,
"type": "number",
"params": [
"-100"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null,
{
"id": "kaq0",
"x": 0,
"y": 0,
"type": "number",
"params": [
"100"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "ro4n",
"x": 0,
"y": 0,
"type": "wait_second",
"params": [
{
"id": "6xf0",
"x": 0,
"y": 0,
"type": "number",
"params": [
"1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "r39u",
"x": 0,
"y": 0,
"type": "show",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "kkqk",
"x": 0,
"y": 0,
"type": "wait_second",
"params": [
{
"id": "167c",
"x": 0,
"y": 0,
"type": "number",
"params": [
"1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "0qng",
"x": 0,
"y": 0,
"type": "hide",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
],
[
{
"id": "knwd",
"x": 53,
"y": 343,
"type": "when_message_cast",
"params": [
null,
"m0l6"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "40hi",
"x": 0,
"y": 0,
"type": "_if",
"params": [
{
"id": "sbmy",
"x": 0,
"y": 0,
"type": "reach_something",
"params": [
null,
"xskt",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [
[
{
"id": "jy0j",
"x": 0,
"y": 0,
"type": "hide",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "w887",
"x": 0,
"y": 0,
"type": "change_variable",
"params": [
"v94h",
{
"id": "grbn",
"x": 0,
"y": 0,
"type": "text",
"params": [
"-10"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
]