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
Ý kiến trên Hacker News
Có một ví dụ tương tự trong thế giới TeX là
xii.tex: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:
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:
IOCCC (International Obfuscated C Code Contest) vẫn rất sôi động ngay cả trong năm 2023:
Nếu tắt cảnh báo thì nó vẫn chạy được cả trên kho mã hiện đại (trunk):
Rosetta Code cũng có một tác phẩm tương tự:
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:
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:
Đoạn mã này dùng một phiên bản C rất cũ:
maindù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: