今天 Hacker News 上有个热帖讨论一个 C 程序,一次调用输出的井字棋游戏。 - f5 H! l& I- r" J5 P4 v
+ k3 j5 `2 N r# X/ l. `
打开一看,原来是 2020 年 IOCCC 大赛的一个参赛作品:
. S6 \9 L, i1 M1 T( l9 r2 r% P! ^- #include <stdio.h>, S! L5 q; k% u7 r4 J1 c: @
- & ~, d( k) k+ V& a9 C( w5 d# H# j
- #define N(a) "%"#a"$hhn"
% d7 w$ Q6 I% W( A3 } - #define O(a,b) "%10$"#a"d"N(b). C1 l4 U7 W9 l; T4 X1 n! e: R( g
- #define U "%10$.*37$d"- M' O: B% R% S/ |9 W+ I
- #define G(a) "%"#a"$s": |) m; H8 D( X! s/ H
- #define H(a,b) G(a)G(b)" Y5 @$ ]+ n5 Y7 ~) D& }. x7 W2 T9 M
- #define T(a) a a 6 [8 ~3 `. ~0 S
- #define s(a) T(a)T(a)9 ^$ l! Y5 h# r5 v
- #define A(a) s(a)T(a)a
. o+ }+ G1 Y/ h5 N. ~ - #define n(a) A(a)a
4 y6 W% U/ t% S$ I, ]! T- [' U9 E - #define D(a) n(a)A(a)
5 F3 A5 S8 \- k( p& ] - #define C(a) D(a)a
3 @9 E6 @7 e: Y' Z) D4 }2 U) w, L0 } - #define R C(C(N(12)G(12)))% `4 I3 v5 U7 r) U2 M
- #define o(a,b,c) C(H(a,a))D(G(a))C(H(b,b)G(b))n(G(b))O(32,c)R* C0 p+ t4 [( T. m
- #define SS O(78,55)R "\n\033[2J\n%26$s";. u. g: B" }5 J8 ]9 j
- #define E(a,b,c,d) H(a,b)G(c)O(253,11)R G(11)O(255,11)R H(11,d)N(d)O(253,35)R }- T2 i% v6 h$ u
- #define S(a,b) O(254,11)H(a,b)N(68)R G(68)O(255,68)N(12)H(12,68)G(67)N(67). i) F+ ~ @ m0 ] r" k
1 o* E/ m! G' W* ?- x# m- char* fmt = O(10,39)N(40)N(41)N(42)N(43)N(66)N(69)N(24)O(22,65)O(5,70)O(8,44)N(+ Y9 ?# f6 U5 w. j- Z
- 45)N(46)N (47)N(48)N( 49)N( 50)N( 51)N(52)N(53 )O( 28,
# `) P3 L$ ?+ Y4 f5 H1 v( b - 54)O(5, 55) O(2, 56)O(3,57)O( 4,58 )O(13, 73)O(4,
Z3 _# {% |3 Q, c - 71 )N( 72)O (20,59 )N(60)N(61)N( 62)N (63)N (64)R R
, Q! s$ A4 ?6 E! }8 y# {' [ - E(1,2, 3,13 )E(4, 5,6,13)E(7,8,9 ,13)E(1,4 ,7,13)E
6 R/ \$ E+ u+ d - (2,5,8, 13)E( 3,6,9,13)E(1,5, 9,13)E(3 ,5,7,13* Y' O* `4 a' k' m) J/ v5 Y' s
- )E(14,15, 16,23) E(17,18,19,23)E( 20, 21, 22,23)E
; H7 M, W# `) f- h - (14,17,20,23)E(15, 18,21,23)E(16,19, 22 ,23)E( 14, 18,$ j) X* x: C1 Q3 @" V
- 22,23)E(16,18,20, 23)R U O(255 ,38)R G ( 38)O( 255,36)3 A, r0 W* N: K
- R H(13,23)O(255, 11)R H(11,36) O(254 ,36) R G( 36 ) O( B% T# u' o: P+ d# L# S3 V
- 255,36)R S(1,14 )S(2,15)S(3, 16)S(4, 17 )S (5, 18)S(6,+ K* S _7 }0 h+ e6 c
- 19)S(7,20)S(8, 21)S(9 ,22)H(13,23 )H(36, 67 )N(11)R; { S0 [9 W9 c3 y
- G(11)""O(255, 25 )R s(C(G(11) ))n (G( 11) )G(# j" l8 Z+ e, {) q; Y6 o2 u
- 11)N(54)R C( "aa") s(A( G(25)))T (G(25))N (69)R o
! B7 e* ?* b; p! g s" ^4 q - (14,1,26)o( 15, 2, 27)o (16,3,28 )o( 17,4, 29)o(18
4 { j) F# g6 n* D - ,5,30)o(19 ,6,31)o( 20,7,32)o (21,8,33)o (22 ,9,7 d6 R! Q. r% F2 q# ^$ G: v6 q
- 34)n(C(U) )N( 68)R H( 36,13)G(23) N(11)R C(D( G(11)))
' L" [$ W- m. X/ x - D(G(11))G(68)N(68)R G(68)O(49,35)R H(13,23)G(67)N(11)R C(H(11,11)G(
. F# B! O2 K3 T1 P- z( R" w; X - 11))A(G(11))C(H(36,36)G(36))s(G(36))O(32,58)R C(D(G(36)))A(G(36))SS6 l' @6 U7 w* b: ?7 h: R
- 7 I; d" [0 p5 D- q, x6 Z, d& `& Y
- #define arg d+6,d+8,d+10,d+12,d+14,d+16,d+18,d+20,d+22,0,d+46,d+52,d+48,d+24,d\
, a1 ^( w! u( V1 V1 [, S - +26,d+28,d+30,d+32,d+34,d+36,d+38,d+40,d+50,(scanf(d+126,d+4),d+(6\" B) U+ T0 R- h- O
- -2)+18*(1-d[2]%2)+d[4]*2),d,d+66,d+68,d+70, d+78,d+80,d+82,d+90,d+\/ `6 J7 z' R, u5 E: N- H
- 92,d+94,d+97,d+54,d[2],d+2,d+71,d+77,d+83,d+89,d+95,d+72,d+73,d+74\ C- u2 Z9 E" ]
- ,d+75,d+76,d+84,d+85,d+86,d+87,d+88,d+100,d+101,d+96,d+102,d+99,d+\7 H8 G, b& s+ d+ k; r
- 67,d+69,d+79,d+81,d+91,d+93,d+98,d+103,d+58,d+60,d+98,d+126,d+127,\
- s; d* X$ p8 h* t! A. }5 k - d+128,d+129" `& K2 X# u- Y. n$ }4 A9 g
- & x2 x! a/ g+ W& _( W
- char d[538] = {1,0,10,0,10};# l- a: Q' }& P8 e& g
. u6 r4 ?7 z; { H- int main() {
G+ X4 T5 x# S: ?8 p f" i - while(*d) printf(fmt, arg);
: Z4 [- ~. }1 `5 \+ ^! }! c - }
复制代码 - Y) T' X1 G, C
截图: & [$ x* e! O* e( A% I7 F& d
7 `9 C. p7 z$ G7 ~* E ^/ F 是不是看着发晕?发晕就对了!
& s0 }% U3 R9 q I
( V3 g( }% O% ]+ S" @* g' X
IOCCC 大赛全称:The International Obfuscated C Code Contest,国际 C 语言混乱代码大赛,目的是写出最有创意的最让人难以理解的 C 语言代码,并限制在 4 kb 以内。这项赛事也年头了,2020 年是第 27 次举办。
) h0 d9 _3 b9 X& y
写这个程序的小哥 Carlini 已经在 GitHub 上解释了程序原理: 6 Y" {) X8 K" p
/ Z/ W- p/ E" O9 F: S1 ~+ q
链接: http://github.com/carlini/printf-tac-toe
1 O& A9 _; ?, F" x( a O" @ |