Cプリプロセッサの最悪な悪用
xxxxxxxxxx
#define DIT (
#define DAH )
#define __DAH ++
#define DITDAH *
#define DAHDIT for
#define DIT_DAH malloc
#define DAH_DIT gets
#define _DAHDIT char
_DAHDIT _DAH_[]="ETIANMSURWDKGOHVFaLaPJBXCYZQb54a3d2f16g7c8a90l?e'b.s;i,d:"
;main DIT DAH{_DAHDIT
DITDAH _DIT,DITDAH DAH_,DITDAH DIT_,
DITDAH _DIT_,DITDAH DIT_DAH DIT
DAH,DITDAH DAH_DIT DIT DAH;DAHDIT
DIT _DIT=DIT_DAH DIT 81 DAH,DIT_=_DIT
__DAH;_DIT==DAH_DIT DIT _DIT DAH;__DIT
DIT'\n'DAH DAH DAHDIT DIT DAH_=_DIT;DITDAH
DAH_;__DIT DIT DITDAH
_DIT_?_DAH DIT DITDAH DIT_ DAH:'?'DAH,__DIT
DIT' 'DAH,DAH_ __DAH DAH DAHDIT DIT
DITDAH DIT_=2,_DIT_=_DAH_; DITDAH _DIT_&&DIT
DITDAH _DIT_!=DIT DITDAH DAH_>='a'? DITDAH
DAH_&223:DITDAH DAH_ DAH DAH; DIT
DITDAH DIT_ DAH __DAH,_DIT_ __DAH DAH
DITDAH DIT_+= DIT DITDAH _DIT_>='a'? DITDAH _DIT_-'a':0
DAH;}_DAH DIT DIT_ DAH{ __DIT DIT
DIT_>3?_DAH DIT DIT_>>1 DAH:'\0'DAH;return
DIT_&1?'-':'.';}__DIT DIT DIT_ DAH _DAHDIT
DIT_;{DIT void DAH write DIT 1,&DIT_,1 DAH;}
引用元:https://www.ioccc.org/1986/hague/hague.c
審査員・作者による説明:https://www.ioccc.org/1986/hague/hint.html
モールス符号変換。
$ gcc -o hague hague.c
$ echo SOS | ./hague
... --- ...
$ echo "Hello, world" | ./hague
.... . .-.. .-.. --- --..-- ? .-- --- .-. .-.. -..
モールス信号のトン(Dit)とツー(Dah)に合わせて、識別子はDIT
やDAH
などで構成されている。挙動と難読化の主題があっている。
プログラムはタブで3カラムに区切られていて、各断片が含むDIT
やDAH
の列はアルファベットのモールス信号として解釈できる。hint.textにもプログラムにモールスメッセージが仕込まれていることを匂わす文があるが(”Now for extra credit, what morse message does the program spell out?”)、意味がわからなかった。復号したものを書いておくので誰かわかる人おしえてほしい。
E
T
T
A
N
A
N
N
K
E G
A U C
A U R
K D G
V E D
C I N
W D X
N E A
R A P
J G E
A U L
L W A
K O E
A P M
R F R
Z T I
A E W
S P
F A