From 9b29147f944b87a790e21ae0bbdcabd78216a2ff Mon Sep 17 00:00:00 2001 From: waterdrw Date: Tue, 21 Jan 2025 17:41:02 +0900 Subject: [PATCH] Add scoring system with JSON configuration and point calculation logic --- main.py | 65 ++++++++ scorer.py | 51 ++++++ scoring.json | 29 ++++ scripts.json | 429 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 574 insertions(+) create mode 100644 scorer.py create mode 100644 scoring.json create mode 100644 scripts.json diff --git a/main.py b/main.py index e69de29..0152db8 100644 --- a/main.py +++ b/main.py @@ -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() \ No newline at end of file diff --git a/scorer.py b/scorer.py new file mode 100644 index 0000000..78cc745 --- /dev/null +++ b/scorer.py @@ -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() \ No newline at end of file diff --git a/scoring.json b/scoring.json new file mode 100644 index 0000000..f9d0fa8 --- /dev/null +++ b/scoring.json @@ -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 + } + + ] + } +} \ No newline at end of file diff --git a/scripts.json b/scripts.json new file mode 100644 index 0000000..9ecbd5d --- /dev/null +++ b/scripts.json @@ -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": [] + } + ] +] \ No newline at end of file