"정규식으로 체스를 둔다"는 황당한 발상
니콜라스 칼리니(Nicholas Carlini)라는 분이 정말 기이한 프로젝트를 공개했어요. 이름하여 Regex Chess. 정규식(regular expression) 84,688개만으로 체스 엔진을 만든 거예요. 그것도 그냥 말을 움직이는 정도가 아니라, 2수 앞을 내다보는 미니맥스(minimax) 탐색까지 하는 진짜 체스 AI예요.
잠깐, 정규식이 뭔지부터 짚고 갈게요. 정규식은 보통 문자열에서 패턴을 찾을 때 쓰는 도구예요. 예를 들어 \d{3}-\d{4} 같은 식으로 "숫자 3개-숫자 4개" 패턴을 찾아내는 거죠. 이메일 검증할 때나 로그 파싱할 때 많이들 써보셨을 거예요. 그런데 이걸로 체스 엔진을 만든다? 이건 마치 "드라이버 하나로 자동차를 만들었다"는 수준의 황당한 발상이에요.
어떻게 동작하는 걸까
핵심 트릭은 체스 상태를 문자열로 표현한 다음, 정규식의 치환(substitution) 기능을 반복적으로 적용하는 것이에요. 체스판 위 말들의 위치를 한 줄의 텍스트로 인코딩하고, 그 텍스트에 "이런 패턴이 보이면 이렇게 바꿔라"는 규칙을 정규식으로 잔뜩 만들어 두는 거죠.
예를 들어 폰이 한 칸 앞으로 가는 동작을 표현한다면, 폰이 있는 위치 패턴을 찾아서 다음 위치로 이동시키는 정규식을 적용해요. 가능한 모든 이동 규칙, 캐슬링, 앙파상, 프로모션 같은 체스의 모든 규칙을 정규식으로 표현해야 하니까 그 수가 8만 개를 넘어가게 된 거예요. 거기에 "내가 이렇게 두면 상대는 이렇게 둘 것이다"라는 2수 탐색 로직까지 정규식으로 짜넣은 거고요.
원리적으로 보면, 이건 정규식 치환을 통해 튜링 머신에 가까운 계산을 흉내내는 작업이에요. sed나 perl 같은 도구로 무한 루프 돌리듯 정규식을 계속 적용하다 보면, 사실상 어떤 계산이든 시뮬레이션할 수 있다는 이론적 사실을 실전으로 보여준 셈이에요.
미니맥스가 뭐고 왜 2수냐
미니맥스라는 알고리즘은 체스나 바둑 같은 2인용 게임 AI의 가장 기본 골격이에요. 내 차례에는 가장 좋은 수를 고르고, 상대 차례에는 상대가 가장 좋은 수(=내게 가장 나쁜 수)를 둘 것이라고 가정하면서 미래를 시뮬레이션하는 방식이에요. "최대(max)와 최소(min)를 번갈아 본다"고 해서 미니맥스인 거죠.
2수 앞을 본다는 건 "내가 두고, 상대가 받아치는 것까지"만 시뮬레이션한다는 뜻이에요. 진짜 강한 체스 엔진인 스톡피시(Stockfish) 같은 건 20수, 30수까지도 내다봐요. 그러니까 Regex Chess는 실력으로 보면 입문자 수준이에요. 그런데 핵심은 "세지 않아서 약하다"가 아니라 "정규식이라는 가장 어울리지 않는 도구로 이걸 해냈다"는 점이에요.
왜 이런 짓을 하는 걸까
이 프로젝트에는 명확한 실용적 가치가 있는 건 아니에요. 정규식으로 만든 체스 엔진이 빨리 돌지도 않고, 강하지도 않거든요. 그럼 왜 하느냐? 두 가지로 읽을 수 있어요.
첫째는 계산의 본질에 대한 탐구예요. 컴퓨터과학에는 "이 시스템이 얼마나 강력한가"를 따지는 오랜 전통이 있어요. CSS만으로 게임을 만든다든가, Conway's Game of Life 안에서 또 다른 Game of Life를 돌린다든가, SQL로 레이트레이서를 짠다든가 하는 프로젝트들이 모두 같은 맥락이에요. "이 도구가 사실은 우리가 생각한 것보다 훨씬 강력한 계산 능력을 갖고 있다"는 걸 보여주는 거죠. Regex Chess는 정규식이 단순한 패턴 매칭 도구가 아니라 사실상 일반 목적 계산이 가능한 시스템이라는 걸 극단적으로 증명한 사례예요.
둘째는 순수한 재미와 도전이에요. "왜 에베레스트를 오르냐, 거기 있으니까" 같은 거죠. 칼리니는 평소에도 AI 보안과 머신러닝 분야에서 활발히 활동하는 연구자인데, 가끔 이런 기이한 사이드 프로젝트를 공개해요. 이 분의 다른 작업으로 "GPT-4로 GPT-2를 재구현하기" 같은 것도 있어요.
비슷한 계열의 프로젝트들
정규식을 극한까지 밀어붙인 작업은 이전에도 있었어요. regex 기반 소수 판별기가 대표적이에요. 숫자를 1로 변환한 다음 ^1?$|^(11+?)\1+$ 같은 짧은 정규식 하나로 소수인지 아닌지 판별하는 거예요. 또 "정규식으로 Brainfuck 인터프리터 만들기" 같은 프로젝트도 있고요. 더 넓게 보면 esoteric programming(난해한 프로그래밍) 이라는 장르가 있어요. 일부러 비효율적이고 이상한 방식으로 프로그래밍 문제를 푸는 걸 즐기는 커뮤니티예요.
한국 개발자에게 주는 시사점
실무에서 "정규식으로 체스 엔진 만들자"는 일은 절대 없겠죠. 그런데 이 프로젝트가 우리에게 알려주는 두 가지가 있어요.
하나는 정규식의 한계와 가능성을 다시 보게 된다는 점이에요. 사실 백엔드 개발하다 보면 정규식이 복잡해지는 순간 "이건 파서를 따로 만드는 게 낫겠다"는 판단을 해야 하잖아요. 정규식의 진짜 표현력이 어디까지인지 감을 잡아두면, 그 경계를 더 잘 판단할 수 있어요. "정규식으로 이렇게까지 할 수 있구나, 그런데 보다시피 84,688개가 필요하구나"라는 양쪽 교훈을 동시에 얻는 거죠.
다른 하나는 사이드 프로젝트의 가치에 대한 생각이에요. 당장 돈이 되거나 이력서에 한 줄 더 쓸 수 있는 프로젝트만 하는 것도 좋지만, 가끔은 이렇게 "왜 하는지 설명하기 힘든" 프로젝트를 해보는 게 개발자로서의 시야를 넓혀줘요. 알고리즘에 대한 직관, 도구의 본질에 대한 이해 같은 게 이런 데서 자라거든요.
마무리
정규식 84,688개로 체스를 두는 엔진. 실용성은 0이지만 발상의 자유로움은 만점이에요. 여러분은 "실용성 없는데 너무 멋진" 사이드 프로젝트로 어떤 걸 해보고 싶으신가요?
🔗 출처: Hacker News
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공