วิธีการใช้งาน Cafe grader
ภาพรวมของ cafe grader
Cafe grader นั้นเป็นระบบรับและตรวจโปรแกรม ผู้ใช้งานของระบบจะแบ่งเป็นสองกลุ่มคือ ผู้ตั้งโจทย์ และ ผู้แก้โจทย์ ผู้ตั้งโจทย์จะทำการสร้างโจทย์ และนำโจทย์เข้าสู่ระบบ ในขณะที่ผู้แก้โจทย์จะศึกษาโจทย์ เขียนโปรแกรมเพื่อแก้โจทย์ และส่งโปรแกรมดังกล่าวมาเพื่อให้ระบบทำการตรวจสอบ การตรวจสอบนั้นจะทำโดยให้ผู้ตั้งโจทย์กำหนด input และ output ที่ถูกต้องของโปรแกรม และนำ input/output ดังกล่าวเข้าสู่ระบบ ระบบจะทำการรันโปรแกรมที่รับมาจากผู้แก้โจทย์ โดยใช้ input ที่ถูกกำหนดโดยผู้ตั้งโจทย์ แล้ว เปรียบเทียบ output จากโปรแกรมที่รับเข้ามากับ output ที่ได้จากผู้ตั้งโจทย์ ถ้าผลลัพธ์ตรงกัน หรือมีเงื่อนไขตามที่ผู้ตั้งโจทย์กำหนด ระบบจะทำการให้คะแนนกับโปรแกรมที่รับเข้ามา
Cafe grader รองรับการใช้งานโดยผู้ใช้หลายคน และ รองรับโจทย์จำนวนหลายข้อในเวลาเดียวกัน ผู้ตั้งโจทย์และผู้แก้โจทย์สามารถตรวจสอบได้ว่าผลการทำงานของ โปรแกรมที่รับเข้ามาของผู้แก้โจทย์แต่ละบุคคล ในแต่ละข้อนั้นมีผลเป็นอย่างไร นอกจากนี้ Cafe grader ยังมีรองรับการทำงานช่วยเหลือต่าง ๆ เกี่ยวกับการทำโจทย์ ตัวอย่างเช่น ระบบส่งคำถาม-คำตอบเกี่ยวกับรายละเอียดของโจทย์ ระบบจำกัดเวลาการส่งงาน ระบบจัดกลุ่มโจทย์สำหรับแต่ละกลุ่มของผู้ทำโจทย์ และ
โจทย์
โจทย์เป็นข้อมูลหลักที่ผู้ตั้งโจทย์จะต้องนำมาใส่ใน Cafe grader โจทย์นั้นจะประกอบด้วยข้อมูลดังต่อไปนี้
- ชื่อย่อของโจทย์ ซึ่งต้องไม่ซ้ำกันในโจทย์แต่ละข้อ และควรเป็นภาษาอังกฤษ
- ชื่อเต็มของโจทย์
- วิธีการตรวจสอบโปรแกรม ซึ่งมีได้ 2 วิธี คือ
- การกำหนดรายการของคู่ input และ output ที่ควรจะเป็น
- การใช้โปรแกรมเฉพาะสำหรับตรวจ input/output ซึ่งจะต้องมี input สำหรับ โปรแกรมด้่วย (แต่อาจจะไม่มี output ที่ควรเป็น)
- คำอธิบาย
- คะแนนเต็มสำหรับการตรวจ
- ข้อกำหนดทางทรัพยากรณ์ คือ เวลา และ หน่วยความจำที่อนุญาติให้โปรแกรมของผู้แก้โจทย์สามารถใช้ได้
ข้อมูลในข้อ 1. - 3. นั้น ผู้ตั้งโจทย์จำเป็นจะต้องจัดเตรียมสำหรับโจทย์แต่ละข้อโดยเฉพาะ ในขณะที่ข้อที่เหลือมีค่าที่กำหนดโดยปริยายจากระบบ ซึ่งผู้ตั้งโจทย์สามารถปรับเปลี่ยนให้ตรงกับโจทย์แต่ละข้อได้
โปรแกรม
โปรแกรมที่ส่งโดยผู้แก้โจทย์นั้น จะอยู่ในรูปแบบ source code ของภาษา C หรือ C++ ในการส่งโปรแกรมแต่ละครั้งนั้น ผู้แก้โจทย์จะต้องทำจัดเตรียมข้อมูลสองส่วนคือ
- ชื่อย่อของโจทย์ที่ต้องการส่ง
- โปรแกรมสำหรับโจทย์ข้อดังกล่าว
สำหรับโจทย์แต่ละข้อนั้น ผู้แก้โจทย์สามารถส่งโปรแกรมได้หลายโปรแกรม โดยที่ระบบจะเก็บรายละเอียดของการส่งแต่ละครั้ง รวมถึงโปรแกรมที่ส่งมาในครั้งนั้น ๆ ด้วย แต่ระบบจะยึดถือจากโปรแกรมที่ส่งมาครั้งล่าสุดเป็นหลัก
การตรวจโปรแกรม
การตรวจโปรแกรมมี 2 รูปแบบ ดังนี้
1. ตรวจโดยการกำหนด input/output ที่ควรเป็น
การตรวจโปรแกรมโดยให้ผู้ตั้งโจทย์กำหนด input และ output ที่ควรเป็นสำหรับโจทย์ ระบบ cafe grader จะทำการรันโปรแกรมของผู้แก้โจทย์ โดยใช้ input ที่กำหนดโดยผู้ตั้งโจทย์ แล้วนำ output ของโปรแกรมของผู้แก้โจทย์ไปเปรียบเทียบกับ output ที่กำหนดไว้ข้างต้นโดยผู้ตั้งโจทย์ โดยการเปรียบเทียบจะเป็นการเปรียบเทียบตามตัวอักษร ถ้าตัวอักษรเหมือนกัน ระบบก็จะให้คะแนน รูปต่อไปนี้แสดงแผนภาพโดยรวมของการตรวจแบบกำหนด input/output
2. ตรวจโดยใช้โปรแกรมตรวจ
การตรวจโปรแกรมโดยใช้โปรแกรมตรวจเฉพาะ ในวิธีนี้ ผู้ตั้งโจทย์จะกำหนด input ของโจทย์ และเขียนโปรแกรมเฉพาะขึ้นมาสำหรับการตรวจ โดยวิธีการตรวจจะคล้ายคลึงกับแบบแรก โดยที่ระบบ cafe grader จะทำการรันโปรแกรมของผู้แก้โจทย์ โดยใช้ input ที่กำหนดโดยผู้ตั้งโจทย์ เช่นเดียวกัน แต่แทนที่จะนำ output ของผู้แก้โจทย์ไปเปรียบเทียบกับ output ของผู้ตั้งโจทย์โดยตรง ระบบจะไปเรียกใช้โปรแกรมเฉพาะของผู้แก้โจทย์แทน โดยโปรแกรมเฉพาะนี้จะทำหน้าที่คำนวณคะแนนที่ควรได้ โดยอาศัย output ของผู้แก้โจทย์, input ของผู้ตั้งโจทย์ และข้อมูลอื่น ๆ ที่ผู้ตั้งโจทย์กำหนดมาให้ในการให้คะแนน รูปต่อไปนี้แสดงแผนภาพโดยรวมของการตรวจแบบดังกล่าว
การใช้งานสำหรับผู้ดูแลระบบ
ในส่วนนี้จะอธิบายพร้อมแสดงตัวอย่างการใช้งานเบื้องต้นพร้อมทั้งแสดงตัวอย่าง ตัวอย่างในส่วนนี้จะถือว่าผู้ดูแลระบบได้ทำการ log in เข้าสู่ระบบแล้ว โดยรหัสผู้ใช้เริ่มต้นของผู้ดูแลระบบคือ root รหัสผ่านคือ ioionrails
การสร้างผู้ใช้
ผู้ดูแลระบบจะต้องทำการสร้างบัญชีสำหรับผู้ใช้ก่อน โดยใช้เลือกที่หัวข้อ [ users ] แล้วกรอกรายละเอียดของผู้ใช้ลงในส่วน Quick add ดังที่แสดงในตัวอย่าง แล้วจึงกดปุ่ม create
การเพิ่มโจทย์
สมมติให้ผู้ตั้งโจทย์ ได้ทำการสร้างโจทย์ดังตัวอย่างต่อไปนี้
การหาตัวเลขฟิโบนักชี ลำดับฟิโบนักชีคือลำดับที่ประกอบด้วยตัวเลขดังต่อไปนี้ ตัวเลขตัวแรกในลำดับคือเลข 0 และเราเรียกตัวเลขนั้นว่าตัวเลขฟิโบนักชีลำดับที่ 0 จากลำดับดังกล่าว ตัวเลขฟิโบนักชีลำดับที่ 6 คือตัวเลข 8 นิยามของตัวเลขฟิโบนักชีลำดับที่ n ซึ่งเขียนแทนด้วย เป็นดังต่อไปนี้ งานของคุณ จงเขียนโปรแกรมเพื่อหาตัวเลขฟิโบนักชีลำดับที่ n ข้อมูลนำเข้า ค่า n ที่ระบุตัวเลขฟิโบนักชีที่ต้องการ โดยที่ ข้อมูลส่งออก ค่า ตัวอย่าง ตัวอย่าง 1 ข้อมูลนำเข้า: 6 ข้อมูลส่งออก: 8 ตัวอย่าง 2 ข้อมูลนำเข้า: 10 ข้อมูลส่งออก: 55
โดยที่ผู้ตั้งโจทย์ได้กำหนดคู่ของ input/output ที่จะใช้สำหรับการตรวจสอบโปรแกรม จำนวน 8 คู่ ดังต่อไปนี้
# | ข้อมูลนำเข้า | ข้อมูลส่งออกที่ควรเป็น |
คู่ที่ 1 | 6 | 8 |
คู่ที่ 2 | 10 | 55 |
คู่ที่ 3 | 4 | 3 |
คู่ที่ 4 | 5 | 5 |
คู่ที่ 5 | 8 | 21 |
คู่ที่ 6 | 9 | 34 |
คู่ที่ 7 | 1 | 1 |
คู่ที่ 8 | 0 | 0 |
ผู้ตั้งโจทย์จะต้องจัดเตรียมข้อมูลดังรายการที่ 1. ถึงรายการที่ 3. ดังที่ได้แสดงไว้ในหัวข้อ#โจทย์ สมมติให้ผู้ตั้งโจทย์กำหนดข้อมูลดังกล่าวเป็นดังต่อไปนี้
- ชื่อย่อของโจทย์ กำหนดให้เป็น fibonacci
- ชื่อเต็มของโจทย์ กำหนดให้เป็น "การหาค่าตัวเลขฟิโบนักชี"
- วิธีการตรวจสอบโปรแกรม กำหนดให้เป็นคู่ input/output 8 คู่ทางด้านบน
ผู้ตั้งโจทย์จะต้องทำการจัดเตรียมข้อมูลในหัวข้อที่ 3 ให้อยู่ในรูปแบบที่ cafe grader ต้องการ คือ ให้สร้างไฟล์ชื่อ *.in และ *.sol โดยที่ไฟล์ดังกล่าวจะเก็บข้อมูลนำเข้า และ ข้อมูลที่ส่งออกที่ควรเป็น ตามลำดับ โดยคู่แรกให้เก็บในไฟล์ 1.in และ 1.sol ส่วนคู่ที่สองให้เก็บในไฟล์ 2.in และ 2.sol และคู่ที่เหลือให้เก็บในชื่อถัดไปเรื่อย ๆ ตามลำดับ จากตัวอย่างข้างต้น ไฟล์ 5.in ควรจะมีเก็บข้อมูลตัวเลข 8 และไฟล์ 5.sol ควรจะเก็บข้อมูลตัวเลข 21 เป็นต้น
เมื่อจัดเตรียมข้อมูลเรียบร้อยแล้ว ขั้นตอนต่อไปคือการนำโจทย์เข้าสู่ระบบ การนำโจทย์เข้าสู่ระบบสามารถทำได้สองช่องทาง คือ 1) ผ่าน web interface และ 2) ผ่าน command line interface
การนำโจทย์เข้าสู่ระบบผ่านทาง web interface
การใช้งาน web interface นั้นมีข้อจำกัดคือใช้ได้เฉพาะกรณีที่วิธีการตรวจสอบโปรแกรมเป็นแบบการใช้คู่ input/output เท่านั้น (ยังไม่รองรับการเพิ่มโจทย์แบบที่ใช้โปรแกรมตรวจพิเศษ) ผู้ตั้งโจทย์จะต้องเตรียมข้อมูลดังนี้
- ไฟล์ข้อมูลคู่ input/output ซึ่งมีชื่อเป็น (*.in และ *.sol)
- ไฟล์เนื้อหาโจทย์ เป็นไฟล์ประเภท pdf โดยที่ตั้งชื่ออะไรก็ได้ แต่ต้องมีนามสกุลเป็น .pdf
การนำเข้าโจทย์ทำดังนี้ ตั้งโจทย์จะต้องทำการสร้างไฟล์ .zip ที่มีข้อมูลข้างต้นอยู่ แล้ว หัวข้อ [ Problems ] แล้วเลือกที่หัวข้อ [Import problems] หลังจากนั้นให้กรอกชื่อย่อของโจทย์ ในช่อง Name กรอกชื่อเต็มของโจทย์ ในช่อง Full Name ในช่อง และกดปุ่ม browse เพื่อเลือก zip ไฟล์ ที่มีไฟล์ *.in และ *.sol อยู่ แล้วให้กดปุ่ม Import problem ดังที่แสดงในรูปต่อไปนี้
หลังจากการ Import problem เสร็จเรียบร้อยแล้ว หน้าจอจะกลับมาแสดงดังหัวข้อ [ Problems ] และเราจะเห็นรายการของโจทย์ทั้งหมดที่ได้ทำการนำเข้าสู่ระบบ ให้กดปุ่ม edit ของโจทย์ข้อ fibo ระบบจะแสดงหน้าจอการแก้ไขรายละเีอียดของโปรแกรม ให้ทำการแก้ไขช่อง full score ให้เป็น 80 และในกรณีที่ต้องการจะเขียนคำอธิบายเพิ่มเติม สามารถกรอกในช่อง Description ได้ หลังจากนั้นให้กดปุ่ม edit เพื่อทำการบันทึก ดังแสดงในรูปต่อไปนี้
หลังจากนั้นหน้าจอจะกลับมายังหัวข้อ [ Problems ] อีกครั้งหนึ่ง ให้กดปุ่ม [ toggle ] สำหรับโจทย์ข้อ fibo อีกครั้ง เพื่อทำการเปิดโจทย์ดังกล่าวให้ผู้แก้โจทย์ทำการส่งโปรแกรมได้ เป็นอันเสร็จสิ้นการนำโจทย์เข้าสู่ระบบ
นอกจากนี้ การนำโจทย์เข้าสู่ระบบทาง web interface ยังมีข้อกำหนดการใช้งานดังต่อไปนี้
- การตั้งคะแนนเต็มนั้นควรจะต้องสัมพันธ์กับจำนวนของ input โดยคะแนนเต็มควรจะมีค่าเท่ากับจำนวน input คูณด้วย 10 ในตัวอย่างข้างต้นนั้น โจทย์ข้อ fibo มีคู่ input/ouput จำนวน 8 คู่ ดังนั้นช่องคะแนนเต็มควรจะเป็น 80 คะแนน
- ผู้ตั้งโจทย์สามารถเปลี่ยนข้อมูล คู่ input/output สำหรับการตรวจโปรแกรมได้ โดยการนำโจทย์เข้าสู่ระบบอีกครั้งหนึ่ง โดยใช้ชื่อย่อของโจทย์ให้เป็นชื่อเดิม อย่างไรก็ตาม ข้อมูลคู่ input/output นี้จะถูกนำไปใช้กับการส่งโปรแกรมครั้งใหม่เท่านั้น มันจะไม่ถูกนำไปตรวจกับโปรแกรมที่ได้เคยส่งมาแล้วและทำการตรวจไปเรียบร้อยแล้ว ถ้าหากต้องการให้มีการตรวจใหม่ จะต้องไปทำการสั่งการผ่าน command line interface เท่านั้น
- ชื่อไฟล์ของข้อมูล input/output จะต้องเป็น 1.in คู่กับ 1.sol, 2.in คู่กับ 2.sol
- นอกจากนี้ เราสามารถจัดกลุ่มของข้อมูลได้อีกด้วย โดยการใส่ตัวอักษรภาษอังกฤษต่อท้ายเข้าไป เช่น ตั้งชื่อเป็น 1a.in คู่กับ 1a.sol, 1b.in คู่กับ 1b.sol, 2a.in คู่กับ 2a.sol การตั้งชื่อไฟล์แบบนี้จะเป็นการจัดกลุ่มข้อมูล โดยมีรายละเอียดคือ เราจะถือว่า input/output ที่มีตัวเลขเดียวกันนั้นจะเป็นชุดเดียวกัน (เช่น 1a อยู่ชุดเดียวกับ 1b แต่อยู่คนละชุดกับ 2a) ในแต่ละคู่ input/output จะถือว่ามีคะแนนคู่ละ 10 คะแนนเช่นเดิม แต่เราจะได้คะแนนก็ต่อเมื่อโปรแกรมของเรานั้นทำงานได้ถูกต้องบนทั้งชุดข้อมูล (เช่น สมมติมี 1a,1b,1c,1d และ 2a,2b คะแนนเต็มจะเท่ากับ 60 ถ้าทำถูกเฉพาะ 1a,1c,1d,2a,2b เท่านั้น จะได้คะแนนเท่ากับ 20 (มาจาก 2a และ 2b ส่วนชุด 1a, 1c, 1d ไม่ได้คะแนน เพราะว่าทำ 1b ไม่ได้)
- ผู้ตั้งโจทย์สามารถกำหนด ระยะเวลา และ ปริมาณหน่วยความจำ ที่ระบบจะอนุญาตให้โปรแกรมของผู้แก้โจทย์สามารถใช้ในการแก้โจทย์ได้ ข้อมูลดังกล่าวสามารถกำหนดได้ในหน้าจอเดียวกับการนำโจทย์เข้าสู่ระบบ
- ผู้ตั้งโจทย์สามารถแก้ไขข้อมูลอื่น ๆ ของโจทย์ (ที่ไม่ใช่ข้อมูลวิธีการตรวจ) ได้จากหน้า [ Problems ] โดยตรง โดยการกดไปที่ค่าดังกล่าวโดยตรง และการแก้ไขดังกล่าวจะมีผลทันที ซึ่งรวมถึงกับโปรแกรมทุกโปรแกรมที่เคยส่งมาแล้วด้วยเช่นกัน (ตัวอย่างเช่น การแก้คะแนนเต็ม จะมีผลต่อโปรแกรมที่ตรวจไปแล้วเช่นกัน
การนำโจทย์เข้าสู่ระบบผ่านทาง command line interface
การทำโจทย์เข้าสู่ระบบผ่านทาง cli นั้นจะต้องสร้าง dir ที่ประกอบด้วยไฟล์ input/output ที่เราต้องการก่อน สมมติให้ dir ดังกล่าวอยู่ที่ cafe_grader/judge/raw/problem1 การนำเข้าปัญหาดังกล่าวสามารถทำได้ตามลำดับดังต่อไปนี้ 1. สร้างโจทย์ใน grader ก่อน (หรือถ้าเคย import โจทย์ดังกล่าวมาก่อนแล้วก็ได้เช่นเดียวกัน) 2. ไปที่ dir judge 3. ใช้คำสั่ง
./scripts/import_problem [ชื่อโจทย์] [folder ที่เก็บ in/sol] [ตัวตรวจ] [option ต่าง ๆ]
โดยที่ ชื่อโจทย์นั้นถ้าใส่เป็น - จะใช้ชื่อ dir ที่เก็บ in/sol มาเป็นชื่อโจทย์
ตัวอย่างการ นำโจทย์เข้าโดยใช้ตัวตรวจแบบกำหนดเอง และกำหนด time limit เป็น 1 วินาที และ memory limit เป็น 64mb
./scripts/import_problem o59_may10_walltiles raw/o59_may10_walltiles/testdata wrapper:raw/o59_may10_walltiles/testdata/wallcheck -t 1 -m 64
การตรวจโปรแกรมโดยใช้การใช้โปรแกรมเฉพาะ
โปรแกรมตรวจสอบจะรับ argument 6 ตัว คือ <lang> <test-num> <in-file> <out-file> <ans-file> <full-score> ปกติก็จะดูแค่ argv[3] - argv[6] โดยที่ <out-file> คือ output ของ program ที่ submit เข้ามา ส่วน <ans-file> คือไฟล์คำตอบ .sol ของโจทย์ที่กำหนดไว้ตั้งแต่ตอนแรก โดยที่ถ้าตัวตรวจตรวจแล้วถูก ตัวตรวจจะต้องพิมพ์
Correct X
โดยที่ X เป็นคะแนนที่ได้ (โดยจะต้องไม่เกิน argv[6]) แต่ถ้าไม่ถูก โปรแกรมตรวจสอบจะต้องพิมพ์
Incorrect 0