1 คะแนน โดย GN⁺ 2025-08-04 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • IOCCC28 กลับมาอีกครั้งหลังจากผ่านไป 4 ปี และมีการส่งผลงาน โค้ด C ระดับยากสูงสุด จากนักพัฒนาทั่วโลกจำนวนมาก
  • เว็บไซต์และโครงสร้างพื้นฐานได้รับการสร้างใหม่, การนำ mkiocccentry toolkit เข้ามาใช้งาน และการปรับปรุงระบบการส่งผลงาน ทำให้ประสิทธิภาพการดำเนินงานดีขึ้นอย่างมาก
  • กระบวนการคัดเลือกมีความซับซ้อนและเข้มงวดยิ่งขึ้นเมื่อเทียบกับอดีต แต่ระยะเวลาคัดเลือกกลับสั้นลงมากกว่าปกติ
  • แม้กฎขนาดโค้ดจะผ่อนคลายลง แต่ผลงานที่มีขนาดเล็กและคุณภาพสูงได้รับการคัดเลือกจำนวนมาก จึงคาดว่าการเปลี่ยนแปลงกติกาของการแข่งขันในอนาคตจะมีจำกัด
  • ผลงานผู้ชนะที่น่าดึงดูดและมีความคิดสร้างสรรค์, เทคนิคออบฟัสเกต และเครื่องเสมือนหรืออีมูเลเตอร์เชิงทดลองถูกนำเสนอ และช่วยยกระดับการพัฒนา C

ภาพรวมและที่มาของ IOCCC28

  • การแข่งขัน International Obfuscated C Code Contest (IOCCC28) ที่จัดขึ้นในปี 2024 เป็นเวทีแข่งขันโค้ด C ที่สร้างสรรค์และยากต่อการอ่าน ซึ่งมีผู้พัฒนาจากนานาชาติร่วมแข่งขันหลังจากช่วงพัก 4 ปี
  • ในช่วงเวลาดังกล่าว เว็บไซต์ทางการของ IOCCC ได้รับการรีบิลด์ขนาดใหญ่ภายใต้ชื่อ "Great Fork Merge" โดยมี commit มากกว่า 6,168 ครั้ง
  • ด้านการดำเนินงาน มีการนำโซลูชันใหม่ๆ อย่างเช่น toolkit mkiocccentry, ขั้นตอนการสมัครใหม่ และการเพิ่มระบบเซิร์ฟเวอร์รับผลงานเข้ามา ทำให้ประสิทธิภาพการคัดเลือกและความเร็วในการเปิดเผยโค้ดดีขึ้น
  • การรับผลงานเปิดรับตั้งแต่วันที่ 5 มีนาคม 2025 ถึง 5 มิถุนายน 2025 และการคัดเลือกเสร็จสิ้นภายใน "33 วัน" โดยหลังจบการแข่งขันเพียงประมาณ 2 ชั่วโมงซอร์สโค้ดทั้งหมดก็ถูกเผยแพร่แล้ว

ผลงานที่ส่งเข้าประกวดและแนวโน้มการคัดเลือก

  • IOCCC28 ปีนี้มีจำนวนและคุณภาพของผลงานส่งเข้าประกวดสูงขึ้นมาก ส่งผลให้การคัดเลือกยากขึ้น และได้ผู้ชนะสูงสุดเป็นประวัติศาสตร์ที่ 23 ผลงาน
  • "แม้ช่วงพัก 4 ปีจะทำให้ได้ผลงานที่ดีกว่าออกมาในบางส่วน แต่โดยรวมแล้วผู้เข้าร่วมได้ก้าวหน้าอย่างเด่นชัดทั้งในด้านเทคนิคการออบฟัสเกตและทักษะการเขียน C"
  • แม้มีการเพิ่มเพดานขนาดโค้ดใหม่ (ประมาณ 21%) แต่ผลงานผู้ชนะเกินครึ่งหนึ่งยังคงอยู่ต่ำกว่า 2/3 ของเพดานทั้งหมด และมี 10 ผลงานที่มีขนาดต่ำกว่า 1/2 ซึ่งแสดงถึงประสิทธิภาพและคุณภาพไปพร้อมกัน
  • ด้วยเหตุนี้จึงคาดว่าการเปลี่ยนแปลงข้อจำกัดขนาดโค้ดในอีก 10 ปีข้างหน้าจะเกิดขึ้นน้อยมาก

กติกาการตัดสินและแผนงานในอนาคต

  • IOCCC วางแผนแก้ไขกติกาและแนวทางให้ทันสมัยและเป็นมิตรต่อผู้ใช้มากขึ้น และผู้ตัดสิน IOCCC จะเริ่มเตรียมตัวเพื่อการแข่งขัน IOCCC29 ซึ่งกำหนดไว้สำหรับปี 2025 เดือน 12
  • มีแผนออก patch แบบ Pull Request เพื่อปรับปรุง repository ผู้ชนะบน GitHub และ repository ของ mkiocccentry toolkit

แนะนำผลงานผู้ชนะและไฮไลต์

  • มีผลงานผู้ชนะหลากหลายหัวข้อ ซึ่งมีผลงานหลักและจุดเด่นที่สำคัญดังต่อไปนี้

    • ChatIOCCC: สร้างเครื่องมืออนุมาน LLM ที่เล็กที่สุดในโลกบนฐาน LLaMA 2 แบบโอเพ่นซอร์สของ Meta และมอบฟังก์ชันแชตบอตที่น่าสนุก
    • Eh: โค้ดออบฟัสเกตของ ed(1) ที่ใช้งานได้จริงมากขึ้นด้วย UTF-8 accent
    • 135-byte One-liner: โค้ดออบฟัสเกตที่สั้นมากและสร้างผลลัพธ์ที่หลากหลายจากค่าฮกซ์ที่ป้อนเข้ามา
    • C Preprocessor Art: ทำให้ตัว preprocessor ทำงานเป็นพันถึงหลายแสนครั้งเพื่อเรนเดอร์ภาพ สร้างประสบการณ์ที่ไม่เหมือนใครพร้อมเวลารันสคริปต์ที่ยาวมาก
    • Z₃ Virtual Machine: จำลอง virtual machine ตาม Z-machine เวอร์ชันที่ 3 โดยการอ่านซอร์สโค้ดราวกับเล่นเกมได้
    • C64 Included Virtual Environment with Emulator: สภาพแวดล้อมเสมือนที่รวมตัว C64 emulator และรองรับการทดลอง scenario ที่มีความเสี่ยงเช่น fork bomb, การลบไฟล์ ฯลฯ ได้อย่างปลอดภัย
    • Intel 4004 Chip Emulation: การจำลองเชิงศิลป์วงจรชิป Intel 4004 ซึ่งเป็นไมโครโปรเซสเซอร์เชิงพาณิชย์เชิงพาณิชย์ตัวแรกของโลกที่ออกจำหน่ายในปี 1971 ที่ระดับเกตด้วยโค้ด C
    • Multilingual Puzzle: การออบฟัสเกตที่แปลกใหม่สำหรับผู้ที่คุ้นเคยกับอย่างน้อย 3 ภาษา (C, อังกฤษ และอื่นๆ)

ผู้เข้าร่วมการแข่งขันและข้อแนะนำในอนาคต

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

คำแนะนำการคอมไพล์และรันผลงานที่ได้รับรางวัล

  • อาจมีปัญหาความเข้ากันได้กับคอมไพเลอร์ C บางตัว จึงแนะนำให้ใช้ clang หรือ gcc เวอร์ชันล่าสุด
  • มีการแนะนำวิธีแก้ปัญหาและส่ง patch ปรับปรุงผ่าน FAQ และเอกสารทางการ

ดาวน์โหลดผลงานผู้ชนะ IOCCC28 ปี 2024

  • ผลงานผู้ชนะทั้งหมดพร้อมให้ดาวน์โหลดเป็นไฟล์บีบอัด (2024.tar.bz2) และสามารถดูหน้ารายละเอียดของแต่ละผลงาน โค้ดต้นฉบับ และความคิดเห็นของผู้เขียนเพื่อเรียนรู้เทคนิคออบฟัสเกตที่สร้างสรรค์

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

1 ความคิดเห็น

 
GN⁺ 2025-08-04
ความคิดเห็นบน Hacker News
  • ยอดเยี่ยมจริง ๆ :)
    โค้ดนี้ วาดข้างขึ้นข้างแรมของดวงจันทร์ลงบนคอนโซลได้ ตอนนี้ถ้าฉันเป็นมนุษย์หมาป่า ก็คงใช้มันสังเกตข้างขึ้นข้างแรมได้
  • โค้ดนี้ให้อารมณ์เหมือนเป็นการคารวะต่อ donut.c
    ลิงก์อ้างอิง donut.c
  • โค้ดนี้ยังให้ความรู้สึกคล้ายกับผลงาน IOCCC ที่ใช้คำนวณค่า pi ในปี 1988 อยู่นิดหน่อย
    อ้างอิงโค้ดคำนวณ pi ปี 1988
  • ลองดูได้ทันทีบน Compiler Explorer
    ไปที่ Compiler Explorer
  • วิธีคอมไพล์โค้ดนี้เป็นดังนี้
cc -Wno-implicit-int -Wno-implicit-function-declaration phase.c && ./a.out
  • เพราะการรีดีไซน์ ลิงก์ไปยังผลงาน IOCCC เก่า ๆ พังก่อนหมด ลิงก์ที่กระจายอยู่ตามเว็บต่าง ๆ อย่าง Wikipedia มาหลายสิบปีก็ถูกบล็อกโดยไม่มีรีไดเร็กต์ และตอนนี้ถ้าจะดูผลงานบน GitHub ก็จำเป็นต้องใช้เบราว์เซอร์ที่รองรับ JavaScript
  • ถ้าจะเข้าถึงในสภาพแวดล้อมที่ไม่มี JS ก็ใช้วิธี git clone เพื่อโคลนรีโพซิทอรีได้
  • ระหว่างดูผลงานนี้ ฉันก็ย้อนกลับไปอ่านผลงาน IOCCC เก่า ๆ แล้วพบว่า one-liner สำหรับ image decompression นี้ ถ้ารับค่าแฮชของซอร์สโค้ดเป็นอาร์กิวเมนต์ มันจะพิมพ์ภาพโลโก้ของตัวเองออกมาได้โดยตรง น่าทึ่งมาก
  • ฉันสงสัยว่าทริกแฮชนี้ทำงานอย่างไร ก็เลยไปดูคำอธิบายในโน้ต แล้วก็ต้องบอกว่าแม้แต่เนื้อหาในโน้ตก็ตลกมาก
    มีเขียนไว้ว่า "ถึงแม้ความกระชับจะสำคัญกว่าความยากต่อการเข้าใจ แต่โปรแกรมนี้ก็ยังคงผ่านมาตรฐานความชัดเจนแบบฉบับเฉพาะของ IOCCC"
  • เป็นเรื่องบังเอิญที่น่าทึ่งมาก ที่จำนวนบิตของฟอร์แมตอินพุตแทบจะตรงกับค่า log2 ของจำนวนครั้งในการประเมิน MD5 ที่ GPU อายุห้าปีเครื่องหนึ่งทำได้ในหนึ่งชั่วโมง
  • คนนี้ก็คือคนสร้าง jq ด้วย
  • เขียนด้วยขนาดเพียง 135 ไบต์! แทบจะอยู่ในเขตนักวิทยาศาสตร์สติเฟื่องเลย เป็นโค้ดที่เหลือเชื่อจริง ๆ
  • กฎของการส่งผลงาน IOCCC เจ๋งมาก เป็นข้อกำหนดที่เฉพาะเจาะจงมากจนเห็นชัดเลยว่าในอดีตเคยถูกใช้ในทางแปลก ๆ มาอย่างไร
Rule 2

Rule 2 กำหนดให้ผลงานที่ส่งต้องผ่านทั้ง Rule 2a และ 2b  
สามารถใช้เครื่องมือ iocccsize(1) เพื่อตรวจว่าโค้ดผ่านกฎนี้หรือไม่  
เพียงส่งชื่อไฟล์อย่าง prog.c เป็นอาร์กิวเมนต์

Rule 2a  
ขนาดของซอร์สโปรแกรมต้องไม่เกิน 4993 ไบต์

Rule 2b  
เมื่อวัดขนาดโค้ดด้วยเครื่องมือ iocccsize(1) ค่าที่แสดงออกมาต้องไม่เกิน 2503

ดูรายละเอียดเพิ่มเติมได้ใน FAQ หรือ Rule 17
  • งั้นก็แปลว่าอนุญาตให้ใส่ข้อมูลเพิ่มอีก 2053 ไบต์ไว้ในชื่อไฟล์ได้สินะ เป็นกฎที่หลวมกว่าที่คิด
  • 4993 ไบต์นี่ทำไมถึงตั้งเป็นตัวเลขก้ำกึ่งแบบนี้ก็ชวนสงสัย
  • อยากให้ underhanded-c.org กลับมาเปิดอีกครั้ง
  • ชวนให้คิดว่าไม่น่าจะต้องมีเหตุผลอื่นอีกแล้วว่าทำไมไม่ควรใช้ C นี่ดูเหมือนเป็นข้อสรุปที่ชัดเจนและจริงจังมาก
  • จะเขียนโค้ดแบบอ่านยากสุด ๆ นี้ด้วยภาษาไหนก็ได้ C แค่เหมาะกับมันเป็นพิเศษ แต่กลเม็ดส่วนใหญ่ในผลงาน IOCCC ก็นำไปใช้กับภาษาอื่นได้เหมือนกัน
  • นี่คือหนึ่งในผลงาน IOCCC ชิ้นโปรดของฉัน และยังเป็นผลงานที่ได้รางวัลด้วย
    ดู persano.c ปี 2005
  • บางทีถ้าฉันเป็นโปรแกรมเมอร์ งานของฉันก็คงดูเหมือนรหัสลับไร้ความหมายสำหรับคนอื่น
  • อันนี้เจ๋งมากจริง ๆ
    ผลงาน macke ปี 2024
    โปรแกรมนี้เป็นอีมูเลเตอร์ที่รันระบบลินุกซ์สมัยใหม่ได้ทั้งระบบ โดยมีฟังก์ชันเท่าที่จำเป็นแบบลดทอนที่สุด
  • ผู้เขียนเอง ไบนารีนี้มีขนาด 1.6MB และรันลินุกซ์สมัยใหม่ได้ ผมใช้ทุกวิถีทางเพื่อลดขนาดมันให้เล็กที่สุดเท่าที่จะทำได้ และมันยังคอมไพล์เป็น WebAssembly ได้ด้วย เลยรันในเบราว์เซอร์ได้
  • ผลงานนี้ ทำฉันสับสนพอสมควร