PONGSAPHOL.

วิจารณ์ระบบ TOI ฉบับคนที่ไม่ได้แข่ง

Cover Image for วิจารณ์ระบบ TOI ฉบับคนที่ไม่ได้แข่ง
Pongsaphol
Pongsaphol
(in less than a minute)

สวัสดีครับ ห่างหายจากการบ่นไปสักระยะนึง (1 ปี) หลังจากที่ได้วิจารณ์โจทย์การคัดเลือกผู้แทนประเทศไทยไปแข่งขันคอมพิวเตอร์โอลิมปิกระดับนานาชาติวันนี้ขอมาพูดเรื่องภาพรวมของการจัด TOI (Thailand Olympiad in Informatics) ของปีนี้นะครับ ประเด็นหลักจะพูดในเชิง ลบ เป็นส่วนใหญ่และอาจจะมีคำแนะนำในการแก้ไขปัญหาที่พบเจออยู่ ณ ตอนนี้

ก่อนอื่นผมค่อนข้างคาดหวังกับการแข่งขันนี้อยู่ไม่น้อยเพราะผมได้พูดปัญหาของรอบก่อน ๆ ให้คณะกรรมการวิชาการฟังแล้วและดูเหมือนพวกเขาจะรับฟังอย่างดิบดี แต่มิหาไม่ ผลการแข่งขันที่ออกมาบ่งบอกได้ว่าคูณภาพได้ลดลงอย่างได้ชัด แม้ว่าทางผมจะพยายามออกมาเคลื่อนไหวอะไรบางอย่าง ตัวอย่างเช่นการจัดการแข่งขัน THACO (Thailand Computing Olympiad) เพื่อที่จะเสนอว่าการแข่งขันที่ดีควรออกมาในรูปแบบใด การที่ผลออกมาแบบนี้ทั้ง ๆ ที่มีคนช่วยทำมากกว่าทีมที่ผมทำ ผมถือว่าผมไม่สามารถยอมรับผลนี้ได้

การที่คุณ (สอวน.) มีจุดประสงค์เพื่อยกระดับอะไรก็ว่ากันไปผมค่อนข้างสนับสนุนด้วย ปากบอกว่ายกระดับแต่คุณภาพโจทย์ยิ่งมายิ่งห่วยลง ไม่เพียงเท่านั้นโจทย์ยังมีปัญหาเรื่องความถูกต้องอีกและทางผมพึ่งมาเจอหลังจากงานจบแล้ว ผมค่อนข้างมั่นใจว่าคนที่ได้รับผลกระทบจากความผิดพลาดของคุณคงมีไม่น้อย

อย่างไรก็ตามผมต้องการให้คุณแสดงความรับผิดชอบโดยการชี้แจงข้อผิดพลาดทั้งหมดบนสื่อสาธารณะ ตัวอย่างเช่น Facebook ในเพจ การแข่งขันคอมพิวเตอร์โอลิมปิกระดับชาติ ครั้งที่ 16 เพื่อความโปร่งใสและชัดเจนว่าปัญหาที่เจอตอนนี้มีอะไรบ้างและได้รับการตรวจสอบไปถึงขั้นไหนโดยที่ทางผมจะช่วยหาว่าปัญหาและจะพิมพ์ลง blog นี้ จุดยืนผมตอนนี้คือบ่นเอามัน และไม่สนว่าผู้เข้าแข่งขันจะได้คะแนนยังไง ถึงอย่างนั้นยังมีคนบางกลุ่มสนับสนุนให้จัดการแข่งขึ้นใหม่อีกรอบซึ่งผมไม่มีส่วนเกี่ยวข้องกับแนวคิดนี้อย่างประการใด

Outline ปัญหาที่เจอตอนนี้

  • dinocell ค่า K ไม่ตรงเงื่อนไข (ref)
  • dinocell official solution ผิด testcase #6
  • watertruck pdf sample #1 input ผิดเงื่อนไข
  • outbreak sample #3 output น่าจะผิด ควรตอบ 0\n3
  • outbreak เทส 5, 9, 10 ผิดจริง
  • carte official solution อาจจะ run ไม่ทัน (เชคใน server programming.in.th โดยการ complie ผ่าน -O2 ใช้เวลา 1.4 s แต่รอเชคในเครื่องแข่งว่าเวลาโอเคหรือเปล่า)
  • official solution ของข้อ wheel รันไม่ทันบางเทส

Carte

ขอนี้เป็นโจทย์สุดแสน classic แต่ที่มีปัญหาคือมีคน reverse engineer แล้วได้ 60 คะแนน การที่ผลมันออกเป็นแบบนี้บ่งบอกได้ว่ากรรมการวิชาการนั้นเจนเทสเคสได้ไม่ดีและการที่ปรับคะแนนหลังการแข่งขันสำหรับคนที่ reverse engineer เป็น 0 ถือว่ายอมรับไม่ได้ ก่อนจะปรับคะแนน ทางคณะกรรมการได้เสนอแก้กฎการแข่งขันเพราะในธรรมนูญการแข่งขันคอมพิวเตอร์โอลิมปิกระดับชาตินั้นไม่ได้บอกกฎใด ๆ ในการตัดคะแนนในกรณีที่มีผู้เข้าแข่งขันทำการ reverse engineer โดยแก้ไขกฎการแข่งกันของปีนี้ และกฎปีปัจจุบันนั้นมี 6 ข้อคือ

  1. ไม่รบกวนการทำงานของผู้แข่งขันอื่น ๆ
  2. ไม่ทำลายอุปกรณ์ต่าง ๆ ที่ใช้สำหรับการแข่งขัน
  3. ไม่ใช้ระบบเครือข่าย หรือระบบคอมพิวเตอร์เพื่อการอื่นที่ไม่เกี่ยวข้องกับการแข่งขัน
  4. ไม่ใช้เว็บเบราว์เซอร์ติดต่อไปยังเว็บไซต์อื่น ๆ นอกเหนือจากเว็บของการแข่งขันเท่านั้น
  5. ไม่รุกล้ำระบบความมั่นคงของเครือข่าย และคอมพิวเตอร์
  6. ไม่พยายามติดต่อสื่อสารกับบุคคลอื่นในขณะที่ตนเองกำลังดำเนินการแข่งขันอยู่ ยกเว้นการติดต่อกับกรรมการควบคุมการสอบเท่านั้น

และจะทำการเพิ่มกฎไปอีก 1 ข้อคือเรื่องที่ว่าความเกี่ยวกับการ reverse engineer โดยอาศัยความชอบทำจากกฎของการแข่งขันคอมพิวเตอร์โอลิมปิกระดับนานาชาติ ที่กล่าวว่า

contestants must not reverse engineer the test data in order to solve the problems in highly test-data-dependent manners. One example of such behavior is using the feedback system to extract the test data and then applying this knowledge to build solutions adapted to the specific test cases in the grading system. This behavior would be considered cheating only if a contestant submits a solution that would solve significantly fewer test cases correctly if the test data were replaced by an equivalent set of test cases (e.g., one generated with a different random seed).

โดยสรุปแล้วคือผู้เข้าแข่งขันจะต้องไม่พยายามที่จะหาข้อมูลของข้อมูลชุดทดสอบเพื่อสร้าง โปรแกรมที่มีลักษณะขึ้นตรงกับข้อมูลชุดทดสอบในระบบแข่งขัน โดยเฉพาะ ตัวอย่างเช่น การใช้ผลการตรวจโปรแกรมเพื่อหาข้อมูลนําเข้าและส่งออกในกรณีต่าง ๆ ของชุดข้อมูลทดสอบและนําเอาข้อมูลนี้ไปสร้างโปรแกรมที่ตอบคําตอบตามข้อมูลชุดทดสอบเฉพาะในระบบตรวจและการกระทําดังกล่าวจะถือว่าเป็นการทุจริตการแข่งขันก็ต่อเมื่อโปรแกรมที่ส่งมานั้นสามารถผ่านชุดข้อมูลทดสอบได้น้อยลงเป็นอย่างมาก เมื่อทําการเปลี่ยนชุด ข้อมูลทดสอบเป็นชุดใหม่ที่เทียบเท่ากับชุดเดิม (เช่น การสร้างชุดข้อมูลทดสอบ ใหม่ด้วยค่า random ใหม่) อย่างไรก็ตาม การที่จะพิจารณาเรื่องนี้จำเป็นต้องใช้มติจากหัวหน้าทีมเพื่อทำการรับรองผลการสอบโดยที่คณะกรรมการได้เสนอทางเลือกให้ 3 ทางเลือก

  • (A) คงเดิม

  • (B) เปลี่ยนคะแนนคนที่ทําให้เป็น 0

  • (C) ทดลองรัน test data ใหม่

    ทางเลือก B

    img ทางเลือกนี้ค่อนข้างชัดเจน คือมานั่งไล่ดู code แต่ละคนว่าทำ reverse engineer หรือเปล่าโดยที่บทสรุปของข้อนี้คือมีคนคะแนนลดทั้งหมด 9 คนรวม -260 คะแนน ส่วนข้อเสียของวิธีนี้ก็ค่อนข้างชัดเจนคือผู้เข้าแข่งขันนั้นได้พยายามทำอะไรบางอย่างเพื่อให้ได้คะแนนแล้วแต่คะแนนนั้นกลับกลายเป็น 0 ซึ่งถือว่าไม่ยุติธรรม

    ทางเลือก C

    img เทสเคส TOI นั้นไม่ได้ตรวจเป็นกลุ่มเลยทำให้การทำแบบนี้มีผลต่อผู้เข้าแข่งขันเยอะโดยจะมีผู้เข้าแข่งขันคะแนนลด 18 คนและคะแนนเพิ่ม 22 คนรวม -140 คะแนน ในส่วนนี้จะมีบางคนที่ไม่เกี่ยวข้องกับการ reverse engineer แต่ได้รับผลกระทบด้วยจึงไม่ค่อยเหมาะสมสักเท่าไหร่เหมือนกัน

อย่างที่ได้กล่าวไป คณะกรรมการได้เลือกทางเลือก B ทำให้คนที่ทำ reverse engineer นั้นได้ 0 คะแนนและเหตุผลที่ผมตอมรับไม่ได้คือคุณทำเทสเคสห่วยตั้งแต่แรกและไม่ได้เป็นความผิดของผู้เข้าแข่งขันที่จะพยายามทำให้ได้คะแนนมากที่สุด การที่ผู้เข้าแข่งขันนั้นทำอะไรบางอย่างและได้คะแนนจารการทำสิ่งนั้นแล้ว คณะกรรมการจะมาเปลี่ยนแปลงผลคะแนนไม่ได้เพราะถือว่านี่เป็นความผิดพลาดของคณะกรรมการเอง

ที่จริง การแข่งที่มีมาตรฐานควรมีการตรวจเป็นกลุ่ม กล่าวคือ การที่จะได้คะแนนจากคะแนนย่อย โปรแกรมของคุณทำเป็นต้องผ่านทั้งหมดในกลุ่มนั้น การที่คุณมานั้งไล่ดูโปรแกรมของผู้เข้าแข่งขันแล้วบอกว่าเป็นการ reverse engineer หรือไม่ดูไม่ค่อยยุติธรรม เพราะสำหรับโจทย์ข้ออื่นนั้นที่แต่ละคนได้คะแนนไม่เต็มกลุ่มของปัญหาย่อยสื่อถึงว่าผู้เข้าแข่งขันคนนั้นได้ทำอะไรบางอย่างที่ไม่ถูกต้องอยู่แล้วจึงได้คะแนนไม่เต็มกลุ่ม อีกอย่าง ในโจทย์ข้อนี้มีเทสแคสเพียงแค่ 10 เทสเคสนั้นสื่อถึงว่าผู้จัดแข่งขันนั้นไม่สามารถเตรียมเทสเคสได้ทันเวลา และไม่สามารถเจนเทสเคสอย่างรอบคอบได้ ผลถึงออกมาแบบนี้ ถ้าเป็นการแข่งขันของต่างประเทศสมัยนี้ ใน 1 ข้อจะมีเป็นถึงขั้นระดับ 100 เทสเคสแล้ว แต่นี่ยังย่ำอยู่กับที่ ทั้ง ๆ ที่มีทีมงานมากกว่าการแข่งขันที่ผมจัด ผมถือว่ายอมรับไม่ได้

ในส่วน Official Solution นั้น ผมได้สังเกตว่ามีการทำการ coordinate compression กล่าวคือ การที่เอาเลขซ้ำกันมามัดเป็น group เดียวกันทำให้ Official Solution รันเร็วกว่าที่ควรเป็น อย่างไรก็ดียังมีบางเทสเคสที่สามารถดักเรื่องนี้ได้อยู่คือ เทสที่ไม่มีเลขเดียวกันติดกันเลยซึ่งทางผมได้ลองเจนแล้วไปรันใน server ผลปรากฎออกมาว่าใช้เวลาทั้งหมด 1465ms ซึ่งเกิน 1 วินาที คงต้องคอยลุ้นกันว่าเครื่องตัวตรวจจะรันกี่ ms แล้วถ้ามันเกิน 1 วินาทีจริง ๆ จะแก้ปัญหายังไง

Dino Cell

สำหรับข้อนี้พึ่งตรวจพบว่า testcase #6 นั้นผิดจริงแต่ทางคณะกรรมการได้ชี้แจงว่าได้ทำการแก้ระหว่างสอบแล้วแต่เพื่อความแน่ใจ ผมคงต้องขอตรวจสอบอย่างละเอียดว่าเทสเคสที่ใช้ระหว่างแข่งนั้นถูกต้องจริงหรือไม่เพื่อความยุติธรรมของทุกฝ่ายโดยเฉพาะผู้เข้าแข่งขันอย่างไรก็ตามเงื่อนไขค่า K นั้นยังผิดจริงในเทสเคสที่ 7 ถึง 10 โดยที่คณะกรรมการได้อ้างว่าค่า K นั้นไม่ผิดแต่ผมเชื่อว่าคณะกรรมการนั้นเจนเทสเคสที่มีขอบเขตของ K ผิดและมีความเป็นไปได้สูงมากว่าระหว่างแข่ง pdf ได้แสดงขอบเขตของ K ที่ผิดไปซึ่งจะมีผลกระทบต่อคนบางกลุ่มที่ไม่ได้เผื่อค่า K ไว้ในกรณีที่มากว่าโจทย์ระบุไว้

การที่มีเทสเคสที่ผิดเป็นสิ่งที่ผมไม่สามารถยอมรับได้ยิ่งกว่าเทสกากที่ reverse engineer แล้วได้ 60 คะแนนผมค่อนข้างมั่นใจว่าจะมีผู้เข้าแข่งขันบางส่วนนั้นเสียผลประโยชน์อย่างแน่นอน ต้องคอยติดตามว่าทาง คณะกรรมการ จะแก้ไขปัญหายังไง ในขณะนี้ได้ข่าวว่าจะทำการแก้ไขเทสเคสให้ถูกต้องแล้วนำไปตรวจใหม่โดยจะตรวจ submission สุดท้ายเท่านั้น ซึ่งดูจะไม่ค่อยยุติธรรมสำหรับทุกคนเลยเนื่องจากอาจจะมีผู้เข้าแข่งขันบางคนที่ code ตนเองอาจจะถูกตั้งแต่แรกแต่ไม่ได้คะแนน เลยจำยอมโดยการส่ง code อีก version เพื่อให้ได้คะแนนมากกว่าโดยที่ code อันเก่าอาจจะถูกต้องตั้งแต่แรกแล้ว ในขณะนี้ fossil grader ไม่มีระบบตรวจย้อนหลังแบบทุกเทสเคสแล้วเอาคะแนนมาทำ max ซึ่งถ้ามันออกมาในรูปแบบนี้ คณะกรรมการจำเป็นต้องทำมือเพื่อให้ได้คำตอบทุกเทสเคสแล้วจึงรวบรวมคะแนนเป็นก้อนเดียวกัน

Out Break

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

แม้ว่าประเด็นโจทย์ผิดจะเป็นเรื่องที่ค่อนข้างสำคัญแต่ความถูกต้องของเทสเคสย่อมสำคัญกว่า จากที่ตรวจสอบมาพบว่ามีเทสเคสผิดจริงจำนวนสามเทสเคส การแข่งขันคอมพิวเตอร์โอลิมปิกระดับชาตินั้นถือว่าเป็นการแข่งขันที่ใหญ่และใช่งบประมาณแผ่นดินมาก การที่ผมประกฎออกมาแบบนี้สื่อถึงความล้มเหลวของคณะกรรมการอย่างแท้จริง การที่โจทย์ผิดหรือเทสเคสห่วยนั้นยังพอยอมรับได้ แต่ในเรื่องนี้ขอบอกว่าผมยอมรับไม่ได้ สมาชิกในคณะกรรมการก็มีตั้งหลายคนถ้าพยายามกันมากกว่านี้เหตุการนี้คงจะไม่เกิดขึ้น

นอกจากนั้นด้วยความยาวของโจทย์ซึ่งมีถึงสิบหน้าอาจจะทำให้ผู้เข้าแข่งขันบางคนไม่สามารถอ่านได้เข้าใจหรือใช้เวลาเป็นอย่างมากในการทำความเข้าใจโจทย์และความยากในการเขียนเฉลยก็เป็นส่วนแย่อีกส่วนซึ่งทางผมไม่พอใจเป็นอย่างมาก

Wheel

ในส่วนของข้อนี้ข้อผิดพลาดหลักเลยคือการที่โจทย์นั้นไม่มีวันแก้ได้ในเวลาหนึ่งวินาที กล่าวคือโจทย์ข้อนี้มัน unsolvable ซึ่งเทสเคสในที่นี้คือ

9 1
000101101100100010000100011100100001000100000111011001100100010110010110
1100010101011011110000010000011101100101000001010010000011111000
10011000000110111011110110011011010101111001001100010
0011110001001111010111100100100000000110000001100010011111000010000110010010010
00101010010101000000000111010011101001001010001011011011111011010010000100000
01100100000101001000001101101001001001000111100
0000100011010000010001101100111111000000010111100001010010
011101001000100111001110010101110
001001

อย่างที่บอกไปข้างต้นถ้าออกมาในรูปแบบนี้จะรับผิดชอบต่อผู้เข้าแข่งขันยังไง ในเมื่อ official solution ยังทำมั่วอยู่เลยแบบนี้ต้องการวัดว่าใครมั่วเก่งกว่ากันหรือ ???

Water Truck

ความผิดพลาดของข้อนี้มีเพียง sample test ผิดซึ่งผมคงไม่เจาะลึกอะไรมาก แต่โซลของข้อนี้จำเป็นต้องใช้พลังในการเขียนมาก โดยที่ผมใช้เวลาในการเขียนโซลข้อนี้ไปหนึ่งชั่วโมงครึ่ง ในฐานะที่มั่นใจว่าตนเองเขียนโค้ดคล่องในระดับนึง ในการแข่งขันต้องการวัดคนที่เขียนถึกแล้วได้คะแนนหรือ ???

สรุป

แน่นอนว่าจะมีผู้เข้าแข่นขันบางส่วนได้รับผลกระทบแน่นอน และแนวทางการเยียวยานั้นเป็นสิ่งที่สำคัญมากที่สุด สำหรับผู้เข้าแข่งขันบางคนอาจจะทำให้เหรียญนั้นเปลี่ยนจากทองแดงเป็นเงินซึ่งทำให้เป็นใบเบิกทางในการเข้าค่ายรอบต่อไปได้ สำหรับในกรณีอื่นตัวอย่างเช่นคะแนนมากที่สุดในระดับภูมิภาค ในส่วนนี้ผลประโยชน์คือ เงิน (Money) ที่สามารถนำไปจับจ่ายใช้สอยได้และถ้าเกิดการเปลี่ยนแปลงของคะแนน อาจจะเป็นการเพิ่มหรือลดจะรับผิดชอบในส่วนนี้ยังไง?

สรุป คนที่ได้รับผลกระทบมีน้อยและไม่มีผลต่อเหรียญเลยไม่มีดราม่า (น่าเสียดายอย่างสุดซึ้ง)

อย่างไรก็ตามผมจะยื่นเรื่องไปทาง สอวน. ให้สอบสวนทางวินัยต่อไป

ทางออก

แม้ว่าผมจะวิจารณ์ในเชิงบ่น แต่ผมก็เสนอวิธีแก้ปัญหา ก่อนอื่นต้องยอมรับว่าระบบ Grader ที่ใช้อยู่ในการแข่งขันนั้น ห่วยมาก (ขณะนี้การแข่งขันใช้ fossil grader ซึ่งเป็น php มีแต่ code และไม่มีคู่มือ) ทางออกคือ ควรย้ายระบบไปเป็น CMS Grader ที่ IOI เขาใช้กัน โดยที่ Grader นี้สามารถตรวจแบบ parallel ได้และ efficient กว่าแน่นอนโดยที่คุณสามารถใช้ server หลายเครื่องแล้วกระจายงานไปแต่ละเครื่องได้ ต่อไปในเรื่องของ Time Management ในการออกโจทย์ ผมได้ข่าวมาว่าประชุมพิจารณาโจทย์นั้นได้ดพเนินมก่อนแข่งมานานมากแล้ว แต่การเจนเทสเคสดันทำก่อนแข่งเพียง 1 วันคุณภาพมันเลยเละเทะอย่างนี้ ผมเสนอให้ไปเจนเทสเคสบน Polygon ซึ่งมีเครื่องมือครบทุกอย่างในการออกโจทย์