3 điểm bởi GN⁺ 2023-12-24 | 1 bình luận | Chia sẻ qua WhatsApp

Phân tích mã xmas.c

  • Mã C có tên xmas.c, được tạo ra vào năm 1988, đã giành chiến thắng tại Cuộc thi Mã C Làm rối Quốc tế.
  • Đoạn mã này có kích thước nhỏ hơn cả đầu ra mà nó tạo ra, gợi mở một hướng đi mới cho tiêu chuẩn nén văn bản.
  • Khi biên dịch và chạy mã, nó hoạt động mà không cần tham số và thú vị ở chỗ trông như thể ai đó đã gõ ngẫu nhiên lên các phím của máy đánh chữ.

Đầu ra của mã

  • Khi chạy mã, lời bài hát "Mười hai ngày Giáng sinh" sẽ được in ra.
  • Nội dung đầu ra là phần lời liệt kê các món quà từ ngày đầu tiên đến ngày thứ mười hai của Giáng sinh.

Phân tích

  • Để hiểu được đoạn mã, cần phải viết lại nó dưới dạng dễ đọc hơn.
  • Trong quá trình viết lại, cách giải mã một mật mã thay thế bằng cách sử dụng một chuỗi cụ thể được hé lộ.
  • Biến t đóng vai trò quan trọng trong việc điều khiển hướng của đệ quy.
  • Mã sử dụng đệ quy để giải mã mật mã thay thế và in ra lời bài hát Giáng sinh.

Đơn giản hóa

  • Sau khi hiểu chương trình, có thể đơn giản hóa mã bằng cách dùng một số vòng lặp và các hàm thư viện chuỗi của C.
  • Cuối cùng, khi đơn giản hóa mã, nó có thể được rút gọn thành việc chỉ đơn thuần in ra lời bài hát.

Ý kiến của GN⁺

  • Đỉnh cao của sự sáng tạo: Mã xmas.c là một ví dụ xuất sắc về việc viết mã làm rối bằng cách sử dụng mật mã thay thế và đệ quy. Điều này cho thấy sự sáng tạo có thể được thể hiện như thế nào trong lập trình.
  • Giá trị giáo dục: Quá trình phân tích và hiểu đoạn mã này có thể là một bài tập tốt giúp các kỹ sư phần mềm mới vào nghề cải thiện kỹ năng lập trình.
  • Sự vui nhộn và hấp dẫn: Đoạn mã này mang đến cơ hội khám phá niềm vui của lập trình và trải nghiệm sự thích thú khi giải quyết các vấn đề phức tạp.

1 bình luận

 
GN⁺ 2023-12-24
Ý kiến trên Hacker News
  • Có một ví dụ tương tự trong thế giới TeX là xii.tex:

    • Nếu chèn đoạn mã trông phức tạp vào tài liệu TeX rồi chạy pdftex, bạn có thể nhận được kết quả khác với dự đoán. Có thể xem tại shreevatsa.net.
  • Đoạn mã này gợi nhớ đến độ phức tạp Kolmogorov:

    • Việc thấy một đoạn mã khó hiểu tạo ra kết quả mong muốn khơi gợi tò mò về việc liệu có chương trình nào ngắn hơn nhưng cho ra cùng kết quả hay không, và làm cách nào để tìm ra nó.
  • Tôi đã nhận được đoạn mã này khi nó được phát hành lần đầu, nhưng tên tệp thì khác:

    • Nó được lưu dưới tên "carol.c", và khi thử biên dịch rồi chạy trên hệ thống hiện đại thì trình biên dịch có in ra cảnh báo.
  • IOCCC (International Obfuscated C Code Contest) vẫn rất sôi động ngay cả trong năm 2023:

    • Phần giới thiệu về IOCCC rất hay, có thể xem tại www.ioccc.org.
  • Nếu tắt cảnh báo thì nó vẫn chạy được cả trên kho mã hiện đại (trunk):

    • Có thể kiểm tra việc đoạn mã này có hoạt động hay không tại compiler-explorer.com.
  • Rosetta Code cũng có một tác phẩm tương tự:

    • Có ví dụ chương trình tạo lặp lại bài hát ngày càng dài "Old Lady Swallowed a Fly". Có thể xem tại rosettacode.org.
  • Tôi có kỷ niệm đẹp là giáo sư đã cho xem đoạn mã này ở phần mở đầu buổi giảng trong học kỳ cuối đại học:

    • Hồi tưởng lại trải nghiệm lần đầu nhìn thấy đoạn mã này trong giờ giảng của giáo sư vào năm 2022.
  • Thời đại học, tôi từng thấy đoạn mã này trong tài liệu học C được in ra, và nhớ là đã tự gõ lại một lần:

    • Khi học ngôn ngữ C, tôi đã trực tiếp nhập lại đoạn mã này nên đó trở thành một kỷ niệm khó quên.
  • Đoạn mã này dùng một phiên bản C rất cũ:

    • Có ý kiến cho rằng chữ ký của hàm main dùng kiểu K&R cũ, nên hiện nay có lẽ sẽ không còn biên dịch được nữa.
  • Một trong những điểm thú vị là mối liên hệ giữa việc Larry Wall từng hai lần đoạt giải IOCCC và việc ông thiết kế Perl:

    • Việc người thiết kế Perl từng đoạt giải ở IOCCC tạo cảm giác như điều đó phần nào giải thích các đặc trưng của ngôn ngữ Perl.