93% vết sơn hóa ra là chương trình Perl hợp lệ (2019)
(mcmillen.dev)- Bài báo SIGBOVIK 2019 đã kiểm chứng bằng thí nghiệm OCR câu hỏi liệu bôi sơn lên tường có thể không tạo thành chương trình Perl hay không, và 93% trong số 100 vết sơn được phân tích cú pháp thành Perl
- Thí nghiệm được tiến hành bằng cách chuyển ảnh vết sơn thành chuỗi OCR, rồi kiểm tra xem kết quả đó có phải là chương trình Perl hợp lệ hay không
- Dù 93% là hợp lệ, 7 vết sơn còn lại không được phân tích cú pháp thành Perl, nên vẫn còn ngoại lệ cho kiểu đùa rằng “cái gì cũng thành Perl”
- Tài liệu công khai bao gồm toàn bộ ảnh vết sơn và mã nguồn Perl tương ứng; các ảnh không hợp lệ được phân biệt bằng nhãn “Not valid” màu đỏ
- Một số kết quả OCR được xác nhận sau khi nộp bài được Perl đánh giá thành số
0hoặc các chuỗic,E__, cho thấy sự kỳ quặc của những đoạn mã tình cờ được tạo ra
Khả năng phân tích cú pháp Perl được kiểm chứng bằng vết sơn
- Bài báo này lấy làm đối tượng thí nghiệm một câu hỏi được đóng gói như một vấn đề mở lâu đời trong cộng đồng ngôn ngữ lập trình, tức liệu có thể bôi sơn lên tường mà không tạo ra Perl hợp lệ hay không
- Kết luận khá gần với “có thể”
- Trong thí nghiệm dùng phần mềm OCR, chỉ 93% vết sơn được phân tích cú pháp thành Perl hợp lệ
- Vì vậy, một số vết sơn không phải là chương trình Perl hợp lệ
- Bài báo phân tích đặc tính của các chương trình Perl từ vết sơn, đồng thời đưa ra 7 ví dụ vết sơn không phải là chương trình Perl hợp lệ
Bài báo SIGBOVIK 2019 và tài liệu công khai
- Bài báo được chấp nhận tại SIGBOVIK 2019, tổ chức ở Pittsburgh vào ngày 1 tháng 4 năm 2019
- Bài cũng nhận được “Unwitting Participation Ribbon”
- Dải ruy-băng này được giới thiệu là dành cho các bài có bao gồm “sản phẩm thật”
- Bài báo và kỷ yếu được công khai dưới nhiều hình thức
- Google Docs: xem bài báo
- PDF: tải bài báo
- SIGBOVIK 2019 proceedings: toàn bộ kỷ yếu, bài báo nằm ở trang 174
Bộ sưu tập vết sơn và tập dữ liệu 100 ảnh
- all the paint splatters gom toàn bộ vết sơn trên một trang và cung cấp cả mã nguồn Perl hợp lệ tương ứng với từng ảnh
- Các ảnh không được phân tích cú pháp thành chương trình Perl hợp lệ được phân biệt bằng nhãn “Not valid” màu đỏ
- Khi nhiều chương trình Perl hợp lệ được nhận diện với các thiết lập OCR khác nhau, một kết quả được cảm thấy là “thú vị” nhất sẽ được chọn
- tarball of 100 paint-splatter images chứa 100 ảnh vết sơn được dùng làm tập dữ liệu chính của bài báo
Các trường hợp bổ sung được xác nhận sau khi nộp bài
- Ngay cả sau hạn nộp SIGBOVIK, các chương trình Perl từ vết sơn thú vị vẫn tiếp tục được xác nhận
- Vết sơn được OCR nhận diện là
lerzfijglpFiji-jđược Perl đánh giá thành số0 - Vết sơn được nhận diện là
-*?cũng được Perl đánh giá thành số0 - Ảnh được nhận diện là
;i;c;;#\\?z{;?;;fn':.;trở thành chuỗictrong Perl - Ảnh được nhận diện là
;E,'__'được Perl đánh giá thành chuỗiE__
1 bình luận
Các ý kiến trên Hacker News
Ngôn ngữ nối ghép có đặc tính là mọi chuỗi token đều trở thành một chương trình hợp lệ
Nếu một ngôn ngữ dùng từng bit đơn lẻ làm token thì mọi chuỗi bit đều trở thành chương trình hợp lệ. zot của Chris Barker là một trong những ngôn ngữ như vậy
Lấy cảm hứng từ zot, tôi đã định nghĩa một phiên bản nối ghép của Binary Lambda Calculus có cùng đặc tính đó
[1] https://en.wikipedia.org/wiki/Concatenative_programming_lang...
[2] https://en.wikipedia.org/wiki/Iota_and_Jot#Zot
[3] https://cstheory.stackexchange.com/questions/32309/concatena...
Đặc tính của ngôn ngữ nối ghép là nếu a và b đều là chương trình hợp lệ thì a || b cũng là chương trình hợp lệ. Ở đây || nghĩa là “nối lại”
Nhưng đặc tính này không có nghĩa là mọi chuỗi token đều hợp lệ. Ví dụ trong Cat,
[1 2không hợp lệ về mặt cú phápƯớc gì tôi hiểu được cả Jot lẫn câu đó
Chú thích 5 khá thú vị
⁵ Tính năng này cho phép tạo ra một quine gọn gàng. Nếu lưu chương trình Perl “Illegal division by zero at /tmp/quine.pl line 1.” ở đúng vị trí, nó sẽ in ra “Illegal division by zero at /tmp/quine.pl line 1.”. Lý do của hành vi này xin dành làm bài tập cho độc giả
Và còn có một Python quine nhìn bề ngoài có vẻ liên quan nhưng thực ra khá khác:
File "quine.py", line 1
File "quine.py", line 1
^
IndentationError: unexpected indent
Tôi thử trong REPL thì
"Illegal division"không tìm được phương thức"illegal"trong package"division", và có lẽ phần đó bị bỏ qua. Phương thức"by"của package"zero"cũng tương tự, còn"at /tmp"có vẻ là chuỗi đơn giản nhất tạo ra thông báo lỗi đó. Có vẻ lỗi này nghiêm trọng hơn cảnh báo thiếu package nên làm chương trình kết thúcTôi tưởng
/là toán tử chia và"tmp"được khởi tạo như một biến rồi bị ép sang số nguyên, nhưng chỉ"/tmp"thì không được, còn"/tmp/"lại kích hoạt hành vi liên quan đến biểu thức chính quy, nên tôi không hiểu vì sao parser lại chia ở đóBài liên quan:
93% of Paint Splatters Are Valid Perl Programs (2019) - https://news.ycombinator.com/item?id=27929730 - tháng 7/2021, 163 bình luận
Một liên kết khác:
93% of Paint Splatters Are Valid Perl Programs (2019) - https://news.ycombinator.com/item?id=38754686 - tháng 12/2023, 1 bình luận
Gạt chuyện đùa sang một bên, chẳng phải việc phần mềm OCR vẫn luôn cho ra kết quả văn bản ngay cả với ảnh không phải văn bản là sai sao?
Hơn 10 năm trước tôi từng OCR sách cũ, và nhớ là rất bực vì phải xử lý đống văn bản rác sinh ra từ các hình nhỏ, vết bẩn và bụi. Có vẻ lĩnh vực này từ đó đến nay không tiến bộ mấy
Nếu những nét nguệch ngoạc ngẫu nhiên trở thành một thực thi hợp lệ trong Perl thì chẳng phải có gì đó sai sao?
Tự thử nghiệm thì tôi thấy ChatGPT là một tác nhân OCR “thông minh và hiểu ngữ cảnh” khá ổn
Tôi hiểu bài này nói về vấn đề một chương trình nhận dạng ký tự quang học cụ thể nhận diện các vết sơn bắn thành ký tự
Chương trình đó dường như hầu như luôn có xu hướng nhận diện sơn thành một tổ hợp ký tự nào đó, và trong số nhiều cách triển khai khả dĩ, cách này hoàn toàn đáng hoan nghênh và cũng phù hợp với mục đích
Tuy nhiên lúc đầu tôi cũng nghĩ đến một cách khác, kiểu xem các mảng màu và khoảng trống là 0 và 1 rồi diễn giải toàn bộ thành chương trình. Trong trường hợp đó phần lớn có lẽ chỉ là nhiễu vô nghĩa
Rốt cuộc có hai thái cực. Một bên gần như chỉ toàn nhiễu, bên kia phần lớn có ý nghĩa. Trò chơi trong trò chơi ở đây có vẻ là tìm một cách diễn giải gán càng nhiều ý nghĩa càng tốt cho các vết sơn bắn, nhưng sao cho ý nghĩa đó đến từ chính cấu trúc nhiều nhất có thể, chứ không phải do quy tắc cố cưỡng ép tìm ra ý nghĩa
Dùng AI tạo sinh có thể tạo ra những vết sơn bắn mới mẻ và đột phá được đánh giá là phần mềm có thể chạy nhanh hơn bao giờ hết
AI tạo sinh cho phép một lớp nhà sáng tạo mới tận dụng quy trình làm việc văn bản-sang-hình ảnh để tạo giá trị cho doanh nghiệp ở mọi quy mô. Các mô hình AI mới có thể nhúng phần mềm hoạt động được và mã máy có thể đọc vào nhiều loại nội dung độ phân giải cao, thu hút sự chú ý của người xem và đem đến cho nhà sáng tạo những cách mới mẻ, thú vị để phát triển khán giả
Nghiên cứu tính toán tiên tiến hơn nằm ở đây: https://sigbovik.org/
Đây là một biến thể thông minh của câu đùa cũ “không thể phân biệt với line noise”
Với những ai không thường gặp line noise, hãy tưởng tượng một terminal video ký tự ASCII diễn giải luồng byte để hiển thị văn bản có nghĩa. Giờ giả sử kênh truyền thông bị hỏng vì lý do nào đó. Ví dụ ai đó nhấc ống nghe điện thoại khi modem đang kết nối, hoặc dây cáp bị nhiễu
Nếu không có sửa lỗi hay checksum, các byte được diễn giải về cơ bản sẽ là ngẫu nhiên. Vì vậy các chữ cái, chữ số, dấu câu, ký tự điều khiển tùy ý... được diễn giải và hiển thị lên màn hình; người quen sẽ biết đó là ngẫu nhiên và biết vì sao. Nhưng trò đùa là nó thực ra vẫn là một chương trình Perl hợp lệ
Đến nước này thì chắc tôi phải buộc củ hành vào thắt lưng thôi
Câu “chưa có mã nguồn. Vì tôi không biết dùng GitHub” nói vậy thì có vẻ nó đã biến mất vĩnh viễn rồi
Ít nhất là không có ở https://git.mcmillen.dev/explore/repos
Với tư cách lập trình viên Perl, tôi cho rằng 7% không chạy được là bug