2601회 채점기준 수정

This commit is contained in:
2026-01-29 16:43:27 +09:00
parent f8cf7ab53e
commit 9951750abe
19 changed files with 841 additions and 20 deletions

View File

@@ -50,10 +50,10 @@ def copy_ent_files(source_root, target_root):
# source_directory = r"D:\project\data\CAS_제2510회 정기\제2510회 코딩활용능력 2급 정기 답안파일" # 원본 디렉토리 경로 # source_directory = r"D:\project\data\CAS_제2510회 정기\제2510회 코딩활용능력 2급 정기 답안파일" # 원본 디렉토리 경로
# test_name = "2512_CAS_2_A" # test_name = "2512_CAS_2_A"
test_name = "2512_CAS_2_B" test_name = "2601_CAT_3_A"
# source_directory = r"D:\project\data\CAT_제2511회 정기\답안파일" # 원본 디렉토리 경로 # source_directory = r"D:\project\data\CAT_제2511회 정기\답안파일" # 원본 디렉토리 경로
source_directory = r"D:\project\data\제2512회 정기_CAS\CAS\B형" # 원본 디렉토리 경로 source_directory = r"D:\project\data\CAT_제2601회 정기\CAT_제2601회 정기\CAT_답안파일" # 원본 디렉토리 경로
target_directory = rf".\ent\{test_name}" # 타겟 디렉토리 경로 target_directory = rf".\ent\{test_name}" # 타겟 디렉토리 경로
copy_ent_files(source_directory, target_directory) copy_ent_files(source_directory, target_directory)

View File

@@ -50,8 +50,8 @@ def process_ent_files(ent_dir, output_dir):
# 실행 예 # 실행 예
if __name__ == "__main__": if __name__ == "__main__":
# test_names = ["2509_CAT_3_A"] test_names = ["2601_CAT_3_A"]
test_names = ["2512_CAS_2_A", "2512_CAS_2_B"] # test_names = ["2512_CAS_2_A", "2512_CAS_2_B"]
for test_name in test_names: for test_name in test_names:
ent_dir = f".\\ent\\{test_name}" ent_dir = f".\\ent\\{test_name}"
output_dir = f".\\output\\{test_name}" output_dir = f".\\output\\{test_name}"

Binary file not shown.

View File

@@ -392,13 +392,13 @@
{ {
"ele": [ "ele": [
"$[1][1].type", "$[1][1].type",
"$[1][1].params[0].params[0].params[3]", "$[1][1].params[0].params[1]",
"$[1][1].params[0].type", "$[1][1].params[0].type",
"$[1][1].params[0].params[2].params[0]" "$[1][1].params[0].params[2].params[0]"
], ],
"answer": [ "answer": [
"repeat_while_true", "repeat_while_true",
null, "$..objects[?(@.name=='놀이동산')].id",
"reach_something", "reach_something",
null null
], ],
@@ -435,13 +435,13 @@
{ {
"ele": [ "ele": [
"$[1][2].type", "$[1][2].type",
"$[1][2].params[0].params[0].params[3]", "$[1][2].params[0].params[1]",
"$[1][2].params[0].type", "$[1][2].params[0].type",
"$[1][2].params[0].params[2].params[0]" "$[1][2].params[0].params[2].params[0]"
], ],
"answer": [ "answer": [
"repeat_while_true", "repeat_while_true",
null, "$..objects[?(@.name=='백화점')].id",
"reach_something", "reach_something",
null null
], ],
@@ -516,13 +516,13 @@
{ {
"ele": [ "ele": [
"$[2][1].type", "$[2][1].type",
"$[2][1].params[0].params[0].params[3]", "$[2][1].params[0].params[1]",
"$[2][1].params[0].type", "$[2][1].params[0].type",
"$[2][1].params[0].params[2].params[0]" "$[2][1].params[0].params[2].params[0]"
], ],
"answer": [ "answer": [
"repeat_while_true", "repeat_while_true",
null, "$..objects[?(@.name=='백화점')].id",
"reach_something", "reach_something",
null null
], ],
@@ -559,13 +559,13 @@
{ {
"ele": [ "ele": [
"$[2][2].type", "$[2][2].type",
"$[2][2].params[0].params[0].params[3]", "$[2][2].params[0].params[1]",
"$[2][2].params[0].type", "$[2][2].params[0].type",
"$[2][2].params[0].params[2].params[0]" "$[2][2].params[0].params[2].params[0]"
], ],
"answer": [ "answer": [
"repeat_while_true", "repeat_while_true",
null, "$..objects[?(@.name=='놀이동산')].id",
"reach_something", "reach_something",
null null
], ],

498
correct/2601_CAT_3_A.json Normal file
View File

@@ -0,0 +1,498 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='약도')]",
"point": 2,
"desc": "문제 1/약도/[배경] 이름 설정/이름 변경 없음",
"sort": 11
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='놀이동산')]",
"point": 2,
"desc": "문제 1/놀이동산(4)/[개체] 이름 설정 1/이름을 '놀이동산'으로 변경하기",
"sort": 13
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='백화점')]",
"point": 2,
"desc": "문제 1/건물(6)/[개체] 이름 설정 2/이름을 '백화점'으로 변경하기",
"sort": 14
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='우리집')]",
"point": 2,
"desc": "문제 1/예쁜집/[개체] 이름 설정 3/이름을 '우리집'으로 변경하기",
"sort": 15
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='어린이')]",
"point": 2,
"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": 2.36,
"desc": "문제 2/놀이동산/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]"
],
"answer": [
"set_scale_size",
"90"
],
"point": 2.36,
"desc": "문제 2/놀이동산/[시작]의 세부 동작 1/크기를 '90' 으로 정하기",
"type": "list"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"-25",
"60"
],
"point": 2.36,
"desc": "문제 2/놀이동산/[시작]의 세부 동작 2/x: '-25' y: '60' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[1][0].type",
"$[1][0].params[1]"
],
"answer": [
"when_some_key_pressed",
"49"
],
"point": 2.36,
"desc": "문제 2/놀이동산/'1' 키/1' 키를 눌렀을 때",
"type": "list"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"30"
],
"point": 2.36,
"desc": "문제 2/놀이동산/['1' 키]의 세부 동작 1/'색깔' 효과를 '30' 만큼 주기",
"type": "list"
},
{
"ele": "$[1][2].params[*].params",
"answer": [
"여기는 놀이동산!",
"1"
],
"point": 2.36,
"desc": "문제 2/놀이동산/['1' 키]의 세부 동작 2/'여기는 놀이동산!' 을 '1' 초 동안 '말하기'"
},
{
"ele": "$[1][3].type",
"answer": "erase_all_effects",
"point": 2.36,
"desc": "문제 2/놀이동산/['1' 키]의 세부 동작 3/효과 모두 지우기"
}
],
"sortBlock": [
"when_run_button_click",
"when_some_key_pressed"
],
"sort": 102
},
"3-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'백화점|건물')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"point": 2.36,
"desc": "문제 2/백화점/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]"
],
"answer": [
"set_scale_size",
"50"
],
"point": 2.36,
"desc": "문제 2/백화점/[시작]의 세부 동작 1/크기를 '50' 으로 정하기",
"type": "list"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"180",
"50"
],
"point": 2.36,
"desc": "문제 2/백화점/[시작]의 세부 동작 2/x: '180' y: '50' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[1][0].type",
"$[1][0].params[1]"
],
"answer": [
"when_some_key_pressed",
"50"
],
"point": 2.36,
"desc": "문제 2/백화점/'2' 키/'2' 키를 눌렀을 때",
"type": "list"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"40"
],
"point": 2.36,
"desc": "문제 2/백화점/['2' 키]의 세부 동작 1/'색깔' 효과를 '40' 만큼 주기",
"type": "list"
},
{
"ele": "$[1][2].params[*].params",
"answer": [
"여기는 백화점!",
"1"
],
"point": 2.36,
"desc": "문제 2/백화점/['2' 키]의 세부 동작 2/'여기는 백화점!' 을 '1' 초 동안 '말하기'"
},
{
"ele": "$[1][3].type",
"answer": "erase_all_effects",
"point": 2.36,
"desc": "문제 2/백화점/['2' 키]의 세부 동작 3/효과 모두 지우기"
}
],
"sortBlock": [
"when_run_button_click",
"when_some_key_pressed"
],
"sort": 109
},
"4-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'우리집|예쁜')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"point": 2.36,
"desc": "문제 2/우리집/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]"
],
"answer": [
"set_scale_size",
"60"
],
"point": 2.36,
"desc": "문제 2/우리집/[시작]의 세부 동작 1/크기를 '60' 으로 정하기",
"type": "list"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"-190",
"-90"
],
"point": 2.36,
"desc": "문제 2/우리집/[시작]의 세부 동작 2/x: '-190' y: '-90' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[1][0].type",
"$[1][0].params[1]"
],
"answer": [
"when_some_key_pressed",
"51"
],
"point": 2.36,
"desc": "문제 2/우리집/'3' 키/'3' 키를 눌렀을 때",
"type": "list"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"35"
],
"point": 2.36,
"desc": "문제 2/우리집/['3' 키]의 세부 동작 1/'색깔' 효과를 '35' 만큼 주기",
"type": "list"
},
{
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]"
],
"answer": [
"wait_second",
"1"
],
"point": 2.36,
"desc": "문제 2/우리집/['3' 키]의 세부 동작 2/'1' 초 기다리기",
"type": "list"
},
{
"ele": "$[1][3].type",
"answer": "erase_all_effects",
"point": 2.36,
"desc": "문제 2/우리집/['3' 키]의 세부 동작 3/효과 모두 지우기"
}
],
"sortBlock": [
"when_run_button_click",
"when_some_key_pressed"
],
"sort": 116
},
"5-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'어린이')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"point": 2.36,
"desc": "문제 2/어린이/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]"
],
"answer": [
"set_scale_size",
"30"
],
"point": 2.36,
"desc": "문제 2/어린이/[시작]의 세부 동작 1/크기를 '30' 으로 정하기",
"type": "list"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"-100",
"-100"
],
"point": 2.36,
"desc": "문제 2/어린이/[시작]의 세부 동작 2/x: '-100' y: '-100' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][3].params[*].params",
"answer": [
"야호! 출발!",
"1"
],
"point": 2.36,
"desc": "문제 2/어린이/[시작]의 세부 동작 3/'야호! 출발!' 을 '1' 초 동안 '말하기'"
},
{
"ele": [
"$[1][0].type",
"$[1][0].params[1]"
],
"answer": [
"when_some_key_pressed",
"49"
],
"point": 2.36,
"type": "list",
"desc": "문제 2/어린이/'1' 키/1' 키를 눌렀을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0].params[0]"
],
"answer": [
"locate_object_time",
"2"
],
"point": 2.36,
"desc": "문제 2/어린이/['1' 키]의 세부 동작 1/'2' 초 동안 '놀이동산' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[1][2].type",
"answer": "hide",
"point": 2.36,
"desc": "문제 2/어린이/['1' 키]의 세부 동작 2/모양 숨기기"
},
{
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]"
],
"answer": [
"wait_second",
"1"
],
"point": 2.36,
"desc": "문제 2/어린이/['1' 키]의 세부 동작 3/'1' 초 기다리기",
"type": "list"
},
{
"ele": "$[1][4].type",
"answer": "show",
"point": 2.36,
"desc": "문제 2/어린이/['1' 키]의 세부 동작 4/모양 보이기"
},
{
"ele": [
"$[2][0].type",
"$[2][0].params[1]"
],
"answer": [
"when_some_key_pressed",
"50"
],
"point": 2.36,
"type": "list",
"desc": "문제 2/어린이/'2' 키/'2' 키를 눌렀을 때"
},
{
"ele": [
"$[2][1].type",
"$[2][1].params[0].params[0]"
],
"answer": [
"locate_object_time",
"2"
],
"point": 2.36,
"desc": "문제 2/어린이/['2' 키]의 세부 동작 1/'2' 초 동안 '백화점' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[2][2].type",
"answer": "hide",
"point": 2.36,
"desc": "문제 2/어린이/['2' 키]의 세부 동작 2/모양 숨기기"
},
{
"ele": [
"$[2][3].type",
"$[2][3].params[0].params[0]"
],
"answer": [
"wait_second",
"1"
],
"point": 2.36,
"desc": "문제 2/어린이/['2' 키]의 세부 동작 3/'1' 초 기다리기",
"type": "list"
},
{
"ele": "$[2][4].type",
"answer": "show",
"point": 2.36,
"desc": "문제 2/어린이/['2' 키]의 세부 동작 4/모양 보이기"
},
{
"ele": [
"$[3][0].type",
"$[3][0].params[1]"
],
"answer": [
"when_some_key_pressed",
"51"
],
"point": 2.36,
"type": "list",
"desc": "문제 2/어린이/'3' 키/'3' 키를 눌렀을 때"
},
{
"ele": [
"$[3][1].type",
"$[3][1].params[0].params[0]"
],
"answer": [
"locate_object_time",
"2"
],
"point": 2.36,
"desc": "문제 2/어린이/['3' 키]의 세부 동작 1/'2' 초 동안 '우리집' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[3][2].params[*].params",
"answer": [
"다녀왔습니다!",
"1"
],
"point": 2.36,
"desc": "문제 2/어린이/['3' 키]의 세부 동작 2/'다녀왔습니다!' 를 '1' 초 동안 '말하기'"
}
],
"sortBlock": [
"when_run_button_click",
"when_some_key_pressed",
"when_some_key_pressed",
"when_some_key_pressed"
],
"sort": 123
}
}

View File

@@ -3105,3 +3105,309 @@ Traceback (most recent call last):
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 78, in p_error File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 78, in p_error
raise JsonPathParserError('Parse error at %s:%s near token %s (%s)' raise JsonPathParserError('Parse error at %s:%s near token %s (%s)'
jsonpath_ng.exceptions.JsonPathParserError: Parse error at 1:4 near token ? (?) jsonpath_ng.exceptions.JsonPathParserError: Parse error at 1:4 near token ? (?)
[2026-01-29 15:57:35] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project
block_elements = find_element(single_script, block_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element
parsed_expr = parse(jsonpath_expr)
^^^^^^^^^^^^^^^^^^^^
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 1063, in parseopt_notrack
lookahead = get_token() # Get the next token
^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token
return next(self.iterator)
^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize
new_lexer.input(string)
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-01-29 15:59:56] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project
block_elements = find_element(single_script, block_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element
parsed_expr = parse(jsonpath_expr)
^^^^^^^^^^^^^^^^^^^^
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 1063, in parseopt_notrack
lookahead = get_token() # Get the next token
^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token
return next(self.iterator)
^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize
new_lexer.input(string)
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-01-29 16:00:40] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project
block_elements = find_element(single_script, block_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element
parsed_expr = parse(jsonpath_expr)
^^^^^^^^^^^^^^^^^^^^
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 1063, in parseopt_notrack
lookahead = get_token() # Get the next token
^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token
return next(self.iterator)
^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize
new_lexer.input(string)
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-01-29 16:05:50] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project
block_elements = find_element(single_script, block_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element
parsed_expr = parse(jsonpath_expr)
^^^^^^^^^^^^^^^^^^^^
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 1063, in parseopt_notrack
lookahead = get_token() # Get the next token
^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token
return next(self.iterator)
^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize
new_lexer.input(string)
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-01-29 16:08:11] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project
block_elements = find_element(single_script, block_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element
parsed_expr = parse(jsonpath_expr)
^^^^^^^^^^^^^^^^^^^^
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 1063, in parseopt_notrack
lookahead = get_token() # Get the next token
^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token
return next(self.iterator)
^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize
new_lexer.input(string)
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-01-29 16:08:51] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project
block_elements = find_element(single_script, block_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element
parsed_expr = parse(jsonpath_expr)
^^^^^^^^^^^^^^^^^^^^
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 1063, in parseopt_notrack
lookahead = get_token() # Get the next token
^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token
return next(self.iterator)
^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize
new_lexer.input(string)
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-01-29 16:10:18] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project
block_elements = find_element(single_script, block_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element
parsed_expr = parse(jsonpath_expr)
^^^^^^^^^^^^^^^^^^^^
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 1063, in parseopt_notrack
lookahead = get_token() # Get the next token
^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token
return next(self.iterator)
^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize
new_lexer.input(string)
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-01-29 16:14:04] [ERROR] [main:408] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 403, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 281, in process_project
block_elements = find_element(single_script, block_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element
parsed_expr = parse(jsonpath_expr)
^^^^^^^^^^^^^^^^^^^^
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 1063, in parseopt_notrack
lookahead = get_token() # Get the next token
^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token
return next(self.iterator)
^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize
new_lexer.input(string)
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-01-29 16:31:54] [ERROR] [main:414] 🚫Error processing ./output/00_test/2601_CAT_3_A_정답\project.json: Expected a string
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 409, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 287, in process_project
block_elements = find_element(single_script, block_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 29, in find_element
parsed_expr = parse(jsonpath_expr)
^^^^^^^^^^^^^^^^^^^^
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 1063, in parseopt_notrack
lookahead = get_token() # Get the next token
^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\parser.py", line 197, in token
return next(self.iterator)
^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\lexer.py", line 29, in tokenize
new_lexer.input(string)
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

33
main.py
View File

@@ -192,13 +192,20 @@ def process_project(project_data, scoring_data):
# - 복제본이 생성 되었을 때 : when_clone_start # - 복제본이 생성 되었을 때 : when_clone_start
# - 장면이 시작 되었을 때 : when_scene_start # - 장면이 시작 되었을 때 : when_scene_start
# - 오브젝트를 클릭 했을 때 : when_object_click # - 오브젝트를 클릭 했을 때 : when_object_click
# - 특정 키가 눌렸을 때 : when_some_key_pressed
# 이벤트 블록이 존재하는지 여부 확인용 변수 # 이벤트 블록이 존재하는지 여부 확인용 변수
# 2026-01-29 16:40:29
# target_event_type 회차마다 추가 될 수 있으므로
# 채점 기준표의 answer 키값과 비교하여 동적으로 처리하도록 수정
# 2601회는 "when_some_key_pressed"가 필요해서 추가함
target_event_type = { target_event_type = {
"when_run_button_click", "when_run_button_click",
"when_message_cast", "when_message_cast",
"when_clone_start", "when_clone_start",
"when_scene_start", "when_scene_start",
"when_object_click" "when_object_click",
"when_some_key_pressed"
} }
for question_key, question_info in scoring_data.items(): for question_key, question_info in scoring_data.items():
@@ -215,9 +222,19 @@ def process_project(project_data, scoring_data):
# block_event_order 리스트에 추가 # block_event_order 리스트에 추가
if isinstance(block_list, list) and block_list: if isinstance(block_list, list) and block_list:
for block in block_list: for block in block_list:
answer = block.get("answer") # answer 키값을 안전하게 가져오기 answer = block.get("answer")
if isinstance(answer, str) and answer in target_event_type: if isinstance(answer, str):
block_event_order.append(answer) # 리스트에 추가 if answer in target_event_type:
block_event_order.append(answer)
# 2026-01-29 16:39:48
# answer가 리스트인 경우 리스트 요소들 모두를 확인
# JSON채점 기준표에서 answer가 리스트인 경우가 생겨서 추가함
elif isinstance(answer, list):
# answer 리스트 내에 target_event_type에 포함된 요소가 있으면 추가
for ans_item in answer:
if ans_item in target_event_type:
block_event_order.append(ans_item)
print(f"▶ Processing question: {question_key}") print(f"▶ Processing question: {question_key}")
@@ -336,11 +353,11 @@ def normalize_path(path):
def main(): def main():
timestamp = datetime.now().strftime("%y%m%d") timestamp = datetime.now().strftime("%y%m%d")
test_mode = False # 일반 채점 모드 # test_mode = False # 일반 채점 모드
# test_mode = True # 테스트 모드 test_mode = True # 테스트 모드
exam_round = "2512" exam_round = "2601"
exam_names = ["CAS_2_A"] # 여러 시험명을 리스트로 설정 exam_names = ["CAT_3_A"] # 여러 시험명을 리스트로 설정
# exam_names = ["CAS_2_A", "CAS_2_B"] # 여러 시험명을 리스트로 설정 # exam_names = ["CAS_2_A", "CAS_2_B"] # 여러 시험명을 리스트로 설정
excel_list = [] excel_list = []