# 1988년 국제 난독화 C 코드 대회 우승작, Xmas.c

> Clean Markdown view of GeekNews topic #12498. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=12498](https://news.hada.io/topic?id=12498)
- GeekNews Markdown: [https://news.hada.io/topic/12498.md](https://news.hada.io/topic/12498.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2023-12-24T09:49:04+09:00
- Updated: 2023-12-24T09:49:04+09:00
- Original source: [udel.edu](https://udel.edu/~mm/xmas/)
- Points: 3
- Comments: 1

## Topic Body

### xmas.c 코드 분석

- 1988년에 만들어진 xmas.c라는 C 코드는 국제 난독화 C 코드 대회에서 우승함.
- 이 코드는 출력물보다 작은 크기로, 텍스트 압축 표준에 새로운 방향을 제시함.
- 코드를 컴파일하고 실행하면 파라미터 없이 작동하며, 재미있게도 타자기 키를 무작위로 두드린 것처럼 보임.

### 코드의 출력

- 코드를 실행하면 "크리스마스의 열두 날" 노래 가사가 출력됨.
- 출력 내용은 크리스마스 첫째 날부터 열두째 날까지의 선물을 나열한 가사임.

### 분석

- 코드를 이해하기 위해서는 더 읽기 쉬운 형태로 재작성해야 함.
- 재작성 과정에서 특정 문자열을 사용하여 치환 암호를 해독하는 방식이 드러남.
- 변수 `t`는 재귀의 방향을 제어하는 데 중요한 역할을 함.
- 코드는 재귀를 통해 치환 암호를 해독하고, 크리스마스 노래 가사를 출력함.

### 간소화

- 프로그램을 이해하고 나면, 일부 반복문과 C 문자열 라이브러리 함수를 사용하여 코드를 간소화할 수 있음.
- 최종적으로 코드를 간소화하면 단순히 가사를 출력하는 것으로 축소될 수 있음.

### GN⁺의 의견

- **창의성의 극치**: xmas.c 코드는 치환 암호와 재귀를 사용하여 난독화된 코드를 작성한 훌륭한 예시임. 이는 프로그래밍에서 창의성이 어떻게 표현될 수 있는지 보여줌.
- **교육적 가치**: 코드를 분석하고 이해하는 과정은 초급 소프트웨어 엔지니어에게 프로그래밍 기술을 향상시키는 좋은 연습이 될 수 있음.
- **재미와 흥미**: 이 코드는 프로그래밍의 재미를 발견하고, 복잡한 문제를 해결하는 즐거움을 경험할 수 있는 기회를 제공함.

## Comments



### Comment 21686

- Author: neo
- Created: 2023-12-24T09:49:05+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=38745668) 
- TeX 세계의 유사한 예로 `xii.tex`가 있음:
  - TeX 문서에 복잡해 보이는 코드를 넣고 `pdftex`을 실행하면, 예상과 다른 결과를 얻을 수 있음. 이는 [shreevatsa.net](https://shreevatsa.net/post/xii/)에서 확인 가능.

- 이 코드는 콜모고로프 복잡성을 생각나게 함:
  - 이해하기 어려운 코드가 원하는 결과를 만들어내는 것을 보고, 더 짧으면서도 같은 결과를 내는 프로그램이 있을지, 그리고 그것을 어떻게 찾을지에 대한 호기심을 자극함.

- 원래 발행됐을 때 이 코드를 받았지만, 파일 이름이 다름:
  - "carol.c"라는 이름으로 저장되어 있었고, 최신 시스템에서 컴파일 및 실행해보니 컴파일러에서 경고 메시지가 출력됨.

- IOCCC(International Obfuscated C Code Contest)가 2023년에도 여전히 활발함:
  - IOCCC에 대한 설명이 훌륭하며, [www.ioccc.org](https://www.ioccc.org/years.html)에서 확인할 수 있음.

- 경고를 끄면 최신 코드 저장소(trunk)에서도 작동함:
  - [compiler-explorer.com](https://compiler-explorer.com/z/hGvs1e9jo)에서 해당 코드의 작동 여부를 확인할 수 있음.

- Rosetta Code에도 비슷한 작업이 있음:
  - "Old Lady Swallowed a Fly"라는 점점 길어지는 노래를 반복적으로 생성하는 프로그램 예제가 있음. [rosettacode.org](https://rosettacode.org/wiki/Old_lady_swallowed_a_fly)에서 확인 가능.

- 대학교 마지막 학기에 교수님이 이 코드 조각을 강의 시작 부분에서 보여준 좋은 기억이 있음:
  - 2022년 당시 교수님의 강의에서 이 코드를 처음 접한 경험을 회상함.

- 대학 시절 C 언어에 대한 인쇄된 학습 자료에 이 코드가 있어서, 한 번 직접 타이핑해본 기억이 있음:
  - C 언어를 배울 때 실제로 이 코드를 직접 입력해봄으로써 기억에 남는 경험을 함.

- 이 코드는 매우 오래된 버전의 C 언어를 사용함:
  - main 함수의 시그니처가 오래된 K&R 스타일을 사용하고 있어서, 현재는 컴파일되지 않을 것이라는 의견을 제시함.

- IOCCC에서 래리 월이 두 번이나 우승한 것과 그가 Perl을 설계한 것 사이의 연관성이 흥미로운 점 중 하나임:
  - Perl의 설계자가 IOCCC에서 수상한 이력이 Perl 언어의 특징을 설명해주는 듯한 인상을 줌.
