diff --git a/01_copyFiles.py b/01_copyFiles.py index 7262a24..3e27a12 100644 --- a/01_copyFiles.py +++ b/01_copyFiles.py @@ -49,11 +49,17 @@ def copy_ent_files(source_root, target_root): # source_directory = r"D:\project\data\CAS_제2510회 정기\제2510회 코딩활용능력 2급 정기 답안파일" # 원본 디렉토리 경로 -# test_name = "2512_CAS_2_A" -test_name = "2601_CAT_3_A" +# test_name = "2602_2_CAS_2_A" +# test_name = "2602_2_CAS_2_B" +test_name = "2602_3_CAS_2_A" +# test_name = "2602_6_CAS_2_B" + # source_directory = r"D:\project\data\CAT_제2511회 정기\답안파일" # 원본 디렉토리 경로 -source_directory = r"D:\project\data\CAT_제2601회 정기\CAT_제2601회 정기\CAT_답안파일" # 원본 디렉토리 경로 +# source_directory = r"D:\project\data\제2602회 수시2_CAS(구미)\답안파일\A형" # 원본 디렉토리 경로 +# source_directory = r"D:\project\data\제2602회 수시2_CAS(구미)\답안파일\B형" # 원본 디렉토리 경로 +# source_directory = r"D:\project\data\제2602회 수시2_CAS(구미)\답안파일\B형" # 원본 디렉토리 경로 +source_directory = r"D:\project\data\제2602회 수시3_CAS(대구)\답안파일" # 원본 디렉토리 경로 target_directory = rf".\ent\{test_name}" # 타겟 디렉토리 경로 copy_ent_files(source_directory, target_directory) diff --git a/02_extract_project_json.py b/02_extract_project_json.py index 2773202..49568a3 100644 --- a/02_extract_project_json.py +++ b/02_extract_project_json.py @@ -50,7 +50,7 @@ def process_ent_files(ent_dir, output_dir): # 실행 예 if __name__ == "__main__": - test_names = ["2601_CAT_3_A"] + test_names = ["2602_6_CAS_2_B"] # test_names = ["2512_CAS_2_A", "2512_CAS_2_B"] for test_name in test_names: ent_dir = f".\\ent\\{test_name}" diff --git a/260129_2601_CAT_3_A_채점결과.xlsx b/260129_2601_CAT_3_A_채점결과.xlsx new file mode 100644 index 0000000..57c921d Binary files /dev/null and b/260129_2601_CAT_3_A_채점결과.xlsx differ diff --git a/260203_2602_2_CAS_2_A_채점결과.xlsx b/260203_2602_2_CAS_2_A_채점결과.xlsx new file mode 100644 index 0000000..dcd877f Binary files /dev/null and b/260203_2602_2_CAS_2_A_채점결과.xlsx differ diff --git a/260203_2602_2_CAS_2_B_채점결과.xlsx b/260203_2602_2_CAS_2_B_채점결과.xlsx new file mode 100644 index 0000000..ea8ff2d Binary files /dev/null and b/260203_2602_2_CAS_2_B_채점결과.xlsx differ diff --git a/260204_2602_2_CAS_2_A_채점결과.xlsx b/260204_2602_2_CAS_2_A_채점결과.xlsx new file mode 100644 index 0000000..6aad62c Binary files /dev/null and b/260204_2602_2_CAS_2_A_채점결과.xlsx differ diff --git a/260204_2602_2_CAS_2_B_채점결과.xlsx b/260204_2602_2_CAS_2_B_채점결과.xlsx new file mode 100644 index 0000000..25cb86f Binary files /dev/null and b/260204_2602_2_CAS_2_B_채점결과.xlsx differ diff --git a/260204_2602_3_CAS_2_A_채점결과.xlsx b/260204_2602_3_CAS_2_A_채점결과.xlsx new file mode 100644 index 0000000..5e00091 Binary files /dev/null and b/260204_2602_3_CAS_2_A_채점결과.xlsx differ diff --git a/260204_2602_6_CAS_2_B_채점결과.xlsx b/260204_2602_6_CAS_2_B_채점결과.xlsx new file mode 100644 index 0000000..db6c452 Binary files /dev/null and b/260204_2602_6_CAS_2_B_채점결과.xlsx differ diff --git a/correct/2602_2_CAS_2_A.json b/correct/2602_2_CAS_2_A.json new file mode 100644 index 0000000..a92e56a --- /dev/null +++ b/correct/2602_2_CAS_2_A.json @@ -0,0 +1,743 @@ +{ + "1-1": { + "type": "scene", + "ele": "$.[objects,scenes][?(@.name=='장면 1')]", + "point": 1.7, + "desc": "장면 1/[배경] 이름 설정 1/이름 변경 없음", + "sort": 11 + }, + "1-2": { + "type": "scene", + "ele": "$..objects[?(@.name=='나의 방')]", + "point": 1.7, + "desc": "장면 2/[배경] 이름 설정 2/이름을 ‘나의 방’으로 변경하기", + "sort": 12 + }, + "1-3": { + "type": "scene", + "ele": "$..objects[?(@.name=='놀이동산')]", + "point": 1.7, + "desc": "놀이동산(1)/[개체] 이름 설정 1/이름을 ‘놀이동산’으로 변경하기", + "sort": 13 + }, + "1-4": { + "type": "scene", + "ele": "$..objects[?(@.name=='학원')]", + "point": 1.7, + "desc": "건물(6)/[개체] 이름 설정 2/이름을 ‘학원’으로 변경하기", + "sort": 14 + }, + "1-5": { + "type": "scene", + "ele": "$..objects[?(@.name=~'우리집')]", + "point": 1.7, + "desc": "예쁜집/[개체] 이름 설정 3/이름을 ‘우리집’으로 변경하기", + "sort": 15 + }, + "1-6": { + "type": "scene", + "ele": "$..objects[?(@.name=~'어린이')]", + "point": 1.7, + "desc": "어린이(2)/[개체] 이름 설정 4/이름을 ‘어린이’로 변경하기", + "sort": 16 + }, + "3-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'놀이동산')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.56, + "desc": "놀이동산/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "100" + ], + "point": 1.56, + "desc": "놀이동산/[시작]의 세부 동작 1/크기를 ‘100’ 으로 정하기", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "-25", + "80" + ], + "point": 1.56, + "desc": "놀이동산/[시작]의 세부 동작 2/x: ‘-25’ y: ’80’ 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_object_click", + "point": 1.56, + "desc": "놀이동산/오브젝트/오브젝트를 클릭했을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0].params[0]", + "$[1][1].params[1].params[0]" + ], + "answer": [ + "dialog_time", + "놀이동산 입니다!", + "1.5" + ], + "point": 1.56, + "desc": "놀이동산/[오브젝트]의 세부 동작/‘놀이동산 입니다!’ 를 ’1.5‘ 초 동안 ‘말하기’", + "type": "list" + } + ] + }, + "4-0": { + "type": "script", + "ele": "$.objects[?(@.name=='학원')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.56, + "desc": "시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "80" + ], + "point": 1.56, + "desc": "[시작]의 세부 동작 1/크기를 ‘80’ 으로 정하기", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "170", + "-80" + ], + "point": 1.56, + "desc": "[시작]의 세부 동작 2/x: ‘170’ y: ’-80’ 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_object_click", + "point": 1.56, + "desc": "학원/오브젝트/오브젝트를 클릭했을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0].params[0]", + "$[1][1].params[1].params[0]" + ], + "answer": [ + "dialog_time", + "학원 입니다!", + "1.5" + ], + "point": 1.56, + "desc": "학원/[오브젝트]의 세부 동작/‘학원 입니다!’ 를 ’1.5‘ 초 동안 ‘말하기’", + "type": "list" + } + ] + }, + "13-0": { + "ele": "$.messages[?(@.name=='놀이동산')]", + "point": 1.56, + "desc": "문제 2/우리집/신호/'놀이동산' 신호 만들기", + "type": "scene" + }, + "14-0": { + "ele": "$.messages[?(@.name=='학원')]", + "point": 1.56, + "desc": "문제 2/우리집/신호/'학원' 신호 만들기", + "type": "scene" + }, + "5-0": { + "type": "script", + "ele": "$..objects[?(@.name=~'우리집')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.56, + "desc": "우리집/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "110" + ], + "point": 1.56, + "desc": "우리집/[시작]의 세부 동작 1/크기를 ‘110’ 으로 정하기 ", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "-170", + "-90" + ], + "point": 1.56, + "desc": "우리집/[시작]의 세부 동작 2/x: ‘-170’ y: ‘-90’ 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_object_click", + "point": 1.56, + "desc": "우리집/오브젝트/오브젝트를 클릭했을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0].params[0]" + ], + "answer": [ + "ask_and_wait", + "첫 번째로 방문할 장소는?" + ], + "point": 1.56, + "desc": "우리집/[오브젝트]의 세부 동작 1/‘첫 번째로 방문할 장소는?’ 을 묻고 대답 기다리기", + "type": "list" + }, + { + "ele": [ + "$[1][2].type", + "$[1][2].params[0].params[0]" + ], + "answer": [ + "wait_second", + "0.5" + ], + "point": 1.56, + "desc": "우리집/[오브젝트]의 세부 동작 2/‘0.5’ 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[1][3].type", + "$[1][3].params[0].params[1]", + "$[1][3].params[0].params[2].params[0]" + ], + "answer": [ + "_if", + "EQUAL", + "놀이동산" + ], + "point": 1.56, + "desc": "우리집/만일 1/만일 ‘대답’ = ‘놀이동산’ 이라면 ", + "type": "list" + }, + { + "ele": [ + "$[1][3].statements[0][0].type", + "$[1][3].statements[0][0].params[1]" + ], + "answer": [ + "message_cast", + null + ], + "point": 1.56, + "desc": "우리집/[만일 1]의 세부 동작/‘놀이동산’ 신호 보내기", + "type": "list" + }, + { + "ele": [ + "$[1][4].type", + "$[1][4].params[0].params[1]", + "$[1][4].params[0].params[2].params[0]" + ], + "answer": [ + "_if", + "EQUAL", + "학원" + ], + "point": 1.56, + "desc": "우리집/만일 2/만일 ‘대답’ = ‘학원’ 이라면 ", + "type": "list" + }, + { + "ele": [ + "$[1][4].statements[0][0].type", + "$[1][4].statements[0][0].params[1]" + ], + "answer": [ + "message_cast", + null + ], + "point": 1.56, + "desc": "우리집/[만일 2]의 세부 동작/‘학원’ 신호 보내기", + "type": "list" + } + ] + }, + "6-0": { + "type": "script", + "ele": "$..objects[?(@.name=~'어린이')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.56, + "desc": "어린이/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "40" + ], + "point": 1.56, + "desc": "어린이/[시작]의 세부 동작 1/크기를 ‘40’ 으로 정하기 ", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "-170", + "-100" + ], + "point": 1.56, + "desc": "어린이/[시작]의 세부 동작 2/x: ‘-170’ y: ‘-100’ 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[0][3].type", + "answer": "repeat_inf", + "point": 1.56, + "desc": "어린이/반복/계속 반복하기" + }, + { + "ele": [ + "$[0][3].statements[0][0].type", + "$[0][3].statements[0][0].params[0].type", + "$[0][3].statements[0][0].params[0].params[0]" + ], + "answer": [ + "_if", + "is_press_some_key", + "39" + ], + "point": 1.56, + "desc": "어린이/만일/만일 ’오른쪽 화살표’ 키가 눌러져 있는가? 라면", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][0].statements[0][0].type", + "$[0][3].statements[0][0].statements[0][0].params[0].params[0]", + "$[0][3].statements[0][0].statements[0][0].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "-90", + "-100" + ], + "point": 1.56, + "desc": "어린이/[만일]의 세부 동작/x: ‘-90’ y: ‘-100’ 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_message_cast", + "point": 1.56, + "desc": "어린이/신호 1/‘놀이동산’ 신호를 받았을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0].type", + "$[1][1].params[1]" + ], + "answer": [ + "repeat_while_true", + "reach_something", + "until" + ], + "point": 1.56, + "desc": "어린이/반복 1/‘놀이동산’ 에 닿았는가? ‘이 될 때까지’ 반복하기", + "type": "list" + }, + { + "ele": [ + "$[1][1].statements[0][0].type", + "$[1][1].statements[0][0].params[0].params[0]" + ], + "answer": [ + "locate_object_time", + "2" + ], + "point": 1.56, + "desc": "어린이/[반복 1]의 세부 동작 1/‘2’ 초 동안 ‘놀이동산’ 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[1][1].statements[0][1].type", + "$[1][1].statements[0][1].params[0].params[0]" + ], + "answer": [ + "wait_second", + "0.5" + ], + "point": 1.56, + "desc": "어린이/[반복 1]의 세부 동작 2/‘0.5’ 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[1][2].type", + "$[1][2].params[0].type", + "$[1][2].params[1]" + ], + "answer": [ + "repeat_while_true", + "reach_something", + "until" + ], + "point": 1.56, + "desc": "어린이/반복 1/‘학원’ 에 닿았는가? ‘이 될 때까지’ 반복하기", + "type": "list" + }, + { + "ele": [ + "$[1][2].statements[0][0].type", + "$[1][2].statements[0][0].params[0].params[0]" + ], + "answer": [ + "locate_object_time", + "2" + ], + "point": 1.56, + "desc": "어린이/[반복 1]의 세부 동작 1/‘2’ 초 동안 ‘학원’ 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[1][2].statements[0][1].type", + "$[1][2].statements[0][1].params[0].params[0]" + ], + "answer": [ + "wait_second", + "1" + ], + "point": 1.56, + "desc": "어린이/[반복 1]의 세부 동작 2/‘1’ 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[1][3].type", + "$[1][3].params[0].params[0]", + "$[1][3].params[1].params[0]", + "$[1][3].params[2].params[0]" + ], + "answer": [ + "locate_xy_time", + "2", + "-120", + "-100" + ], + "point": 1.56, + "desc": "어린이/[신호 1]의 세부 동작 1/’2‘ 초 동안 x: ‘-120’ y: ‘-100’ 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[1][4].params[0].params[0]", + "$[1][4].params[1].params[0]", + "$[1][4].params[2]" + ], + "answer": [ + "집 도착!", + "1", + "speak" + ], + "point": 1.56, + "desc": "어린이/[신호 1]의 세부 동작 2/‘집 도착!’ 을 ‘1’ 초 동안 ’말하기‘", + "type": "list" + }, + { + "ele": [ + "$[1][5].type", + "$[1][5].params[0]" + ], + "answer": [ + "start_neighbor_scene", + "next" + ], + "point": 1.56, + "desc": "어린이/[신호 1]의 세부 동작 3/‘다음’ 장면 시작하기", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_message_cast", + "point": 1.56, + "desc": "어린이/신호 1/‘학원’ 신호를 받았을 때" + }, + { + "ele": [ + "$[2][1].type", + "$[2][1].params[0].type", + "$[2][1].params[1]" + ], + "answer": [ + "repeat_while_true", + "reach_something", + "until" + ], + "point": 1.56, + "desc": "어린이/반복 1/‘학원’ 에 닿았는가? ‘이 될 때까지’ 반복하기", + "type": "list" + }, + { + "ele": [ + "$[2][1].statements[0][0].type", + "$[2][1].statements[0][0].params[0].params[0]" + ], + "answer": [ + "locate_object_time", + "2" + ], + "point": 1.56, + "desc": "어린이/[반복 1]의 세부 동작 1/‘2’ 초 동안 ‘학원’ 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[2][1].statements[0][1].type", + "$[2][1].statements[0][1].params[0].params[0]" + ], + "answer": [ + "wait_second", + "0.5" + ], + "point": 1.56, + "desc": "어린이/[반복 1]의 세부 동작 2/‘0.5’ 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[2][2].type", + "$[2][2].params[0].type", + "$[2][2].params[1]" + ], + "answer": [ + "repeat_while_true", + "reach_something", + "until" + ], + "point": 1.56, + "desc": "어린이/반복 2/‘놀이동산’ 에 닿았는가? ‘이 될 때까지’ 반복하기", + "type": "list" + }, + { + "ele": [ + "$[2][2].statements[0][0].type", + "$[2][2].statements[0][0].params[0].params[0]" + ], + "answer": [ + "locate_object_time", + "2" + ], + "point": 1.56, + "desc": "어린이/[반복 2]의 세부 동작 1/‘2’ 초 동안 ‘놀이동산’ 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[2][2].statements[0][1].type", + "$[2][2].statements[0][1].params[0].params[0]" + ], + "answer": [ + "wait_second", + "1" + ], + "point": 1.56, + "desc": "어린이/[반복 2]의 세부 동작 2/‘1’ 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[2][3].type", + "$[2][3].params[0].params[0]", + "$[2][3].params[1].params[0]", + "$[2][3].params[2].params[0]" + ], + "answer": [ + "locate_xy_time", + "2", + "-120", + "-100" + ], + "point": 1.56, + "desc": "어린이/[신호 1]의 세부 동작 1/’2’ 초 동안 x: ‘-120’ y: ‘-100’ 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[2][4].params[0].params[0]", + "$[2][4].params[1].params[0]", + "$[2][4].params[2]" + ], + "answer": [ + "집 도착!", + "1", + "speak" + ], + "point": 1.56, + "desc": "어린이/[신호 1]의 세부 동작 2/‘집 도착!’ 을 ‘1’ 초 동안 ’말하기‘", + "type": "list" + }, + { + "ele": [ + "$[2][5].type", + "$[2][5].params[0]" + ], + "answer": [ + "start_neighbor_scene", + "next" + ], + "point": 1.56, + "desc": "어린이/[신호 1]의 세부 동작 3/‘다음’ 장면 시작하기", + "type": "list" + } + ] + }, + "2-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'나의 방')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_scene_start", + "point": 1.56, + "desc": "나의 방/장면/장면이 시작되었을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0]" + ], + "answer": [ + "set_visible_answer", + "HIDE" + ], + "point": 1.56, + "desc": "나의 방/[장면]의 세부 동작 1/대답 ‘숨기기’", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1]" + ], + "answer": [ + "dialog", + "여기는 우리집이야!", + "speak" + ], + "point": 1.56, + "desc": "나의 방/[장면]의 세부 동작 2/‘여기는 우리집이야!’ 를 ‘말하기’", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_object_click", + "point": 2, + "desc": "나의 방/오브젝트/오브젝트를 클릭했을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0]", + "$[1][1].params[1].params[0]" + ], + "answer": [ + "add_effect_amount", + "brightness", + "10" + ], + "point": 2, + "desc": "나의 방/[오브젝트]의 세부 동작 1/‘밝기’ 효과를 ‘10’ 만큼 주기", + "type": "list" + }, + { + "ele": [ + "$[1][2].type", + "$[1][2].params[0].params[0]", + "$[1][2].params[1]" + ], + "answer": [ + "dialog", + "처음부터 다시 실행합니다.", + "speak" + ], + "point": 2, + "desc": "나의 방/[오브젝트]의 세부 동작 2/‘처음부터 다시 실행합니다.’ 를 '말하기'", + "type": "list" + }, + { + "ele": [ + "$[1][3].type", + "$[1][3].params[0].params[0]" + ], + "answer": [ + "wait_second", + "2" + ], + "point": 2, + "desc": "나의 방/[오브젝트]의 세부 동작 3/‘2’ 초 기다리기", + "type": "list" + }, + { + "ele": "$[1][4].type", + "answer": "restart_project", + "point": 2, + "desc": "나의 방/[오브젝트]의 세부 동작 4/처음부터 다시 실행하기" + } + ] + } +} \ No newline at end of file diff --git a/correct/2602_2_CAS_2_B.json b/correct/2602_2_CAS_2_B.json new file mode 100644 index 0000000..0f659b6 --- /dev/null +++ b/correct/2602_2_CAS_2_B.json @@ -0,0 +1,537 @@ +{ + "1-1": { + "type": "scene", + "ele": "$..objects[?(@.name=='우주')]", + "point": 1.7, + "desc": "장면 1/[배경] 이름 설정 1/이름을 ‘우주’로 변경하기", + "sort": 11 + }, + "1-2": { + "type": "scene", + "ele": "$..objects[?(@.name=='우주정거장')]", + "point": 1.7, + "desc": "장면 2/[배경] 이름 설정 2/이름을 ‘우주정거장’으로 변경하기", + "sort": 12 + }, + "1-3": { + "type": "scene", + "ele": "$..objects[?(@.name=='별')]", + "point": 1.7, + "desc": "큰별(노랑)/[개체] 이름 설정 1/이름을 ‘별’로 변경하기", + "sort": 13 + }, + "1-4": { + "type": "scene", + "ele": "$..objects[?(@.name=='운석')]", + "point": 1.7, + "desc": "돌덩이/[개체] 이름 설정 2/이름을 ‘운석’으로 변경하기", + "sort": 14 + }, + "1-5": { + "type": "scene", + "ele": "$..objects[?(@.name=='비행기')]", + "point": 1.7, + "desc": "파란 비행기/[개체] 이름 설정 3/이름 ‘비행기’로 변경하기", + "sort": 15 + }, + "1-6": { + "type": "scene", + "ele": "$..objects[?(@.name=='전투기')]", + "point": 1.7, + "desc": "전투기/[개체] 이름 설정 4/이름 변경 없음", + "sort": 16 + }, + "1-7": { + "type": "scene", + "ele": "$..variables[?(@.name=='에너지')]", + "point": 1.63, + "desc": "별/변수/‘에너지’ 변수 만들기 (변수 기본값은 ‘0’, ‘모든 오브젝트에 사용’ 설정)", + "sort": 17 + }, + "3-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'별')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.63, + "desc": "별/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": ["$[0][1].type", "$[0][1].params[0].params[0]"], + "answer": ["set_scale_size", "30"], + "point": 1.63, + "desc": "별/[시작]의 세부 동작 1/크기를 '30’ 으로 정하기", + "type": "list" + }, + { + "ele": "$[0][2].type", + "answer": "repeat_inf", + "point": 1.63, + "desc": "별/반복/계속 반복하기" + }, + { + "ele": "$[0][2].statements[0][0].type", + "answer": "hide", + "point": 1.63, + "desc": "별/[반복]의 세부 동작 1/모양 숨기기" + }, + { + "ele": [ + "$[0][2].statements[0][1].type", + "$[0][2].statements[0][1].params[0].type", + "$[0][2].statements[0][1].params[0].params[1].params[0]", + "$[0][2].statements[0][1].params[0].params[3].params[0]", + "$[0][2].statements[0][1].params[1].type", + "$[0][2].statements[0][1].params[1].params[1].params[0]", + "$[0][2].statements[0][1].params[1].params[3].params[0]" + ], + "answer": [ + "locate_xy", + "calc_rand", + "-210", + "210", + "calc_rand", + "-120", + "120" + ], + "point": 1.63, + "desc": "별/[반복]의 세부 동작 2/x: ‘-210 부터 210 사이의 무작위 수’ y: ‘-120 부터 120 사이의 무작위 수’ 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[0][2].statements[0][2].type", + "$[0][2].statements[0][2].params[0].type", + "$[0][2].statements[0][2].params[0].params[1].params[0]", + "$[0][2].statements[0][2].params[0].params[3].params[0]" + ], + "answer": ["wait_second", "calc_rand", "0", "3"], + "point": 1.63, + "desc": "별/[반복]의 세부 동작 3/‘0 부터 3 사이의 무작위 수’ 초 기다리기", + "type": "list" + }, + { + "ele": "$[0][2].statements[0][3].type", + "answer": "show", + "point": 1.63, + "desc": "별/[반복]의 세부 동작 4/모양 보이기" + }, + { + "ele": [ + "$[0][2].statements[0][4].type", + "$[0][2].statements[0][4].params[0].params[0]" + ], + "answer": ["wait_second", "1.5"], + "point": 1.63, + "desc": "별/[반복]의 세부 동작 5/‘1.5‘ 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[0][2].statements[0][5].type", + "$[0][2].statements[0][5].params[0].type" + ], + "answer": ["_if", "reach_something"], + "point": 1.63, + "desc": "별/만일/만일 ’비행기‘ 에 닿았는가? 라면", + "type": "list" + }, + { + "ele": [ + "$[0][2].statements[0][5].statements[0][0].type", + "$[0][2].statements[0][5].statements[0][0].params[1].params[0]" + ], + "answer": ["change_variable", "30"], + "point": 1.63, + "desc": "별/[만일]의 세부 동작/에너지' 에 '30' 만큼 더하기", + "type": "list" + } + ] + }, + "4-0": { + "type": "script", + "ele": "$.objects[?(@.name=='운석')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.63, + "desc": "시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": ["$[0][1].type", "$[0][1].params[0].params[0]"], + "answer": ["set_scale_size", "30"], + "point": 1.63, + "desc": "운석/[시작]의 세부 동작 1/크기를 '30’ 으로 정하기", + "type": "list" + }, + { + "ele": "$[0][2].type", + "answer": "repeat_inf", + "point": 1.63, + "desc": "운석/반복/계속 반복하기" + }, + { + "ele": "$[0][2].statements[0][0].type", + "answer": "hide", + "point": 1.63, + "desc": "운석/[반복]의 세부 동작 1/모양 숨기기" + }, + { + "ele": [ + "$[0][2].statements[0][1].type", + "$[0][2].statements[0][1].params[0].type", + "$[0][2].statements[0][1].params[0].params[1].params[0]", + "$[0][2].statements[0][1].params[0].params[3].params[0]", + "$[0][2].statements[0][1].params[1].type", + "$[0][2].statements[0][1].params[1].params[1].params[0]", + "$[0][2].statements[0][1].params[1].params[3].params[0]" + ], + "answer": [ + "locate_xy", + "calc_rand", + "-210", + "210", + "calc_rand", + "-120", + "120" + ], + "point": 1.63, + "desc": "운석/[반복]의 세부 동작 2/x: ‘-210 부터 210 사이의 무작위 수’ y: ‘-120 부터 120 사이의 무작위 수’ 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[0][2].statements[0][2].type", + "$[0][2].statements[0][2].params[0].type", + "$[0][2].statements[0][2].params[0].params[1].params[0]", + "$[0][2].statements[0][2].params[0].params[3].params[0]" + ], + "answer": ["wait_second", "calc_rand", "0", "3"], + "point": 1.63, + "desc": "운석/[반복]의 세부 동작 3/‘0 부터 3 사이의 무작위 수’ 초 기다리기", + "type": "list" + }, + { + "ele": "$[0][2].statements[0][3].type", + "answer": "show", + "point": 1.63, + "desc": "운석/[반복]의 세부 동작 4/모양 보이기" + }, + { + "ele": [ + "$[0][2].statements[0][4].type", + "$[0][2].statements[0][4].params[0].params[0]" + ], + "answer": ["wait_second", "1.5"], + "point": 1.63, + "desc": "운석/[반복]의 세부 동작 4/‘1.5‘ 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[0][2].statements[0][5].type", + "$[0][2].statements[0][5].params[0].type" + ], + "answer": ["_if", "reach_something"], + "point": 1.63, + "desc": "운석/만일/만일 ’비행기‘ 에 닿았는가? 라면", + "type": "list" + }, + { + "ele": [ + "$[0][2].statements[0][5].statements[0][0].type", + "$[0][2].statements[0][5].statements[0][0].params[1].params[0]" + ], + "answer": ["change_variable", "-30"], + "point": 1.63, + "desc": "운석/[만일]의 세부 동작 1/에너지' 에 '-30' 만큼 더하기", + "type": "list" + } + ] + }, + "15-0": { + "ele": "$.messages[?(@.name=='업그레이드')]", + "point": 1.63, + "desc": "비행기/신호/‘업그레이드’ 신호 만들기", + "type": "scene" + }, + "5-0": { + "type": "script", + "ele": "$..objects[?(@.name=~'비행기')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.63, + "desc": "비행기/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]", + "$[0][1].params[1].params[0]" + ], + "answer": ["locate_xy", "10", "10"], + "point": 1.63, + "desc": "비행기/[시작]의 세부 동작 1/x: ‘10’ y: ‘10’ 위치로 이동하기", + "type": "list" + }, + { + "ele": ["$[0][2].type", "$[0][2].params[0].params[0]"], + "answer": ["set_scale_size", "50"], + "point": 1.63, + "desc": "비행기/[시작]의 세부 동작 2/크기를 ‘50’ 으로 정하기", + "type": "list" + }, + { + "ele": "$[0][3].type", + "answer": "repeat_inf", + "point": 1.63, + "desc": "비행기/반복/계속 반복하기" + }, + { + "ele": [ + "$[0][3].statements[0][0].type", + "$[0][3].statements[0][0].params[0].type", + "$[0][3].statements[0][0].params[0].params[0]" + ], + "answer": ["_if", "is_press_some_key", "37"], + "point": 1.63, + "desc": "비행기/만일 1/만일 ‘왼쪽 화살표’ 키가 키가 눌러져 있는가? 라면", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][0].statements[0][0].type", + "$[0][3].statements[0][0].statements[0][0].params[0].params[0]" + ], + "answer": ["move_x", "-5"], + "point": 1.63, + "desc": "비행기/[만일 1]의 세부 동작/x 좌표를 ‘-5’ 만큼 바꾸기", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][1].type", + "$[0][3].statements[0][1].params[0].type", + "$[0][3].statements[0][1].params[0].params[0]" + ], + "answer": ["_if", "is_press_some_key", "39"], + "point": 1.63, + "desc": "비행기/만일 1/만일 ‘오른쪽 화살표’ 키가 키가 눌러져 있는가? 라면", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][1].statements[0][0].type", + "$[0][3].statements[0][1].statements[0][0].params[0].params[0]" + ], + "answer": ["move_x", "5"], + "point": 1.63, + "desc": "비행기/[만일 1]의 세부 동작/x 좌표를 ‘5’ 만큼 바꾸기", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][2].type", + "$[0][3].statements[0][2].params[0].type", + "$[0][3].statements[0][2].params[0].params[0]" + ], + "answer": ["_if", "is_press_some_key", "38"], + "point": 1.63, + "desc": "비행기/만일 1/만일 ‘위쪽 화살표’ 키가 키가 눌러져 있는가? 라면", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][2].statements[0][0].type", + "$[0][3].statements[0][2].statements[0][0].params[0].params[0]" + ], + "answer": ["move_y", "5"], + "point": 1.63, + "desc": "비행기/[만일 3]의 세부 동작/y 좌표를 ‘5’ 만큼 바꾸기", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][3].type", + "$[0][3].statements[0][3].params[0].type", + "$[0][3].statements[0][3].params[0].params[0]" + ], + "answer": ["_if", "is_press_some_key", "40"], + "point": 1.63, + "desc": "비행기/만일 4/만일 ‘아래쪽 화살표’ 키가 눌러져 있는가? 라면", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][3].statements[0][0].type", + "$[0][3].statements[0][3].statements[0][0].params[0].params[0]" + ], + "answer": ["move_y", "-5"], + "point": 1.63, + "desc": "비행기/[만일 4]의 세부 동작/y 좌표를 ‘-5’ 만큼 바꾸기", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][4].type", + "$[0][3].statements[0][4].params[0].params[1]", + "$[0][3].statements[0][4].params[0].params[2].params[0]" + ], + "answer": ["_if", "EQUAL", "120"], + "point": 1.63, + "desc": "비행기/만일 5/만일 ‘에너지’ 값 = ‘120’ 이라면", + "type": "list" + }, + { + "ele": "$[0][3].statements[0][4].statements[0][0].type", + "answer": "hide", + "point": 1.63, + "desc": "비행기/[만일 5]의 세부 동작 1/모양 숨기기" + }, + { + "ele": "$[0][3].statements[0][4].statements[0][1].type", + "answer": "message_cast", + "point": 1.63, + "desc": "비행기/[만일 5]의 세부 동작 2/‘업그레이드’ 신호 보내기" + } + ] + }, + "6-0": { + "type": "script", + "ele": "$..objects[?(@.name=~'전투기')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.63, + "desc": "전투기/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": "$[0][1].type", + "answer": "hide", + "point": 1.63, + "desc": "전투기/[시작]의 세부 동작/모양 숨기기" + }, + { + "ele": "$[1][0].type", + "answer": "when_message_cast", + "point": 1.63, + "desc": "전투기/신호/‘업그레이드’ 신호를 받았을 때" + }, + { + "ele": "$[1][1].type", + "answer": "locate", + "point": 1.63, + "desc": "전투기/[신호]의 세부 동작 1/‘비행기’ 위치로 이동하기" + }, + { + "ele": "$[1][2].type", + "answer": "show", + "point": 1.63, + "desc": "전투기/[신호]의 세부 동작 2/모양 보이기" + }, + { + "ele": ["$[1][3].params[0].params[0]", "$[1][3].params[1]"], + "answer": ["변신!", "speak"], + "point": 1.63, + "desc": "전투기/[신호]의 세부 동작 3/‘변신!’ 을 '말하기'", + "type": "list" + }, + { + "ele": ["$[1][4].type", "$[1][4].params[0]"], + "answer": ["stop_object", "other_objects"], + "point": 1.63, + "desc": "전투기/[신호]의 세부 동작 4/‘다른 오브젝트의’ 코드 멈추기", + "type": "list" + }, + { + "ele": ["$[1][5].type", "$[1][5].params[0].params[0]"], + "answer": ["wait_second", "2"], + "point": 1.63, + "desc": "전투기/[신호]의 세부 동작 5/‘2’ 초 기다리기", + "type": "list" + }, + { + "ele": ["$[1][6].type", "$[1][6].params[0]"], + "answer": ["start_neighbor_scene", "next"], + "point": 1.63, + "desc": "전투기/[신호]의 세부 동작 6/‘다음’ 장면 시작하기", + "type": "list" + } + ] + }, + "2-0": { + "type": "script", + "ele": "$.objects[?(@.name=='우주정거장')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_scene_start", + "point": 1.63, + "desc": "우주정거장/장면 2/장면이 시작되었을 때" + }, + { + "ele": "$[0][1].type", + "answer": "hide_variable", + "point": 1.63, + "desc": "우주정거장/[장면 2]의 세부 동작 1/변수 ‘에너지’ 숨기기" + }, + { + "ele": ["$[0][2].params[0].params[0]", "$[0][2].params[1]"], + "answer": ["미션 성공!", "speak"], + "point": 1.63, + "desc": "우주정거장/[장면 2]의 세부 동작 2/‘미션 성공!’ 을 '말하기'", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_object_click", + "point": 2, + "desc": "우주정거장/오브젝트/오브젝트를 클릭했을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0]", + "$[1][1].params[1].params[0]" + ], + "answer": [ + "add_effect_amount", + "color", + "35" + ], + "point": 2, + "desc": "우주정거장/[오브젝트]의 세부 동작 1/‘색깔’ 효과를 ‘35’ 만큼 주기", + "type": "list" + }, + { + "ele": ["$[1][2].params[0].params[0]", "$[1][2].params[1]"], + "answer": ["처음부터 다시 실행합니다!", "speak"], + "point": 2, + "desc": "우주정거장/[오브젝트]의 세부 동작 2/‘처음부터 다시 실행합니다!’ 를 '말하기'", + "type": "list" + }, + { + "ele": [ + "$[1][3].type", + "$[1][3].params[0].params[0]" + ], + "answer": ["wait_second", "2"], + "point": 2, + "desc": "우주정거장/[오브젝트]의 세부 동작 3/‘2’ 초 기다리기", + "type": "list" + }, + { + "ele": "$[1][4].type", + "answer": "restart_project", + "point": 2, + "desc": "우주정거장/[오브젝트]의 세부 동작 4/처음부터 다시 실행하기" + } + ] + } +} diff --git a/correct/2602_3_CAS_2_A.json b/correct/2602_3_CAS_2_A.json new file mode 100644 index 0000000..5cc6e44 --- /dev/null +++ b/correct/2602_3_CAS_2_A.json @@ -0,0 +1,832 @@ +{ + "1-1": { + "type": "scene", + "ele": "$..objects[?(@.name=='작업실')]", + "point": 1.7, + "desc": "문제 1/장면 1/[배경] 이름 설정 1/이름을 '작업실'로 변경하기", + "sort": 11 + }, + "1-2": { + "type": "scene", + "ele": "$..objects[?(@.name=='로봇방')]", + "point": 1.7, + "desc": "문제 1/장면 2/[배경] 이름 설정 2/이름을 '로봇방'으로 변경하기", + "sort": 12 + }, + "1-3": { + "type": "scene", + "ele": "$..objects[?(@.name=='렌치')]", + "point": 1.6, + "desc": "문제 1/렌치/[개체] 이름 설정 1/이름 변경 없음", + "sort": 13 + }, + "1-4": { + "type": "scene", + "ele": "$..objects[?(@.name=='로봇')]", + "point": 1.7, + "desc": "문제 1/둥근로봇/[개체] 이름 설정 2/이름을 '로봇'으로 변경하기", + "sort": 14 + }, + "1-5": { + "type": "scene", + "ele": "$..objects[?(@.name=='망치')]", + "point": 1.7, + "desc": "문제 1/뿅망치(1)_1/[개체] 이름 설정 3/이름을 '망치'로 변경하기", + "sort": 15 + }, + "1-6": { + "type": "scene", + "ele": "$..objects[?(@.name=='로봇 팔')]", + "point": 1.6, + "desc": "문제 1/로봇 팔/[개체] 이름 설정 4/이름 변경 없음", + "sort": 16 + }, + "1-0": { + "ele": "$..variables[?(@.name=='고장 원인')]", + "point": 1.29, + "desc": "문제 2/렌치/변수/'고장 원인' 변수 만들기 (변수 기본값은 '0', '모든 오브젝트에 사용' 설정하기)", + "type": "scene", + "sort": 101 + }, + "2-0": { + "ele": "$.messages[?(@.name=='수리 완료')]", + "point": 1.29, + "desc": "문제 2/렌치/신호/'수리 완료' 신호 만들기", + "type": "scene", + "sort": 102 + }, + "3-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'렌치')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.29, + "desc": "문제 2/렌치/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]", + "$[0][1].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "-90", + "-40" + ], + "point": 1.29, + "desc": "문제 2/렌치/[시작]의 세부 동작 1/x: '-90' y: '-40' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]" + ], + "answer": [ + "rotate_absolute", + "180" + ], + "point": 1.29, + "desc": "문제 2/렌치/[시작]의 세부 동작 2/방향을 '180°' 로 정하기", + "type": "list" + }, + { + "ele": [ + "$[0][3].type", + "$[0][3].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "110" + ], + "point": 1.29, + "desc": "문제 2/렌치/[시작]의 세부 동작 3/크기를 '110' 으로 정하기", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_object_click", + "point": 1.29, + "desc": "문제 2/렌치/오브젝트/오브젝트를 클릭했을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0].params[0]", + "$[1][1].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "25", + "10" + ], + "point": 1.29, + "desc": "문제 2/렌치/[오브젝트]의 세부 동작 1/x: '25' y: '10' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[1][2].type", + "$[1][2].params[0].type", + "$[1][2].params[0].params[0].type", + "$[1][2].params[0].params[1]", + "$[1][2].params[0].params[2].params[0]" + ], + "answer": [ + "if_else", + "boolean_basic_operator", + "get_variable", + "EQUAL", + "나사 조임" + ], + "point": 1.29, + "desc": "문제 2/렌치/만일 / 아니면/만일 '고장 원인 값' = '나사 조임' 이라면", + "type": "list" + }, + { + "ele": "$[1][2].statements[0][0].params[*].params", + "answer": [ + "로봇이 수리되었습니다.", + "1" + ], + "point": 1.29, + "desc": "문제 2/렌치/[만일]의 세부 동작 1/'로봇이 수리되었습니다.' 를 '1' 초 동안 '말하기'" + }, + { + "ele": "$[1][2].statements[0][1].type", + "answer": "message_cast", + "point": 1.29, + "desc": "문제 2/렌치/[만일]의 세부 동작 2/'수리 완료' 신호 보내기" + }, + { + "ele": "$[1][2].statements[1][0].params[*].params", + "answer": [ + "고장 원인을 다시 확인하세요.", + "2" + ], + "point": 1.29, + "desc": "문제 2/렌치/[아니면]의 세부 동작/'고장 원인을 다시 확인하세요.' 를 '2' 초 동안 '말하기'" + }, + { + "ele": [ + "$[1][3].type", + "$[1][3].params[0].params[0]", + "$[1][3].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "-90", + "-40" + ], + "point": 1.29, + "desc": "문제 2/렌치/[오브젝트]의 세부 동작 2/x: '-90' y: '-40' 위치로 이동하기", + "type": "list" + } + ], + "sortBlock": [ + "when_run_button_click", + "when_object_click" + ], + "sort": 105 + }, + "14-0": { + "ele": "$..variables[?(@.name=='수리된 로봇')]", + "point": 1.29, + "desc": "문제 2/로봇/변수/'수리된 로봇' 변수 만들기 (변수 기본값은 '0', '모든 오브젝트에 사용' 설정하기)", + "type": "scene", + "sort": 114 + }, + "15-0": { + "ele": "$.messages[?(@.name=='로봇 이동')]", + "point": 1.29, + "desc": "문제 2/로봇/신호/'로봇 이동' 신호 만들기", + "type": "scene", + "sort": 115 + }, + "4-0": { + "type": "script", + "ele": "$.objects[?(@.name=='로봇')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.29, + "desc": "문제 2/로봇/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]", + "$[0][1].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "95", + "-30" + ], + "point": 1.29, + "desc": "문제 2/로봇/[시작]의 세부 동작 1/x: '95' y: '-30' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "120" + ], + "point": 1.29, + "desc": "문제 2/로봇/[시작]의 세부 동작 2/크기를 '120' 으로 정하기", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_message_cast", + "point": 1.29, + "desc": "문제 2/로봇/수리 완료/'수리 완료' 신호를 받았을 때" + }, + { + "ele": "$[1][2].params[*].params", + "answer": [ + "수리되었습니다.", + "1" + ], + "point": 1.29, + "desc": "문제 2/로봇/[수리 완료]의 세부 동작 2/'수리되었습니다.' 를 '1' 초 동안 '말하기'" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[1].params[0]" + ], + "answer": [ + "change_variable", + "1" + ], + "point": 1.29, + "desc": "문제 2/로봇/[수리 완료]의 세부 동작 1/'수리된 로봇'에 '1' 만큼 더하기", + "type": "list" + }, + { + "ele": [ + "$[1][3].type", + "$[1][3].params[0].type", + "$[1][3].params[0].params[0].type", + "$[1][3].params[0].params[1]", + "$[1][3].params[0].params[2].params[0]" + ], + "answer": [ + "_if", + "boolean_basic_operator", + "get_variable", + "EQUAL", + "2" + ], + "point": 1.29, + "desc": "문제 2/로봇/만일/만일 '수리된 로봇 값' = '2' 이라면", + "type": "list" + }, + { + "ele": [ + "$[1][3].statements[0][0].type", + "$[1][3].statements[0][0].params[0]" + ], + "answer": [ + "set_visible_answer", + "HIDE" + ], + "point": 1.29, + "desc": "문제 2/로봇/[만일]의 세부 동작 1/대답 '숨기기'", + "type": "list" + }, + { + "ele": "$[1][3].statements[0][1].params[*].params", + "answer": [ + "모두 수리했습니다.", + "1" + ], + "point": 1.29, + "desc": "문제 2/로봇/[만일]의 세부 동작 2/'모두 수리했습니다.' 를 '1' 초 동안 '말하기'" + }, + { + "ele": "$[1][3].statements[0][2].type", + "answer": "start_scene", + "point": 1.29, + "desc": "문제 2/로봇/[만일]의 세부 동작 3/ '장면2' 시작하기" + }, + { + "ele": "$[1][4].type", + "answer": "message_cast", + "point": 1.29, + "desc": "문제 2/로봇/[수리 완료]의 세부 동작 3/'로봇 이동' 신호 보내기" + }, + { + "ele": "$[2][0].type", + "answer": "when_message_cast", + "point": 1.29, + "desc": "문제 2/로봇/로봇 이동/'로봇 이동' 신호를 받았을 때" + }, + { + "ele": [ + "$[2][1].type", + "$[2][1].params[0].params[0]" + ], + "answer": [ + "move_x", + "120" + ], + "point": 1.29, + "desc": "문제 2/로봇/[로봇 이동]의 세부 동작 1/x 좌표를 '120' 만큼 바꾸기", + "type": "list" + }, + { + "ele": "$[2][2].type", + "answer": "hide", + "point": 1.29, + "desc": "문제 2/로봇/[로봇 이동]의 세부 동작 2/모양 숨기기" + }, + { + "ele": [ + "$[2][3].type", + "$[2][3].params[0].params[0]" + ], + "answer": [ + "wait_second", + "0.2" + ], + "point": 1.29, + "desc": "문제 2/로봇/[로봇 이동]의 세부 동작 3/'0.2' 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[2][4].type", + "$[2][4].params[0].params[0]", + "$[2][4].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "95", + "-30" + ], + "point": 1.29, + "desc": "문제 2/로봇/[로봇 이동]의 세부 동작 4/x: '95' y: '-30' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[2][5].type", + "$[2][5].params[0].params[0]" + ], + "answer": [ + "wait_second", + "0.2" + ], + "point": 1.29, + "desc": "문제 2/로봇/[로봇 이동]의 세부 동작 5/'0.2' 초 기다리기", + "type": "list" + }, + { + "ele": "$[2][6].type", + "answer": "show", + "point": 1.29, + "desc": "문제 2/로봇/[로봇 이동]의 세부 동작 6/모양 보이기" + } + ], + "sortBlock": [ + "when_run_button_click", + "when_message_cast", + "when_message_cast" + ], + "sort": 115 + }, + + "5-0": { + "type": "script", + "ele": "$..objects[?(@.name=~'^(망치|뿅망치)$')].script", + "ele_tmp": "$.objects[?(@.name=~'망치')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.29, + "desc": "문제 2/망치/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]", + "$[0][1].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "180", + "10" + ], + "point": 1.29, + "desc": "문제 2/망치/[시작]의 세부 동작/x: '180' y: '10' 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_object_click", + "point": 1.29, + "desc": "문제 2/망치/오브젝트/오브젝트를 클릭했을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0].params[0]" + ], + "answer": [ + "rotate_absolute", + "320" + ], + "point": 1.29, + "desc": "문제 2/망치/[오브젝트]의 세부 동작 1/방향을 '320°' 로 정하기", + "type": "list" + }, + { + "ele": "$[1][2].params[*].params", + "answer": [ + "더 고장났어요!", + "2" + ], + "point": 1.29, + "desc": "문제 2/망치/[오브젝트]의 세부 동작 2/'더 고장났어요!' 를 '2' 초 동안 '말하기'" + }, + { + "ele": [ + "$[1][3].type", + "$[1][3].params[0].params[0]" + ], + "answer": [ + "rotate_absolute", + "0" + ], + "point": 1.29, + "desc": "문제 2/망치/[오브젝트]의 세부 동작 3/방향을 '0°' 로 정하기", + "type": "list" + } + ], + "sortBlock": [ + "when_run_button_click", + "when_object_click" + ], + "sort": 135 + }, + "6-0": { + "type": "script", + "ele": "$..objects[?(@.name=~'^(로봇 팔|단소)$')].script", + "ele_tmp": "$.objects[?(@.name=~'로봇 팔')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.29, + "desc": "문제 2/로봇 팔/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]", + "$[0][1].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "10", + "15" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/[시작]의 세부 동작 1/x: '10' y: '15' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]" + ], + "answer": [ + "rotate_absolute", + "180" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/[시작]의 세부 동작 2/방향을 '180°' 로 정하기", + "type": "list" + }, + { + "ele": [ + "$[0][3].type", + "$[0][3].params[0].params[0].params[3]", + "$[0][3].params[0].params[1]", + "$[0][3].params[0].params[2].params[0]" + ], + "answer": [ + "repeat_while_true", + null, + "EQUAL", + "2" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/반복/'수리된 로봇 값' = '2' 이 될 때까지' 반복하기", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][0].type", + "$[0][3].statements[0][0].params[0].params[0]" + ], + "answer": [ + "wait_second", + "1" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/[반복]의 세부 동작 1/1' 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][1].type", + "$[0][3].statements[0][1].params[0].params[0]" + ], + "answer": [ + "ask_and_wait", + "어디가 고장났나요?" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/[반복]의 세부 동작 2/'어디가 고장났나요?' 를 묻고 대답 기다리기", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][2].type", + "$[0][3].statements[0][2].params[0].type", + "$[0][3].statements[0][2].params[0].params[0].type", + "$[0][3].statements[0][2].params[0].params[0].params[1]", + "$[0][3].statements[0][2].params[0].params[0].params[2].params[0]", + "$[0][3].statements[0][2].params[0].params[1]", + "$[0][3].statements[0][2].params[0].params[2].type", + "$[0][3].statements[0][2].params[0].params[2].params[1]", + "$[0][3].statements[0][2].params[0].params[2].params[2].params[0]" + ], + "answer": [ + "if_else", + "boolean_and_or", + "boolean_basic_operator", + "EQUAL", + "나사 조임", + "OR", + "boolean_basic_operator", + "EQUAL", + "부품 고장" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/만일 / 아니면/만일 '대답' = '나사 조임' 또는 '대답' = '부품 고장' 이라면", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][2].statements[0][0].type", + "$[0][3].statements[0][2].statements[0][0].params[1].params[0]" + ], + "answer": [ + "set_variable", + null + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/[만일]의 세부 동작 1/'고장 원인' 을 '대답' 으로 정하기", + "type": "list" + }, + { + "ele": "$[0][3].statements[0][2].statements[0][1].params[*].params", + "answer": [ + "도구를 선택하세요.", + "2" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/[만일]의 세부 동작 2/'도구를 선택하세요' 를 '2' 초 동안 '말하기'" + }, + { + "ele": "$[0][3].statements[0][2].statements[1][0].params[*].params", + "answer": [ + "나사 조임, 부품 고장 중 무엇입니까?", + "2" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/[아니면]의 세부 동작 1/'나사 조임, 부품 고장 중 무엇입니까?' 를 '2' 초 동안 말하기" + }, + { + "ele": [ + "$[0][3].statements[0][3].type", + "$[0][3].statements[0][3].params[0].params[0]" + ], + "answer": [ + "wait_second", + "2" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/[아니면]의 세부 동작 2/'2' 초 기다리기", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_object_click", + "point": 1.29, + "desc": "문제 2/로봇 팔/오브젝트/오브젝트를 클릭했을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0].params[0]" + ], + "answer": [ + "rotate_absolute", + "130" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/[오브젝트]의 세부 동작 1/방향을 '130°' 로 정하기", + "type": "list" + }, + { + "ele": [ + "$[1][2].type", + "$[1][2].params[0].type", + "$[1][2].params[0].params[0].type", + "$[1][2].params[0].params[1]", + "$[1][2].params[0].params[2].params[0]" + ], + "answer": [ + "if_else", + "boolean_basic_operator", + "get_variable", + "EQUAL", + "부품 고장" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/만일 / 아니면/만일 '고장 원인' 값 = '부품 고장' 이라면", + "type": "list" + }, + { + "ele": "$[1][2].statements[0][0].params[*].params", + "answer": [ + "로봇이 수리되었습니다.", + "1" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/[만일]의 세부 동작 1/'로봇이 수리되었습니다.' 를 '1' 초 동안 '말하기'" + }, + { + "ele": "$[1][2].statements[0][1].type", + "answer": "message_cast", + "point": 1.29, + "desc": "문제 2/로봇 팔/[만일]의 세부 동작 2/'수리 완료' 신호 보내기" + }, + { + "ele": "$[1][2].statements[1][0].params[*].params", + "answer": [ + "고장 원인을 확인하세요.", + "2" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/[아니면]의 세부 동작/'고장 원인을 다시 확인하세요' 를 '2' 초 동안 '말하기'" + }, + { + "ele": [ + "$[1][3].type", + "$[1][3].params[0].params[0]", + "$[1][3].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "10", + "15" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/[오브젝트]의 세부 동작 2/x: '10' y: '15' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[1][4].type", + "$[1][4].params[0].params[0]" + ], + "answer": [ + "rotate_absolute", + "180" + ], + "point": 1.29, + "desc": "문제 2/로봇 팔/[오브젝트]의 세부 동작 3/방향을 '180°' 로 정하기", + "type": "list" + } + ], + "sortBlock": [ + "when_run_button_click", + "when_object_click" + ], + "sort": 141 + }, + "7-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'로봇방|장면 ')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_scene_start", + "point": 1.29, + "desc": "문제 2/로봇방/장면 2/장면이 시작되었을 때" + }, + { + "ele": "$[0][1].type", + "answer": "hide_variable", + "point": 1.29, + "desc": "문제 2/로봇방/[장면 2]의 세부 동작 1/변수 '고장 원인' 숨기기" + }, + { + "ele": "$[0][2].type", + "answer": "hide_variable", + "point": 1.29, + "desc": "문제 2/로봇방/[장면 2]의 세부 동작 2/변수 '수리된 로봇' 숨기기" + }, + { + "ele": [ + "$[0][3].type", + "$[0][3].params[0].params[0]", + "$[0][3].params[1]" + ], + "answer": [ + "dialog", + "모든 로봇 수리 완료!", + "speak" + ], + "point": 1.29, + "desc": "문제 2/로봇방/[장면 2]의 세부 동작 3/'모든 로봇 수리 완료!' 를 '말하기'", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_object_click", + "point": 2, + "desc": "문제 3/로봇방/오브젝트/오브젝트를 클릭했을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0]", + "$[1][1].params[1].params[0]" + ], + "answer": [ + "add_effect_amount", + "color", + "45" + ], + "point": 2, + "desc": "문제 3/로봇방/[오브젝트]의 세부 동작 1/'색깔' 효과를 '45' 만큼 주기", + "type": "list" + }, + { + "ele": [ + "$[1][2].type", + "$[1][2].params[0].params[0]", + "$[1][2].params[1]" + ], + "answer": [ + "dialog", + "처음부터 다시 실행합니다.", + "speak" + ], + "point": 2, + "desc": "문제 3/로봇방/[오브젝트]의 세부 동작 2/'처음부터 다시 실행합니다.' 를 '말하기'", + "type": "list" + }, + { + "ele": [ + "$[1][3].type", + "$[1][3].params[0].params[0]" + ], + "answer": [ + "wait_second", + "2" + ], + "point": 2, + "desc": "문제 3/로봇방/[오브젝트]의 세부 동작 3/'2' 초 기다리기", + "type": "list" + }, + { + "ele": "$[1][4].type", + "answer": "restart_project", + "point": 2, + "desc": "문제 3/로봇방/[오브젝트]의 세부 동작 4/처음부터 다시 실행하기" + } + ], + "sortBlock": [ + "when_scene_start", + "when_object_click" + ], + "sort": 160 + } +} \ No newline at end of file diff --git a/correct/2602_6_CAS_2_B.json b/correct/2602_6_CAS_2_B.json new file mode 100644 index 0000000..8df2ac4 --- /dev/null +++ b/correct/2602_6_CAS_2_B.json @@ -0,0 +1,734 @@ +{ + "1-1": { + "type": "scene", + "ele": "$.[objects,scenes][?(@.name=='장면 1')]", + "point": 1.7, + "desc": "문제 1/장면 1/[배경] 이름 설정 1/이름 변경 없음", + "sort": 11 + }, + "1-2": { + "type": "scene", + "ele": "$.[objects,scenes][?(@.name=='나의 방')]", + "point": 1.7, + "desc": "문제 1/장면 2/[배경] 이름 설정 2/이름을 '나의 방'으로 변경하기", + "sort": 12 + }, + "1-3": { + "type": "scene", + "ele": "$..objects[?(@.name=='놀이동산')]", + "point": 1.7, + "desc": "문제 1/놀이동산(1)/[개체] 이름 설정 1/이름을 '놀이동산'으로 변경하기", + "sort": 13 + }, + "1-4": { + "type": "scene", + "ele": "$..objects[?(@.name=='학원')]", + "point": 1.7, + "desc": "문제 1/건물(6)/[개체] 이름 설정 2/이름을 '학원'으로 변경하기", + "sort": 14 + }, + "1-5": { + "type": "scene", + "ele": "$..objects[?(@.name=='우리집')]", + "point": 1.7, + "desc": "문제 1/예쁜집/[개체] 이름 설정 3/이름을 '우리집'으로 변경하기", + "sort": 15 + }, + "1-6": { + "type": "scene", + "ele": "$..objects[?(@.name=='어린이')]", + "point": 1.7, + "desc": "문제 1/어린이(2)/[개체] 이름 설정 4/이름을 '어린이'로 변경하기", + "sort": 16 + }, + "2-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'놀이동산')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.56, + "desc": "문제 2/놀이동산/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "100" + ], + "point": 1.56, + "desc": "문제 2/놀이동산/[시작]의 세부 동작 1/크기를 '100' 으로 정하기", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "-25", + "80" + ], + "point": 1.56, + "desc": "문제 2/놀이동산/[시작]의 세부 동작 2/x: '-25' y: '80' 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_object_click", + "point": 1.56, + "desc": "문제 2/놀이동산/오브젝트/오브젝트를 클릭했을 때" + }, + { + "ele": "$[1][1].params[*].params", + "answer": [ + "놀이동산 입니다!", + "1.5" + ], + "point": 1.56, + "desc": "문제 2/놀이동산/[오브젝트]의 세부 동작/'놀이동산 입니다!' 을 '1.5' 초 동안 '말하기'" + } + ], + "sortBlock": [ + "when_run_button_click", + "when_object_click" + ], + "sort": 102 + }, + "3-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'학원|건물')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.56, + "desc": "문제 2/학원/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "80" + ], + "point": 1.56, + "desc": "문제 2/학원/[시작]의 세부 동작 1/크기를 '80' 으로 정하기", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "170", + "-80" + ], + "point": 1.56, + "desc": "문제 2/학원/[시작]의 세부 동작 2/x: '170' y: '-80' 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_object_click", + "point": 1.56, + "desc": "문제 2/학원/오브젝트/오브젝트를 클릭했을 때" + }, + { + "ele": "$[1][1].params[*].params", + "answer": [ + "학원 입니다!", + "1.5" + ], + "point": 1.56, + "desc": "문제 2/학원/[오브젝트]의 세부 동작/'학원 입니다!' 을 '1.5' 초 동안 '말하기'" + } + ], + "sortBlock": [ + "when_run_button_click", + "when_object_click" + ], + "sort": 107 + }, + "11-0": { + "ele": "$.messages[?(@.name=='놀이동산')]", + "point": 1.56, + "desc": "문제 2/우리집/신호 1/'놀이동산' 신호 만들기", + "type": "scene", + "sort": 111 + }, + "12-0": { + "ele": "$.messages[?(@.name=='학원')]", + "point": 1.56, + "desc": "문제 2/우리집/신호 1/'학원' 신호 만들기", + "type": "scene", + "sort": 111 + }, + "4-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'우리집|예쁜')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.56, + "desc": "문제 2/우리집/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "110" + ], + "point": 1.56, + "desc": "문제 2/우리집/[시작]의 세부 동작 1/크기를 '110' 으로 정하기 ", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "-170", + "-90" + ], + "point": 1.56, + "desc": "문제 2/우리집/[시작]의 세부 동작 2/x: '-170' y: '-90' 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_object_click", + "point": 1.56, + "desc": "문제 2/우리집/오브젝트/오브젝트를 클릭했을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0].params[0]" + ], + "answer": [ + "ask_and_wait", + "첫 번째로 방문할 장소는?" + ], + "point": 1.56, + "desc": "문제 2/우리집/[오브젝트]의 세부 동작 1/'첫 번째로 방문할 장소는?' 을 묻고 대답 기다리기", + "type": "list" + }, + { + "ele": [ + "$[1][2].type", + "$[1][2].params[0].params[0]" + ], + "answer": [ + "wait_second", + "0.5" + ], + "point": 1.56, + "desc": "문제 2/우리집/[오브젝트]의 세부 동작 2/'0.5' 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[1][3].type", + "$[1][3].params[0].type", + "$[1][3].params[0].params[0].type", + "$[1][3].params[0].params[1]", + "$[1][3].params[0].params[2].params[0]" + ], + "answer": [ + "_if", + "boolean_basic_operator", + "get_canvas_input_value", + "EQUAL", + "놀이동산" + ], + "point": 1.56, + "desc": "문제 2/우리집/만일 1/만일 '대답' = '놀이동산' 이라면 ", + "type": "list" + }, + { + "ele": "$[1][3].statements[0][0].type", + "answer": "message_cast", + "point": 1.56, + "desc": "문제 2/우리집/[만일 1]의 세부 동작/'놀이동산' 신호 보내기" + }, + { + "ele": [ + "$[1][4].type", + "$[1][4].params[0].type", + "$[1][4].params[0].params[0].type", + "$[1][4].params[0].params[1]", + "$[1][4].params[0].params[2].params[0]" + ], + "answer": [ + "_if", + "boolean_basic_operator", + "get_canvas_input_value", + "EQUAL", + "학원" + ], + "point": 1.56, + "desc": "문제 2/우리집/만일 2/만일 '대답' = '학원' 이라면 ", + "type": "list" + }, + { + "ele": "$[1][4].statements[0][0].type", + "answer": "message_cast", + "point": 1.56, + "desc": "문제 2/우리집/[만일 2]의 세부 동작/'학원' 신호 보내기" + } + ], + "sortBlock": [ + "when_run_button_click", + "when_object_click" + ], + "sort": 112 + }, + "5-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'어린이')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_run_button_click", + "point": 1.56, + "desc": "문제 2/어린이/시작/시작하기 버튼을 클릭했을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0].params[0]" + ], + "answer": [ + "set_scale_size", + "40" + ], + "point": 1.56, + "desc": "문제 2/어린이/[시작]의 세부 동작 1/크기를 '40' 으로 정하기 ", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "-170", + "-100" + ], + "point": 1.56, + "desc": "문제 2/어린이/[시작]의 세부 동작 2/x: '-170' y: '-100' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[0][3].type", + "$[0][3].params[0]" + ], + "answer": [ + "repeat_inf", + null + ], + "point": 1.56, + "desc": "문제 2/어린이/반복/계속 반복하기", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][0].type", + "$[0][3].statements[0][0].params[0].type", + "$[0][3].statements[0][0].params[0].params[0]" + ], + "answer": [ + "_if", + "is_press_some_key", + "39" + ], + "point": 1.56, + "desc": "문제 2/어린이/만일/만일 '오른쪽 화살표' 키가 눌러져 있는가? 라면", + "type": "list" + }, + { + "ele": [ + "$[0][3].statements[0][0].statements[0][0].type", + "$[0][3].statements[0][0].statements[0][0].params[0].params[0]", + "$[0][3].statements[0][0].statements[0][0].params[1].params[0]" + ], + "answer": [ + "locate_xy", + "-90", + "-100" + ], + "point": 1.56, + "desc": "문제 2/어린이/[만일]의 세부 동작/x: '-90' y: '-100' 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_message_cast", + "point": 1.56, + "desc": "문제 2/어린이/신호 1/'놀이동산' 신호를 받았을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0].type", + "$[1][1].params[0].params[2].params[0]" + ], + "answer": [ + "repeat_while_true", + "reach_something", + null + ], + "point": 1.56, + "desc": "문제 2/어린이/반복 1/'놀이동산' 에 닿았는가? '이 될 때까지' 반복하기", + "type": "list" + }, + { + "ele": [ + "$[1][1].statements[0][0].type", + "$[1][1].statements[0][0].params[0].params[0]" + ], + "answer": [ + "locate_object_time", + "2" + ], + "point": 1.56, + "desc": "문제 2/어린이/[반복 1]의 세부 동작 1/'2' 초 동안 '놀이동산' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[1][1].statements[0][1].type", + "$[1][1].statements[0][1].params[0].params[0]" + ], + "answer": [ + "wait_second", + "0.5" + ], + "point": 1.56, + "desc": "문제 2/어린이/[반복 1]의 세부 동작 2/'0.5' 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[1][2].type", + "$[1][2].params[0].type", + "$[1][2].params[0].params[2].params[0]" + ], + "answer": [ + "repeat_while_true", + "reach_something", + null + ], + "point": 1.56, + "desc": "문제 2/어린이/반복 2/'학원' 에 닿았는가? '이 될 때까지' 반복하기", + "type": "list" + }, + { + "ele": [ + "$[1][2].statements[0][0].type", + "$[1][2].statements[0][0].params[0].params[0]" + ], + "answer": [ + "locate_object_time", + "2" + ], + "point": 1.56, + "desc": "문제 2/어린이/[반복 2]의 세부 동작 1/'2' 초 동안 '학원' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[1][2].statements[0][1].type", + "$[1][2].statements[0][1].params[0].params[0]" + ], + "answer": [ + "wait_second", + "1" + ], + "point": 1.56, + "desc": "문제 2/어린이/[반복 2]의 세부 동작 2/'1' 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[1][3].type", + "$[1][3].params[0].params[0]", + "$[1][3].params[1].params[0]", + "$[1][3].params[2].params[0]" + ], + "answer": [ + "locate_xy_time", + "2", + "-120", + "-100" + ], + "point": 1.56, + "desc": "문제 2/어린이/[신호 1]의 세부 동작 1/'2' 초 동안 x: '-120' y: '-100' 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[1][4].params[*].params", + "answer": [ + "집 도착!", + "1" + ], + "point": 1.56, + "desc": "문제 2/어린이/[신호 1]의 세부 동작 2/'집 도착!' 을 '1' 초 동안 '말하기'" + }, + { + "ele": "$[1][5].type", + "answer": "start_neighbor_scene", + "point": 1.56, + "desc": "문제 2/어린이/[신호 1]의 세부 동작 3/'다음' 장면 시작하기" + }, + { + "ele": "$[2][0].type", + "answer": "when_message_cast", + "point": 1.56, + "desc": "문제 2/어린이/신호 2/'학원' 신호를 받았을 때" + }, + { + "ele": [ + "$[2][1].type", + "$[2][1].params[0].type", + "$[2][1].params[0].params[2].params[0]" + ], + "answer": [ + "repeat_while_true", + "reach_something", + null + ], + "point": 1.56, + "desc": "문제 2/어린이/반복 1/'학원' 에 닿았는가? '이 될 때까지' 반복하기", + "type": "list" + }, + { + "ele": [ + "$[2][1].statements[0][0].type", + "$[2][1].statements[0][0].params[0].params[0]" + ], + "answer": [ + "locate_object_time", + "2" + ], + "point": 1.56, + "desc": "문제 2/어린이/[반복 1]의 세부 동작 1/'2' 초 동안 '학원' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[2][1].statements[0][1].type", + "$[2][1].statements[0][1].params[0].params[0]" + ], + "answer": [ + "wait_second", + "0.5" + ], + "point": 1.56, + "desc": "문제 2/어린이/[반복 1]의 세부 동작 2/'0.5' 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[2][2].type", + "$[2][2].params[0].type", + "$[2][2].params[0].params[2].params[0]" + ], + "answer": [ + "repeat_while_true", + "reach_something", + null + ], + "point": 1.56, + "desc": "문제 2/어린이/반복 2/'놀이동산' 에 닿았는가? '이 될 때까지' 반복하기", + "type": "list" + }, + { + "ele": [ + "$[2][2].statements[0][0].type", + "$[2][2].statements[0][0].params[0].params[0]" + ], + "answer": [ + "locate_object_time", + "2" + ], + "point": 1.56, + "desc": "문제 2/어린이/[반복 2]의 세부 동작 1/'2' 초 동안 '놀이동산' 위치로 이동하기", + "type": "list" + }, + { + "ele": [ + "$[2][2].statements[0][1].type", + "$[2][2].statements[0][1].params[0].params[0]" + ], + "answer": [ + "wait_second", + "1" + ], + "point": 1.56, + "desc": "문제 2/어린이/[반복 2]의 세부 동작 2/'1' 초 기다리기", + "type": "list" + }, + { + "ele": [ + "$[2][3].type", + "$[2][3].params[0].params[0]", + "$[2][3].params[1].params[0]", + "$[2][3].params[2].params[0]" + ], + "answer": [ + "locate_xy_time", + "2", + "-120", + "-100" + ], + "point": 1.56, + "desc": "문제 2/어린이/[신호 1]의 세부 동작 1/'2' 초 동안 x: '-120' y: '-100' 위치로 이동하기", + "type": "list" + }, + { + "ele": "$[2][4].params[*].params", + "answer": [ + "집 도착!", + "1" + ], + "point": 1.56, + "desc": "문제 2/어린이/[신호 1]의 세부 동작 2/'집 도착!' 을 '1' 초 동안 '말하기'" + }, + { + "ele": "$[2][5].type", + "answer": "start_neighbor_scene", + "point": 1.56, + "desc": "문제 2/어린이/[신호 1]의 세부 동작 3/'다음' 장면 시작하기" + } + ], + "sortBlock": [ + "when_run_button_click", + "when_message_cast", + "when_message_cast" + ], + "sort": 124 + }, + "6-0": { + "type": "script", + "ele": "$.objects[?(@.name=~'나의 방|장면 ')].script", + "blocks": [ + { + "ele": "$[0][0].type", + "answer": "when_scene_start", + "point": 1.56, + "desc": "문제 2/나의 방/장면/장면이 시작되었을 때" + }, + { + "ele": [ + "$[0][1].type", + "$[0][1].params[0]" + ], + "answer": [ + "set_visible_answer", + "HIDE" + ], + "point": 1.56, + "desc": "문제 2/나의 방/[장면]의 세부 동작 1/대답 '숨기기'", + "type": "list" + }, + { + "ele": [ + "$[0][2].type", + "$[0][2].params[0].params[0]", + "$[0][2].params[1]" + ], + "answer": [ + "dialog", + "여기는 우리집이야!", + "speak" + ], + "point": 1.56, + "desc": "문제 2/나의 방/[장면]의 세부 동작 2/'여기는 우리집이야!' 을 '말하기'", + "type": "list" + }, + { + "ele": "$[1][0].type", + "answer": "when_object_click", + "point": 2, + "desc": "문제 3/나의 방/오브젝트/오브젝트를 클릭했을 때" + }, + { + "ele": [ + "$[1][1].type", + "$[1][1].params[0]", + "$[1][1].params[1].params[0]" + ], + "answer": [ + "add_effect_amount", + "brightness", + "10" + ], + "point": 2, + "desc": "문제 3/나의 방/[오브젝트]의 세부 동작 1/'밝기' 효과를 '10' 만큼 주기", + "type": "list" + }, + { + "ele": [ + "$[1][2].type", + "$[1][2].params[0].params[0]", + "$[1][2].params[1]" + ], + "answer": [ + "dialog", + "처음부터 다시 실행합니다.", + "speak" + ], + "point": 2, + "desc": "문제 3/나의 방/[오브젝트]의 세부 동작 2/'처음부터 다시 실행합니다.' 를 '말하기'", + "type": "list" + }, + { + "ele": [ + "$[1][3].type", + "$[1][3].params[0].params[0]" + ], + "answer": [ + "wait_second", + "2" + ], + "point": 2, + "desc": "문제 3/나의 방/[오브젝트]의 세부 동작 3/'2' 초 기다리기", + "type": "list" + }, + { + "ele": "$[1][4].type", + "answer": "restart_project", + "point": 2, + "desc": "문제 3/나의 방/[오브젝트]의 세부 동작 4/처음부터 다시 실행하기" + } + ], + "sortBlock": [ + "when_scene_start", + "when_object_click" + ], + "sort": 150 + } +} \ No newline at end of file diff --git a/logs/cat.log b/logs/cat.log index 71e7df3..f9d1911 100644 --- a/logs/cat.log +++ b/logs/cat.log @@ -3411,3 +3411,867 @@ Traceback (most recent call last): File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\lex.py", line 255, in input raise ValueError('Expected a string') ValueError: Expected a string +[2026-02-04 16:06:53] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/2602_2_CAS_2_B_정답\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:53] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000028-김지효\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:54] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000029-김아윤\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:54] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000030-박승혜\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:54] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000031-전유빈\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:54] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000032-홍예나\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:54] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000033-문채원\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:55] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000034-여가온\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:55] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000035-김범서\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:55] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000036-최효석\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:55] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000037-김서율\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:55] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000038-김태윤\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:56] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000039-정지은\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:56] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000040-조다은\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:56] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000041-박다인\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:56] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000042-김다연\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:56] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000043-이승빈\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:57] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000044-신지안\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:57] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000045-김리원\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:57] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000046-김지민\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:57] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000047-이유준\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:58] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000048-강지후\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:58] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000049-장병헌\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:58] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000050-성수현\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:06:58] [ERROR] [main:423] 🚫Error processing ./output/2602_2_CAS_2_B/CAS-000051-옥정민\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:07:58] [ERROR] [main:423] 🚫Error processing ./output/00_test/2602_2_CAS_2_B_정답\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! +[2026-02-04 16:09:45] [ERROR] [main:423] 🚫Error processing ./output/00_test/2602_2_CAS_2_B_정답\project.json: Parse error near the end of string! +Traceback (most recent call last): + File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main + points = process_project(project_data, scoring_data) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 294, in process_project + block_elements = find_list_element(single_script, block_path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\project\Entry\Entry-Scoring\main.py", line 49, in find_list_element + [match.value for match in parse(expr).find(data)] + ^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\ext\parser.py", line 176, in parse + return ExtentedJsonPathParser(debug=debug).parse(path) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 58, in parse + return self.parse_token_stream(lexer.tokenize(string)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 61, in parse_token_stream + return self.parser.parse(lexer = IteratorToTokenStream(token_iterator)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 333, in parse + return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 1201, in parseopt_notrack + tok = call_errorfunc(self.errorfunc, errtoken, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\ply\yacc.py", line 192, in call_errorfunc + r = errorfunc(token) + ^^^^^^^^^^^^^^^^ + File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 77, in p_error + raise JsonPathParserError('Parse error near the end of string!') +jsonpath_ng.exceptions.JsonPathParserError: Parse error near the end of string! diff --git a/main.py b/main.py index 73baf43..4942575 100644 --- a/main.py +++ b/main.py @@ -353,11 +353,11 @@ def normalize_path(path): def main(): timestamp = datetime.now().strftime("%y%m%d") - # test_mode = False # 일반 채점 모드 - test_mode = True # 테스트 모드 + test_mode = False # 일반 채점 모드 + # test_mode = True # 테스트 모드 - exam_round = "2601" - exam_names = ["CAT_3_A"] # 여러 시험명을 리스트로 설정 + exam_round = "2602_6" + exam_names = ["CAS_2_B"] # 여러 시험명을 리스트로 설정 # exam_names = ["CAS_2_A", "CAS_2_B"] # 여러 시험명을 리스트로 설정 excel_list = [] diff --git a/시험자료/2602_3/제2602회 수시-코딩활용능력 2급 A형 문제.hwp b/시험자료/2602_3/제2602회 수시-코딩활용능력 2급 A형 문제.hwp new file mode 100644 index 0000000..b404591 Binary files /dev/null and b/시험자료/2602_3/제2602회 수시-코딩활용능력 2급 A형 문제.hwp differ diff --git a/시험자료/2602_3/제2602회 수시-코딩활용능력 2급 A형 정답.ent b/시험자료/2602_3/제2602회 수시-코딩활용능력 2급 A형 정답.ent new file mode 100644 index 0000000..022e4e3 Binary files /dev/null and b/시험자료/2602_3/제2602회 수시-코딩활용능력 2급 A형 정답.ent differ diff --git a/시험자료/2602_3/제2602회 수시-코딩활용능력 2급 A형 채점기준표.xlsx b/시험자료/2602_3/제2602회 수시-코딩활용능력 2급 A형 채점기준표.xlsx new file mode 100644 index 0000000..cdeaddf Binary files /dev/null and b/시험자료/2602_3/제2602회 수시-코딩활용능력 2급 A형 채점기준표.xlsx differ diff --git a/시험자료/2602_6/제2512회 코딩활용능력 2급 B형 채점기준표.xlsx b/시험자료/2602_6/제2512회 코딩활용능력 2급 B형 채점기준표.xlsx new file mode 100644 index 0000000..541538c Binary files /dev/null and b/시험자료/2602_6/제2512회 코딩활용능력 2급 B형 채점기준표.xlsx differ diff --git a/시험자료/2602_6/제2602회 수시6 코딩활용능력 2급 B형 문제.hwp b/시험자료/2602_6/제2602회 수시6 코딩활용능력 2급 B형 문제.hwp new file mode 100644 index 0000000..34aa524 Binary files /dev/null and b/시험자료/2602_6/제2602회 수시6 코딩활용능력 2급 B형 문제.hwp differ diff --git a/시험자료/2602_6/제2602회 수시6 코딩활용능력 2급 B형 문제.pdf b/시험자료/2602_6/제2602회 수시6 코딩활용능력 2급 B형 문제.pdf new file mode 100644 index 0000000..2705deb Binary files /dev/null and b/시험자료/2602_6/제2602회 수시6 코딩활용능력 2급 B형 문제.pdf differ diff --git a/시험자료/2602_6/제2602회 수시6 코딩활용능력 2급 B형 정답.ent b/시험자료/2602_6/제2602회 수시6 코딩활용능력 2급 B형 정답.ent new file mode 100644 index 0000000..2f75eb0 Binary files /dev/null and b/시험자료/2602_6/제2602회 수시6 코딩활용능력 2급 B형 정답.ent differ