1 điểm bởi GN⁺ 2025-08-04 | 1 bình luận | Chia sẻ qua WhatsApp
  • Năm nay, IOCCC28 được khởi động trở lại sau 4 năm gián đoạn và thu hút một khối lượng lớn tác phẩm mã C khó đọc có độ khó cao từ các nhà phát triển trên toàn thế giới
  • Nhờ việc tái thiết website và hạ tầng, việc giới thiệu bộ công cụ mkiocccentry và cải tiến hệ thống nộp bài, hiệu quả vận hành đã được cải thiện đáng kể
  • Quá trình chấm giải trở nên phức tạp và khắt khe hơn so với trước đây, nhưng thời gian chấm lại được rút ngắn đáng kể so với mức thông thường
  • Dù quy định kích thước mã đã được nới lỏng, nhiều tác phẩm vừa nhỏ gọn vừa có chất lượng cao vẫn được chọn, nên dự báo thay đổi quy định trong tương lai của cuộc thi sẽ rất hạn chế
  • Các tác phẩm đoạt giải thú vị và độc đáo, kỹ thuật làm rối, cùng các máy ảo và trình mô phỏng mang tính thử nghiệm đã được giới thiệu, góp phần nâng cao trình độ lập trình C

Tổng quan IOCCC28 và bối cảnh tổ chức

  • IOCCC28 năm 2024 (International Obfuscated C Code Contest, IOCCC28) là một cuộc thi mã C sáng tạo và khó đọc với sự tham gia của các nhà phát triển từ khắp thế giới, diễn ra sau 4 năm gián đoạn
  • Trong thời gian này, trang web chính thức của IOCCC đã được xây dựng lại quy mô lớn dưới tên gọi "Great Fork Merge" với hơn 6.168 lần commit
  • Về mặt vận hành, nhiều cải tiến đã được áp dụng như bộ công cụ mkiocccentry, quy trình đăng ký mới và máy chủ nộp bài, giúp nâng cao hiệu quả chấm giải và tốc độ công bố mã
  • Việc nộp bài diễn ra từ ngày 5/3/2025 đến ngày 5/6/2025, và quá trình chấm kết thúc chỉ sau "33 ngày", với toàn bộ mã nguồn được công bố trong vòng khoảng 2 giờ sau khi cuộc thi kết thúc

Xu hướng tác phẩm gửi dự thi và lựa chọn

  • IOCCC28 năm nay đã tăng mạnh cả số lượng và chất lượng bài dự thi nên độ khó chấm cũng tăng lên, đồng thời tạo ra 23 tác phẩm đạt giải, cao nhất từ trước đến nay
  • "Mặc dù giai đoạn nghỉ 4 năm đã giúp có những bài tốt hơn, nhìn chung người tham gia đã có tiến bộ rõ rệt trong kỹ thuật làm rối và khả năng lập trình C"
  • Dù giới hạn kích thước mã mới (tăng khoảng 21%) đã được áp dụng, hơn một nửa tác phẩm đạt giải nằm dưới 2/3 giới hạn tổng và 10 tác phẩm nộp dưới 1/2 kích thước, thể hiện cả hiệu quả lẫn chất lượng
  • Do đó, dự kiến quy định về kích thước mã trong 10 năm tới sẽ hầu như không thay đổi

Quy định chấm giải và kế hoạch tiếp theo

  • Quy định và hướng dẫn của IOCCC dự kiến sẽ được cập nhật theo hướng đổi mới và trực quan hơn, và Ban giám khảo IOCCC dự định chuẩn bị cho IOCCC29 theo kế hoạch vào tháng 12 năm 2025
  • Cũng dự kiến có các bản vá bổ sung dựa trên Pull Request cho kho người thắng IOCCC trên GitHub và kho mkiocccentry toolkit

Giới thiệu tác phẩm đoạt giải và điểm nhấn

  • Các tác phẩm đoạt giải bao gồm nhiều chủ đề khác nhau, với các tác phẩm và điểm nổi bật tiêu biểu sau:

    • ChatIOCCC: Triển khai một công cụ suy luận LLM nhỏ nhất thế giới dựa trên mô hình ngôn ngữ lớn mã nguồn mở LLaMA 2 của Meta, đồng thời mang lại tính năng chatbot thú vị
    • Eh: Triển khai mã làm rối của một trình soạn thảo với accent UTF-8 có tính thực tiễn hơn ed(1)
    • 135-byte One-liner: Mã làm rối cực ngắn dựa trên giá trị thập lục phân đầu vào để tạo ra nhiều loại đầu ra khác nhau
    • C-Preprocessor Art: Render hình ảnh bằng cách thực thi tiền xử lý C từ hàng nghìn đến hàng chục nghìn lần, mang đến trải nghiệm thời gian chạy script rất dài và cực kỳ đặc biệt
    • Z₃ Virtual Machine: Triển khai máy ảo dựa trên phiên bản thứ ba của Z-machine, cho phép giải đọc mã nguồn như một trò chơi
    • Môi trường ảo kèm giả lập C64: Máy ảo cho phép thử nghiệm an toàn cả các kịch bản có hại như fork bomb, xóa file... và cả C64
    • Mô phỏng chip Intel 4004: Mô phỏng nghệ thuật mạch điện của vi xử lý thương mại đầu tiên trên thế giới ra mắt năm 1971 ở cấp độ gate bằng mã C
    • Câu đố đa ngôn ngữ: Độ khó làm rối mới cho những người quen thuộc với ít nhất ba ngôn ngữ (C, tiếng Anh và ngôn ngữ khác)

Người tham gia và khuyến nghị tiếp theo

  • Mức cộng điểm thấp cho các tác phẩm làm rối giống các tác phẩm đã đạt giải trước đó, khi sự độc đáo và độ hoàn thiện là tiêu chí chính khi chấm
  • Đối với những người không đạt giải, khuyến khích thử lại sau khi cải thiện hoặc thử các hướng tiếp cận khác nhau
  • Việc công bố riêng các tác phẩm không trúng giải cũng được hoan nghênh

Hướng dẫn biên dịch và chạy tác phẩm đạt giải

  • Một số vấn đề tương thích với trình biên dịch C có thể xảy ra, vì vậy nên dùng phiên bản clang hoặc gcc mới nhất
  • FAQ và tài liệu chính thức đã đưa ra hướng dẫn khắc phục sự cố và nộp bản vá

Tải về các tác phẩm đạt giải IOCCC28 năm 2024

  • Toàn bộ tác phẩm đạt giải được phát hành dưới dạng tệp nén (2024.tar.bz2); đọc kỹ trang chi tiết của từng bài cùng mã nguồn và nhận xét của tác giả để học các kỹ thuật làm rối độc đáo

(Để truy cập trực tiếp các liên kết tải tác phẩm đạt giải và mô tả chi tiết cho từng tác phẩm, vui lòng tham khảo trang web chính thức)

1 bình luận

 
GN⁺ 2025-08-04
Ý kiến Hacker News
  • Thật sự quá tuyệt :)
    Đoạn mã này vẽ pha hiện tại của Mặt Trăng trên console. Nếu tôi là người sói thì có thể quan sát pha Mặt Trăng.
  • Đoạn mã này mang cảm giác như một lời tri ân tới donut.c
    Liên kết tham khảo donut.c
  • Đoạn mã này cũng gợi cảm giác hơi giống bài dự thi IOCCC từng tính giá trị pi vào năm 1988
    Tham khảo mã tính pi năm 1988
  • Có thể xem ngay trên Compiler Explorer
    Đi tới Compiler Explorer
  • Cách biên dịch đoạn mã này như sau
cc -Wno-implicit-int -Wno-implicit-function-declaration phase.c && ./a.out
  • Vì đợt redesign, toàn bộ liên kết tới các bài dự thi IOCCC trước đây đều bị hỏng. Những liên kết đã lan truyền suốt hàng chục năm trên Wikipedia và nhiều trang khác bị chặn mà không có redirect, và giờ muốn xem bài dự thi trên GitHub thì bắt buộc phải dùng trình duyệt hỗ trợ JavaScript
  • Nếu muốn truy cập trong môi trường không có JS thì có thể dùng cách clone kho lưu trữ bằng git clone
  • Khi xem bài dự thi này, tôi đã đọc lại các tác phẩm IOCCC trước đây, và đoạn one-liner giải nén ảnh này sẽ tự in ra hình logo của chính nó nếu nhận giá trị hash của mã nguồn làm đối số. Quá kỳ diệu
  • Tôi tò mò cơ chế của trò hash này hoạt động ra sao, và có phần giải thích trong ghi chú. Nhân tiện, phần ghi chú cũng cực kỳ hài
    Có câu viết rằng "sự ngắn gọn được coi trọng hơn sự khó hiểu, nhưng chương trình này vẫn đáp ứng đầy đủ tiêu chuẩn rõ ràng đặc trưng của IOCCC"
  • Thật là một sự trùng hợp đáng kinh ngạc, số bit của định dạng đầu vào gần như trùng khớp với log2 của số lần đánh giá MD5 mà một GPU 5 năm tuổi có thể thực hiện trong một giờ
  • Người này cũng là tác giả của jq
  • Được viết trong 135 byte! Đây gần như là lãnh địa của nhà khoa học điên. Mức độ khó tin thật sự
  • Luật cho bài dự thi IOCCC rất hay. Đó là những quy định cực kỳ cụ thể, cho thấy rõ chúng đã từng bị lạm dụng như thế nào trong quá khứ
Rule 2

Rule 2 yêu cầu bài dự thi phải đồng thời thỏa mãn Rule 2a và 2b  
Có thể dùng công cụ iocccsize(1) để kiểm tra mã có vượt qua quy tắc này hay không  
Chỉ cần truyền tên tệp như prog.c làm đối số

Rule 2a  
Kích thước mã nguồn của chương trình không được vượt quá 4993 byte

Rule 2b  
Khi đo kích thước mã bằng công cụ iocccsize(1), giá trị đầu ra không được vượt quá 2503

Để biết thêm chi tiết liên quan, có thể xem FAQ hoặc Rule 17
  • Vậy tức là được phép nhét thêm 2053 byte dữ liệu vào tên tệp. Quy tắc này lỏng hơn tôi tưởng
  • 4993 byte, tự nhiên thấy tò mò vì sao họ lại chọn một con số lưng chừng như vậy
  • Mong là underhanded-c.org cũng sẽ mở lại
  • Có lẽ chẳng cần thêm lập luận nào tốt hơn để nói rằng không nên dùng C. Cảm giác như đây là một kết luận vừa rõ ràng vừa nghiêm túc
  • Có thể viết kiểu mã khó hiểu như vậy bằng bất kỳ ngôn ngữ nào. C đặc biệt hợp với việc này, nhưng phần lớn bài dự thi IOCCC dùng những mẹo có thể áp dụng cho nhiều ngôn ngữ khác
  • Đây là một trong những bài dự thi IOCCC tôi thích nhất, và cũng là bài từng đoạt giải
    Xem persano.c năm 2005
  • Có lẽ nếu tôi là lập trình viên, công việc của mình trong mắt người khác sẽ trông như một chuỗi mật mã hoàn toàn vô nghĩa
  • Cái này thật sự rất ngầu
    Entrry macke 2024
    Chương trình này là một trình giả lập có thể chạy trọn vẹn một hệ thống Linux hiện đại chỉ với bộ tính năng tối thiểu
  • Tôi là tác giả. Tệp nhị phân này chạy được Linux hiện đại chỉ với 1.6MB. Tôi đã thử đủ mọi cách để giảm kích thước tối đa. Nó cũng được biên dịch sang WebAssembly để có thể chạy ngay trong trình duyệt
  • Bài dự thi này khiến tôi khá bối rối