case1. การตรวจคัดแยกการป้อนและส่งออก

เพิ่มโฟลเดอร์และไฟล์ต่อไปนี้ในโครงสร้างไฟล์ที่ตั้งค่าไว้ล่วงหน้า

  • โฟลเดอร์ input / โฟลเดอร์ output: กำหนดเทสเคสสำหรับการประเมินผล

  • ไฟล์ testcases.py: กำหนดคะแนนส่วนบางส่วนและข้อความของคำตอบถูก/ผิด

1. เขียนเทสเคสสำหรับการประเมินผลตามการป้อน-ออกข้อมูล

สร้างไฟล์เพื่อเก็บค่าการป้อน-ออกข้อมูลสำหรับการประเมินผล จากนั้นเขียนเทสเคสแต่ละรายการ

  • โฟลเดอร์ input

    • บันทึกข้อมูลการป้อนของแต่ละเคสเป็นไฟล์ txt

    • บันทึกข้อมูลการป้อนเพียงรายการเดียวสำหรับแต่ละเคส

  • โฟลเดอร์ output

    • บันทึกข้อมูลการออกเพียงรายการเดียวสำหรับแต่ละเคสที่สอดคล้องกับข้อมูลการป้อนที่เขียนในโฟลเดอร์ input

2. เขียนข้อความของการประเมินผล

กำหนดข้อความถูก/ผิดของแต่ละรายการตามที่กำหนดในเทสเคส นอกจากนี้ยังกำหนดคะแนนส่วนบางส่วนสำหรับแต่ละเทสเคส

# ข้อความของคำตอบที่ถูกต้องตามเทสเคส
correct_messages = [
        "เทสเคสที่ 1 คำตอบถูกต้อง!",
"เทสเคสที่ 2 คำตอบถูกต้อง!"
]

# ข้อความของคำตอบที่ผิดตามเทสเคส

wrong_message = [
"เทสเคสที่ 1 คำตอบผิด!",
"เทสเคสที่ 2 คำตอบผิด!"
]

# คะแนนส่วนบางส่วนของแต่ละเทสเคส

scores = [50, 50]

3. เขียนโค้ดประเมินผล (grader.py)

ดำเนินการประเมินผลของโค้ดของนักเรียนโดยรันโค้ดที่นักเรียนเขียนและตรวจสอบผลลัพธ์ที่ได้จากโค้ดที่นักเรียนเขียน จากนั้นเปรียบเทียบกับค่าผลลัพธ์ที่คาดการณ์ไว้ (ไฟล์ output) เพื่อตรวจสอบผลลัพธ์ที่ถูกต้องหรือไม่

สามารถให้คะแนนส่วนบางส่วนสำหรับแต่ละเทสเคส และส่งผลการประเมินที่เสร็จสิ้นไปยังแพลตฟอร์ม (LXP) ด้วย elice_utils.secure_send_score(total_score)

โค้ดตัวอย่างแสดงดังต่อไปนี้

import os
import subprocess
import sys
from testcases import *
sys.path.append(os.getcwd())
from grader_elice_utils import EliceUtils  # isort:skip

elice_utils = EliceUtils()
elice_utils.secure_init()

SUM_TESTCASE_SCORES = 100
INPUT_DIR = '.elice/input/'
OUTPUT_DIR = '.elice/output/'

try:
    total_score = 0

    # 0. เรียกใช้ไฟล์ input, output
    input_data = [x for x in os.listdir(INPUT_DIR) if x.endswith('.txt')]
    output_data = [x for x in os.listdir(OUTPUT_DIR) if x.endswith('.txt')]

    # 1. ตรวจสอบจำนวนเทสเคส
    if len(input_data) != len(output_data):
        sys.exit(1)
    NUM_TESTCASES = len(input_data)

    # 2. ตรวจสอบชื่อไฟล์
    matching = True
    for i in range(1, NUM_TESTCASES + 1):
        input_file = '%d.txt' % i
        output_file = '%d.txt' % i

        if input_file not in input_data:
            matching = False
        if output_file not in output_data:
            matching = False
    if not matching:
        sys.exit(1)

    # 3. ประเมินผลแต่ละเทสเคส
    for i in range(0, NUM_TESTCASES):
        testcase_score = scores[i]
        input_file = '%d.txt' % (i+1)

        input_text = subprocess.run(['cat', '%s%s' % (INPUT_DIR, input_file)],
                                    stdout=subprocess.PIPE).stdout
        result = subprocess.run(['/bin/bash', '.elice/runner.sh'],
                                input=input_text,
                                stdout=subprocess.PIPE)
        student_result = result.stdout.decode('utf-8')

        answer = ''.join(open('%s%s' % (OUTPUT_DIR, input_file)).readlines())

        student_result = student_result.strip()
        answer = answer.strip()

        # ตรวจสอบคำตอบถูก/ผิดของแต่ละเทสเคส
        if answer == student_result:
            total_score += testcase_score # เพิ่มคะแนนส่วนบางส่วนของเทสเคส
            elice_utils.secure_send_grader('✅ {} \n'.format(correct_messages[i]))

        else:
            elice_utils.secure_send_grader('❌ {} \n'.format(wrong_message[i]))

    # 5. คำนวณคะแนนสุทธิ
    total_score = int(total_score)
    elice_utils.secure_send_score(total_score)

except Exception as err:
    elice_utils.secure_send_grader('เกิดข้อผิดพลาดในระหว่างการประเมินผล โปรดตรวจสอบว่าโค้ดทำงานได้ถูกต้องหรือไม่\n')
    elice_utils.secure_send_score(0)
    sys.exit(1)

Last updated