Skip to content

brainfuck-generator

2026-04-05

brainfuck-generator
맞다. 만들었다. 하찮고 재밌다.
슉랭에 대해 접한지 1-2년쯤 지났다. 설렌다 해놓고 건드리지는 않았다. 삘이 안왔기 때문이다. 그러다가 오늘 왔다.
이번주는 몸이 좋지 않아서 운동도 두 번이나 쨌다. 머리도 잘 안돌았다. 그러다 오늘 괜찮아지면서 갑자기 심심함을 느끼고, 슉랭이 생각난 것이다. 하지만 슉랭만 구현하면 너무 지엽적인 부분만 커버하는 느낌이 들어서, 그냥 brainfuck을 구현한 후, 슉랭과 같은 아류작을 지원하도록 만들기로 했다.

Claude랑 핑퐁하면서 개발을 했다. 순전히 재미를 위해 하는 것이므로, 코드는 내가 짰다. 코드를 짜다가, '.(출력)'이라는 명령을 뒤늦게 알았다. 이걸 알고 나니 갑자기 머리속이 정렬했다. '출력을 매 글자 마다 찍는거면... 앞에꺼 재활용해도 되잖아???' 그렇게 최적화가 한 번 일어났다. 그 전엔 그냥 제곱근과 반복문을 이용해서 + 출력을 줄이는 방법만 적용되어 있었는데 말이다. 이외에도 또다른 최적화가 많을 것 같다. 당장 반복문만 해도 depth를 늘릴 수 있다. 세제곱근을 이용한다던가 하는 것이다. 그리고, 앞 글자로부터의 diff를 구하는 방법 대신, 128부터 시작해도 된다. 128은 2^7이므로, 2^2 * 2^2 * 2^3 => "++++[>++++[>++++++++<-]<-]>>."이다. 손으로 빚어내 보니, 또 묘하게 재미가 있다. 후회되지 않는 뻘짓 목록에 들어갈 것 같다.

아 세제곱근 이야기 해놓고 직접 손으로 쓰고 나니, 구현해보고 싶어졌다. 세제곱근이 의미가 있으려면, 글자수를 기준으로 해야 할 것 같은데, 대충 8부터 놓고 해보자.
8 = "++++++++."(9글자) vs "++[>++-]>++++."(13글자) vs "++[>++[>++<-]<-]>>."(19글자)
27 = "+++++[>+++++<-]>++."(19글자) vs "+++[>+++[>+++<-]<-]>>."(22글자)
64 = "++++++++[>++++++++<-]>."(23글자) vs "++++[>++++[>++++<-]<-]>>."(25글자)
125 = "+++++++++++[>+++++++++++<-]>++++."(33글자) vs "+++++[>+++++[>+++++<-]<-]>>."(28글자)

64부터 슬슬 역전하기 시작했다. 그럼, 영문자부터는 사실상 세제곱을 쓰는 쪽이 유리하다. 근데 굳이 그렇게 영문자니 뭐니 할 필요 없이, 64를 기준으로 해도 된다. 그렇게 해서 방금 글 쓰다가 또 커밋했다. 디코딩 다 깨졌다가 고쳐져서 정상적인 문자열 나오는 순간의 쾌감이 장난 아니다.

이제 진정하고 약먹고 잠이나 자야겠다.