페인트 얼룩의 93%가 유효한 Perl 프로그램으로 판명 (2019)
(mcmillen.dev)- SIGBOVIK 2019 논문은 벽에 페인트를 문질러도 Perl 프로그램이 되지 않을 수 있는가를 OCR 실험으로 확인했고, 100개 얼룩 중 93%가 Perl로 파싱됨
- 실험은 페인트 얼룩 이미지를 OCR 문자열로 변환한 뒤, 그 결과가 유효한 Perl 프로그램인지 검사하는 방식으로 진행됨
- 93%가 유효했지만 나머지 7개 얼룩은 Perl로 파싱되지 않아, “항상 Perl이 된다”는 식의 농담에는 예외가 남아 있음
- 공개 자료에는 모든 얼룩 이미지와 대응하는 Perl 소스가 포함되며, 유효하지 않은 이미지는 빨간색 “Not valid” 표시로 구분됨
- 제출 이후 확인된 일부 OCR 결과는 Perl에서 숫자
0이나 문자열c,E__로 평가되어, 우연히 만들어진 코드의 기묘함을 보여줌
페인트 얼룩으로 검증한 Perl 파싱 가능성
- 이 논문은 프로그래밍 언어 커뮤니티의 오래된 공개 문제처럼 포장한 질문, 즉 벽에 페인트를 문질러도 유효한 Perl을 만들지 않을 수 있는가를 실험 대상으로 삼음
- 결론은 “가능하다”에 가까움
- OCR 소프트웨어를 사용한 실험에서 페인트 얼룩의 93% 만 유효한 Perl로 파싱됨
- 따라서 일부 페인트 얼룩은 유효한 Perl 프로그램이 아님
- 논문은 페인트 얼룩 Perl 프로그램의 성질을 분석하고, 유효한 Perl 프로그램이 아닌 얼룩 7개 예시를 함께 제시함
SIGBOVIK 2019 논문과 공개 자료
- 논문은 2019년 4월 1일 Pittsburgh에서 열린 SIGBOVIK 2019에 채택됨
- “Unwitting Participation Ribbon”도 받음
- 이 리본은 “진짜 산출물”을 포함한 논문에 붙는 것으로 소개됨
- 논문과 프로시딩은 여러 형태로 공개되어 있음
- Google Docs: 논문 보기
- PDF: 논문 다운로드
- SIGBOVIK 2019 proceedings: 전체 프로시딩, 해당 논문은 174쪽
얼룩 갤러리와 100개 이미지 데이터셋
- all the paint splatters는 모든 페인트 얼룩을 한 페이지에 모아 보여주며, 각 이미지에 대응하는 유효한 Perl 소스 코드도 함께 제공함
- 유효한 Perl 프로그램으로 파싱되지 않은 이미지는 빨간색 “Not valid” 표시로 구분됨
- 서로 다른 OCR 설정에서 여러 유효한 Perl 프로그램이 인식된 경우, 가장 “흥미롭다”고 느낀 결과 하나가 선택됨
- tarball of 100 paint-splatter images는 논문의 주요 데이터셋으로 쓰인 100개 페인트 얼룩 이미지를 담고 있음
제출 이후 확인된 추가 사례
- SIGBOVIK 제출 마감 이후에도 흥미로운 페인트 얼룩 Perl 프로그램이 추가로 확인됨
- OCR이
lerzfijglpFiji-j로 인식한 얼룩은 Perl에서 숫자0으로 평가됨 -*?로 인식된 얼룩 역시 Perl에서 숫자0으로 평가됨;i;c;;#\\?z{;?;;fn':.;로 인식된 이미지는 Perl에서 문자열c가 됨;E,'__'로 인식된 이미지는 Perl에서 문자열E__로 평가됨
댓글과 토론
Hacker News 의견들
-
연접형 언어에는 모든 토큰 시퀀스가 유효한 프로그램이 되는 성질이 있음
단일 비트를 토큰으로 쓰는 언어라면 모든 비트열이 유효한 프로그램이 됨. Chris Barker의 zot이 그런 언어 중 하나임
zot에서 영감을 받아 같은 성질을 공유하는 Binary Lambda Calculus의 연접형 버전을 정의했음
[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...- “연접형 언어에는 모든 토큰 시퀀스가 유효한 프로그램이 되는 성질이 있다”는 건 맞지 않아 보임
연접형 언어의 성질은 a와 b가 모두 유효한 프로그램이면 a || b도 유효한 프로그램이라는 것임. 여기서 ||는 “이어붙이기”를 뜻함
하지만 이 성질이 모든 토큰열이 유효하다는 뜻은 아님. 예를 들어 Cat에서[1 2는 문법적으로 유효하지 않음 - “Jot을 모든 알고리즘의 자연스러운 괴델 번호화로 만든다”는 문장이 멋져 보임
Jot도 그 문장도 둘 다 이해할 수 있으면 좋겠음
- “연접형 언어에는 모든 토큰 시퀀스가 유효한 프로그램이 되는 성질이 있다”는 건 맞지 않아 보임
-
각주 5가 재미있었음
⁵ 이 기능은 깔끔한 quine을 가능하게 한다. Perl 프로그램 “Illegal division by zero at /tmp/quine.pl line 1.”을 적절한 위치에 저장하면 “Illegal division by zero at /tmp/quine.pl line 1.”을 출력한다. 이 동작의 이유는 독자에게 연습문제로 남긴다- 이걸 설명하는 블로그 글을 썼음: https://dotat.at/@/2019-04-04-a-curious-perl-quine.html
그리고 겉보기엔 관련 있어 보이지만 실제로는 꽤 다른 Python quine도 있음:
File "quine.py", line 1
File "quine.py", line 1
^
IndentationError: unexpected indent - Perl을 모르는 독자를 도와줄 수 있을까?
REPL에서 시도해 보니"Illegal division"은 패키지"division"에서 메서드"illegal"을 찾지 못하고, 아마 그 부분은 무시되는 듯함."zero"패키지의"by"메서드도 비슷하고,"at /tmp"가 그 오류 메시지를 만드는 가장 단순한 문자열 같음. 이 오류가 누락된 패키지 경고보다 더 심각해서 프로그램을 종료하는 듯함
/가 나눗셈 연산자이고"tmp"가 변수로 초기화된 뒤 정수로 강제 변환되는 건가 싶었지만,"/tmp"만으로는 안 되고"/tmp/"는 정규식 관련 동작을 해서 파서가 왜 거기서 나누는지 모르겠음 - Python에서도 들여쓰기 오류로 비슷한 걸 만들 수 있음
- 이걸 설명하는 블로그 글을 썼음: https://dotat.at/@/2019-04-04-a-curious-perl-quine.html
-
관련 글:
93% of Paint Splatters Are Valid Perl Programs (2019) - https://news.ycombinator.com/item?id=27929730 - 2021년 7월, 댓글 163개
또 다른 링크:
93% of Paint Splatters Are Valid Perl Programs (2019) - https://news.ycombinator.com/item?id=38754686 - 2023년 12월, 댓글 1개 -
농담은 제쳐두고, OCR 소프트웨어가 텍스트가 아닌 이미지에서도 여전히 항상 텍스트 결과를 내는 건 잘못된 게 아닐까?
10년도 더 전에 오래된 책을 OCR했는데, 작은 그림, 얼룩, 먼지에서 나온 쓰레기 텍스트를 처리하느라 매우 짜증났던 기억이 있음. 이 분야는 그 이후로 별 진전이 없어 보임- 그 질문은 원문의 질문과 같은 종류로 보임
무작위 낙서가 Perl에서 유효한 실행이 된다면 뭔가 잘못된 것 아닐까? - 이 부분에서는 LLM이 도움이 됨
직접 실험해 보니 ChatGPT는 꽤 괜찮은 “똑똑하고 문맥을 아는” OCR 에이전트였음 - 진전은 있었음. 다만 소개된 글은 재미를 위한 글임
- 그 질문은 원문의 질문과 같은 종류로 보임
-
이 글은 특정 광학 문자 인식 프로그램이 페인트 튄 자국을 문자로 인식하는 문제를 다루는 것으로 이해했음
그 프로그램은 거의 항상 페인트를 어떤 문자 조합으로 인식하려는 성향이 있어 보이고, 가능한 여러 구현 방식 중 이런 방식은 충분히 환영할 만하며 취지에도 맞음
다만 처음에는 색 조각과 빈 공간을 0과 1로 보고 전체를 프로그램으로 해석하는 식의 다른 방식도 떠올랐음. 그런 경우 대부분은 무의미한 잡음일 것 같음
결국 양극단이 있음. 하나는 거의 잡음뿐이고, 다른 하나는 대부분 의미가 있음. 여기서 게임 속 게임은 페인트 튄 자국에 가능한 한 많은 의미를 부여하되, 그 의미가 규칙이 억지로 의미를 찾아내는 데서가 아니라 구조 자체에서 최대한 나오도록 하는 해석 방식을 찾는 것 같음- “pain을 거의 항상 어떤 문자 조합으로 인식한다”라니, 그럼 뇌파계를 꺼내서 pain도 유효한 Perl 프로그램인지 봐야겠음
-
생성형 AI를 쓰면 실행 가능한 소프트웨어로 평가되는 새롭고 혁신적인 페인트 튄 자국을 그 어느 때보다 빠르게 만들 수 있음
생성형 AI는 새로운 창작자 계층이 텍스트-이미지 작업 흐름을 활용해 모든 규모의 기업에 가치를 만들게 해줌. 새로운 AI 모델은 작동하는 소프트웨어와 기계 판독 가능한 코드를 다양한 고해상도 콘텐츠에 삽입할 수 있고, 시청자의 관심을 끌며 창작자가 관객을 키울 새롭고 흥미로운 방법을 제공함 -
더 최첨단인 계산 연구는 여기 있음: https://sigbovik.org/
-
오래된 “라인 노이즈와 구분할 수 없다” 농담의 영리한 변형임
라인 노이즈를 자주 접하지 않았던 사람을 위해 설명하자면, ASCII 문자 비디오 터미널이 바이트 스트림을 해석해 의미 있는 텍스트를 표시한다고 상상하면 됨. 이제 통신 채널이 어떤 이유로 망가졌다고 해보자. 예를 들어 모뎀이 연결된 동안 누군가 전화 수화기를 들거나, 케이블에 간섭이 생긴 경우임
오류 정정이나 체크섬이 없으면 해석되는 바이트가 사실상 무작위가 됨. 그래서 임의의 글자, 숫자, 구두점, 제어 문자 등이 해석되어 화면에 표시되고, 익숙한 사람은 그게 무작위이며 왜 그런지도 알게 됨. 그런데 농담은 그게 실제로 여전히 유효한 Perl 프로그램이라는 데 있음- 이제 라인 노이즈가 요즘 애들에게 절대 설명할 수 없는 것들, 예컨대 방송 편성표 같은 범주에 들어간다는 걸 깨닫게 됐음
이왕 이렇게 된 거 벨트에 양파나 묶어야겠음
- 이제 라인 노이즈가 요즘 애들에게 절대 설명할 수 없는 것들, 예컨대 방송 편성표 같은 범주에 들어간다는 걸 깨닫게 됐음
-
“소스 코드는 아직 없음. 내가 GitHub을 못해서”라고 했으니 영영 사라진 것 같음
적어도 https://git.mcmillen.dev/explore/repos에는 없음 -
Perl 프로그래머로서, 동작하지 않는 7% 는 버그라고 봄