|
今天 Hacker News 上有个热帖讨论一个 C 程序,一次调用输出的井字棋游戏。 # I! }0 V& r9 k9 J7 b e
* C! B9 R. o& U4 f+ }' T8 I, W; e
打开一看,原来是 2020 年 IOCCC 大赛的一个参赛作品:
5 s* H5 Z5 A. P- #include <stdio.h>
4 j0 X6 U" a( F8 y( z. M
; B+ v8 Q' j& t; W3 N4 q: ]- r+ d- #define N(a) "%"#a"$hhn"
& v; l. h6 Q2 i& u0 N - #define O(a,b) "%10$"#a"d"N(b)7 U* N& y. ~. U; I
- #define U "%10$.*37$d"
u+ G/ U D8 Q' V7 d - #define G(a) "%"#a"$s"# ~6 }- Z0 Q: u9 {- f! r& n
- #define H(a,b) G(a)G(b)* {) E# N6 o& j4 Y
- #define T(a) a a
9 P, V# E2 A7 z0 S- n+ k7 R; x. [ - #define s(a) T(a)T(a)2 M- ]- j6 O& ?5 F# k7 Z5 r
- #define A(a) s(a)T(a)a
6 K( t6 K; K# {. R4 b1 |: c - #define n(a) A(a)a
+ s* q; v& Z! u5 m, F( o! g0 i" q6 j - #define D(a) n(a)A(a)* D/ W" T' U) u# V- e/ M: V
- #define C(a) D(a)a
% v* b* i) R: o N3 I- [ - #define R C(C(N(12)G(12)))
. O# X# W: r8 m4 L# \2 @ - #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
) m" u u, r: ~- I6 j; ?) u - #define SS O(78,55)R "\n\033[2J\n%26$s";" H2 r9 m9 N7 C& i6 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( R' X# \6 D, q4 S' B9 F# Z
- #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)
7 Q0 g) d7 L, [/ k q5 x - $ ~1 ]6 e x$ \7 L4 Z
- 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(7 D2 e2 U$ {+ l5 U) l
- 45)N(46)N (47)N(48)N( 49)N( 50)N( 51)N(52)N(53 )O( 28,
1 m! K% E$ A. u$ J2 \( z! O - 54)O(5, 55) O(2, 56)O(3,57)O( 4,58 )O(13, 73)O(4,0 V4 s3 J- r' [: A( y
- 71 )N( 72)O (20,59 )N(60)N(61)N( 62)N (63)N (64)R R
5 i; `/ S. a/ ]) [. m( @% m - E(1,2, 3,13 )E(4, 5,6,13)E(7,8,9 ,13)E(1,4 ,7,13)E% y5 S/ S! U, D1 b
- (2,5,8, 13)E( 3,6,9,13)E(1,5, 9,13)E(3 ,5,7,13
. x1 B/ P' H1 v, v - )E(14,15, 16,23) E(17,18,19,23)E( 20, 21, 22,23)E
/ p: [0 Q( `$ [ - (14,17,20,23)E(15, 18,21,23)E(16,19, 22 ,23)E( 14, 18,4 Y: l! u/ v9 U' Y, `
- 22,23)E(16,18,20, 23)R U O(255 ,38)R G ( 38)O( 255,36)
/ r0 n5 g' x; I0 v - R H(13,23)O(255, 11)R H(11,36) O(254 ,36) R G( 36 ) O(
0 I2 [ _" g. I( D" j8 V - 255,36)R S(1,14 )S(2,15)S(3, 16)S(4, 17 )S (5, 18)S(6,
. q" U$ x2 k: c2 H2 H- k4 l, G - 19)S(7,20)S(8, 21)S(9 ,22)H(13,23 )H(36, 67 )N(11)R& a9 o5 h p" f2 R8 C1 o# x% ?
- G(11)""O(255, 25 )R s(C(G(11) ))n (G( 11) )G(
0 G- y+ v, g. U: i; F - 11)N(54)R C( "aa") s(A( G(25)))T (G(25))N (69)R o! C5 N2 v5 k4 ~% @
- (14,1,26)o( 15, 2, 27)o (16,3,28 )o( 17,4, 29)o(18
$ S! B( K2 x) |' N - ,5,30)o(19 ,6,31)o( 20,7,32)o (21,8,33)o (22 ,9,/ m% W. W4 f; s! p# K
- 34)n(C(U) )N( 68)R H( 36,13)G(23) N(11)R C(D( G(11)))4 I2 y7 ^2 ^6 X+ w5 r+ o
- 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(4 o& N9 J Q! p* q
- 11))A(G(11))C(H(36,36)G(36))s(G(36))O(32,58)R C(D(G(36)))A(G(36))SS( Z( M \9 e4 H
- - l6 \3 j {4 ]/ ^, Q4 ]$ E# S
- #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\
+ k2 ?) B) z4 s `: w - +26,d+28,d+30,d+32,d+34,d+36,d+38,d+40,d+50,(scanf(d+126,d+4),d+(6\! F) A2 I' e% b- G1 U
- -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+\) e. g8 T( X2 T4 Z3 R* _ V
- 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\/ n$ j6 S$ f& f8 O
- ,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+\, _% }' y: C' A2 J: a
- 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,\. Q& z; {; i& M1 V& G
- d+128,d+129
2 p* L6 Z5 \) s
& _0 a6 n- s5 E/ y1 k- char d[538] = {1,0,10,0,10};! ]3 \! W I) t1 i2 @: P4 m H/ R
- % R8 v2 O2 P2 }- Y' l' E$ ]
- int main() {
; d; n- ~' b& e - while(*d) printf(fmt, arg);8 F' S7 \3 G# f
- }
复制代码 , a$ B N4 f9 L% \
截图:
2 f: a& Z: @6 ?4 C
4 C! B' G. W4 V) N4 K
是不是看着发晕?发晕就对了!# W$ D: L2 `1 X! d7 h9 B
" K% T( f2 D, |( E* x
IOCCC 大赛全称:The International Obfuscated C Code Contest,国际 C 语言混乱代码大赛,目的是写出最有创意的最让人难以理解的 C 语言代码,并限制在 4 kb 以内。这项赛事也年头了,2020 年是第 27 次举办。
) y4 S$ q( I$ I& e1 r8 ?" `
写这个程序的小哥 Carlini 已经在 GitHub 上解释了程序原理:
. v6 z4 q8 Y! j- S6 }
9 o* C- m4 {: ? B7 S
链接: http://github.com/carlini/printf-tac-toe
: ~! d" V& d, [4 J4 @9 T |