-
Couldn't load subscription status.
- Fork 1
# ✏ คู่มือสำหรับการสร้างโจทย์ และเขียนโจทย์ทั่วไป
ในโจทย์ข้อ ๆ หนึ่ง หลัก ๆ แล้วจะประกอบไปด้วยงาน 3 งานหลักดังนี้
- เอกสารโจทย์ (Doc)
- Solution Code
- Testcase
เอกสารโจทย์ คือเอกสารที่ใช้ในการอธิบายโจทย์ และให้คำสั่งแกผู้แก้โจทย์ ซึ่งปัจจุบันนี้ OTOG ได้มี Template สำหรับเขียนโจทย์ นั้นคือไฟล์ otog_newtemplate.dotx
หรือถ้าอยากสร้างโจทย์ในสไตล์ของคุณ ก็ควรที่จะประกอบไปด้วยหัวข้อต่อไปนี้
หัวโจทย์ ก็จะเป็นส่วนแรกของโจทย์ ซึ่งจะมี...
- ชื่อโจทย์
- ขอกำหนดของโจทย์ (ทั้งเวลา(วินาที) และหน่วยความจำ(mb))
- ชื่อเจ้าของโจทย์ (ถ้ามี)
ในส่วนนี้จะเป็นส่วนที่สนุกที่สุดเพราะในส่วนสามารถปล่อยความคิดสร้างสรรค์ในการแต่งเนื้อเรื่อง หรือแต่งโจทย์ อย่างไรก็ตาม ข้อมูลต่าง ๆ ต้องอ่านแล้วเข้าใจถึงปัญหา และที่สำคัญคือต้องรู้ว่าโจทย์ต้องการให้ผู้เขียนทำอะไร
ส่วนนี้จะเป็นส่วนที่บอกว่า ในการทดสอบโปรแกรม หรือเอาโปรแกรมมาตรวจนั้น ตัวโปรแกรมจะได้รับ Input เป็นอะไรบ้าง มีกี่บรรทัด แต่ละบรรทัดจะรับข้อมูลประเภทใดบ้าง รวมทั้งบอกข้อกำหนดของแต่ละข้อมูลว่าข้อมูลจะเป็นลักษณะไหน มีขนาดเท่าใดและ Output ออกมามีกี่บรรทัด แต่ละบรรทัดจะออกมาเป็นอย่างไร
ก็ตามนั้นแหละ ชัดเจน
จะเป็นส่วนที่ใช้อธิบายตัวอย่างข้อมูลนำเข้าและข้อมูลส่งออก มีไว้ในกรณีที่โจทย์มีความซับซ้อน และไม่สามารถเข้าใจได้จากการแค่อ่านโจทย์ อย่างไรก็ตาม ในส่วนนี้ ห้ามเขียนอธิบายใบ้มากจนเกินไป ไม่งั้นผู้แก้โจทย์จะสามารถแก้ได้แบบง่าย ๆ
จะเป็นการอธิบายถึงชุดทดสอบต่าง ๆ ที่ใช้ในการตรวจและให้คะแนน ซึ่งชุดทดสอบจะสามารถคิดได้เมื่อคิด Solution code ออกหลายวิธี และแต่ละวิธีจะมีประสิทธิภาพที่ไม่เท่ากัน ซึ่งตรงนี้แล้วแต่ดุลยพินิจของผู้แต่งโจทย์เลย
หมายเหตุ ก็หมายเหตุ หรือมีเงื่อนไขบางอย่างพิเศษ
เมื่อคิดโจทย์ ก็แนะนำให้เขียน Solution โค้ดด้วย (ถ้าเป็นไปได้ ก็อยากให้เขียนโค้ดสำหรับทุก Subtask ด้วย) เพื่อไว้เป็นเครื่องมือช่วยสร้างเทสเคส หรือ ใช้เวลาทดสอบตอนลงใน OTOG
อย่างที่รู้ ๆ กันว่า การให้คะแนนโค้ดใน OTOG จะใช้วิธีการลองทดสอบด้วยกรณีทดสอบ (testcase) (เทสเคส) นั้นคือ ในหนึ่งข้อ ก็จะมีเทสเคสไม่มากก็น้อย ซึ่งแต่ละเทสเคสจะประกอบดังนี้
ก็คือข้อมูล Input ของเคสนั้น ๆ ซึ่งจะใช้ไฟล์เป็น *.in เช่น 1.in 2.in 3.in เป็นต้น
หรือง่าย ๆ คือ เป็นคำตอบที่คาดหวังให้ผู้แก้โจทย์แสดงออกมา ถ้าผู้แก้โจทย์แสดงออกมาตรงกันกับคำตอบที่คาดหวัง ก็ได้ P ในเคสนั้น
ถ้าผู้แก้โจทย์แสดงออกมาไม่ตรงกันกับคำตอบที่คาดหวัง ก็ได้ - ในเคสนั้น
ซึ่งจะใช้ไฟล์เป็น *.sol เช่น 1.sol 2.sol 3.sol เป็นต้น
เช่นให้เขียนโปรแกรมรับข้อมูลเป็นจำนวนเต็มสองตัว ให้แสดงผลลัพธ์เป็นการเอาจำนวนเต็มนั้นมาบวกกัน
ก็จะมีเทสเคสลักษณะนี้
1.in
6 9
1.sol
15
ในปัจจุบัน OTOG ได้ใช้ระบบการเปรียบเทียบระหว่างคำตอบของผู้แก้โจทย์ และคำตอบของโจทย์ เป็นระบบที่เทียบเป็นทีละบรรทัด โดยแต่ละบรรทัดจะทำการตัดตัวอักษรว่างเปล่าทางด้านขวา (Strip right)
เช่น
printf("Hello JEFF! \n");
printf("HAPPY TO SEE YOU\n");
printf(" GOOD BYE\n\n\n");
printf(":)\n\n\n");Hello JEFF!
HAPPY TO SEE YOU
GOOD BYE
:)
เวลาที่เอาข้อมูลตรงนี้มาเปรียบเทียบจริง จะเหลือข้อมูลดังนี้

ตรงนี้ ข้อมูลว่างเปล่าที่ไม่ใช่ตัวอักษร(เช่น ตัวเว้น) ก็จะไม่เอามาพิจารณาด้วย ดังนั้นถ้าเจนเคสแล้วมี Whitespace ก็ไม่มีปัญหา
หากมี Solution โค้ดแล้ว และมี .in แล้วต้องการที่จะสร้างไฟล์คำตอบ .sol ก็สามารถทำได้โดยการใส่ Input จาก .in ใน Solution โค้ด แล้วก็นำ Output ที่ได้ ไปใส่ใน .sol แต่มันก็น่าจะลำบาก
ถ้า Solution โค้ดเขียนใน C หรือ C++ ก็แนะนำให้ใช้คำสั่งนี้ (สมมุติว่าไฟล์ .in กับไฟล์โค้ดอยู่ในโฟลเดอร์เดียวกัน)
freopen("1.in","r",stdin);คือการเปิดไฟล์ 1.in โดยการอ่าน(r) ซึ่งใช้เป็น Input (stdin)
freopen("1.sol","w",stdout);คือการเปิดไฟล์ 1.sol โดยการเขียน(w) ซึ่งเอามาจาก output (stdout)
เพียงเท่านี้ ก็จะได้ 1.sol ที่มี Input เป็น 1.in แล้ว ก็แค่ทำ 2.in 3.in ไปเรื่อย ๆ จนครบทุกเคส
ข้อควรระวัง ตอนส่งโค้ดนั้นลง Otog อย่าลืมลบ freopen ด้วย ไม่งั้นจะติด -
ไฟล์เทสเคสต่าง ๆ ที่จะอัพลงใน otog ก็ให้จับเอาทุก ๆ ไฟล์ .in .sol จับใส่เข้าไปในไฟล์ .zip หนึ่งไฟล์เลย
Testcase.zip
Testcase.zip
|- 1.in
|- 1.sol
|- 2.in
|- 2.sol
|- 3.in
|- ...
|- 10.sol
...
Coming soon