今天 Hacker News 上有个热帖讨论一个 C 程序,一次调用输出的井字棋游戏。 I5 w6 S, B G& a2 [% ~( A. t
6 x3 h* G* [4 W$ j: Y! ~
打开一看,原来是 2020 年 IOCCC 大赛的一个参赛作品:
; M/ r0 O8 P! q7 V" S- #include <stdio.h>
3 r0 B( a, r9 i& K& ]/ n
3 F7 p6 Y3 q6 @. Q0 k3 |- #define N(a) "%"#a"$hhn"
X3 l3 {! `3 e - #define O(a,b) "%10$"#a"d"N(b)6 Y& c4 i8 u7 }5 q. m* R* Z
- #define U "%10$.*37$d"
$ l: K B# A: I- L - #define G(a) "%"#a"$s"
/ q0 P+ {8 c0 d# v% t - #define H(a,b) G(a)G(b)
! K8 U, \" _+ k9 B# ]% P - #define T(a) a a ! z) B% b3 _* `+ q$ \& K4 s& [
- #define s(a) T(a)T(a)% O, P9 T( e a; v% Z* X
- #define A(a) s(a)T(a)a
1 E; X9 |" f6 v: s! T - #define n(a) A(a)a
, d' P% T! L+ o0 l% j - #define D(a) n(a)A(a)
6 V5 y4 z; U S* `- l, [- X4 C - #define C(a) D(a)a
& r! P1 B% o) n; b - #define R C(C(N(12)G(12)))
4 `; Q# W- n& q% _3 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)R7 ] a4 k8 {* u
- #define SS O(78,55)R "\n\033[2J\n%26$s"; o% d* @8 w* A' J4 W
- #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
' @: H+ @, E$ m# B. q( o8 | - #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)% ]2 ?, K* b) F9 J! @8 ?! v5 u8 d$ u
; e* v! _- c3 [! x% Y/ E3 Q- 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(( X3 Y: X+ F/ |1 V8 k0 W$ m8 P3 r% e0 ~
- 45)N(46)N (47)N(48)N( 49)N( 50)N( 51)N(52)N(53 )O( 28,
' Z6 W5 J i: Z! R/ F: {0 k% E# j - 54)O(5, 55) O(2, 56)O(3,57)O( 4,58 )O(13, 73)O(4,5 Q* s4 d, `% S z! ]
- 71 )N( 72)O (20,59 )N(60)N(61)N( 62)N (63)N (64)R R8 e- H. R; ^3 E8 D3 o+ [0 }
- E(1,2, 3,13 )E(4, 5,6,13)E(7,8,9 ,13)E(1,4 ,7,13)E
' I' L' _; e% O0 j+ \. I5 l - (2,5,8, 13)E( 3,6,9,13)E(1,5, 9,13)E(3 ,5,7,13( ~* L8 W' [9 e$ O
- )E(14,15, 16,23) E(17,18,19,23)E( 20, 21, 22,23)E) X& k5 r% r8 w" v4 v
- (14,17,20,23)E(15, 18,21,23)E(16,19, 22 ,23)E( 14, 18,
1 N# @; }' F7 E/ x: b- n; t - 22,23)E(16,18,20, 23)R U O(255 ,38)R G ( 38)O( 255,36)9 P# Z, _$ Z" R- Z* }1 R
- R H(13,23)O(255, 11)R H(11,36) O(254 ,36) R G( 36 ) O(
) s" x# j% X# @6 L7 e* r - 255,36)R S(1,14 )S(2,15)S(3, 16)S(4, 17 )S (5, 18)S(6,4 r. o O, X3 Z+ [9 y) F9 h
- 19)S(7,20)S(8, 21)S(9 ,22)H(13,23 )H(36, 67 )N(11)R
' w2 r7 [9 D" [8 h - G(11)""O(255, 25 )R s(C(G(11) ))n (G( 11) )G(. I! v. W) ?! b! \. ^; a6 C2 L; W
- 11)N(54)R C( "aa") s(A( G(25)))T (G(25))N (69)R o
5 s+ p$ G* J4 G w - (14,1,26)o( 15, 2, 27)o (16,3,28 )o( 17,4, 29)o(18
' c, Y, z2 T% g9 c; \3 n - ,5,30)o(19 ,6,31)o( 20,7,32)o (21,8,33)o (22 ,9,
; I" A0 U% e" H5 W5 u' K - 34)n(C(U) )N( 68)R H( 36,13)G(23) N(11)R C(D( G(11)))
4 W) v, w& W0 \. ^" l- ~ - 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(5 ^, m( s" q( c. o b) G
- 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- Y% w2 _8 ~- K
8 t, M; E+ e t- #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\7 ^& {) I' _$ k/ G" D
- +26,d+28,d+30,d+32,d+34,d+36,d+38,d+40,d+50,(scanf(d+126,d+4),d+(6\
' G- S6 Q& r. b0 p# h: R - -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+\5 I/ J d1 H% Y4 Y, ]0 Y
- 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\; Y6 Z! b4 D6 n- f, `
- ,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+\; I, G( ?5 R) i( n( U, L
- 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,\6 f7 K6 P w7 ^( l
- d+128,d+129
6 A$ W9 K( h Y' n1 A, ~( t - + z; d ]1 X' V
- char d[538] = {1,0,10,0,10};. c0 `& t6 h8 p6 G0 c) d; k
- 0 U* p7 [! o/ |# `0 w& R
- int main() {$ A- p1 h4 L. L
- while(*d) printf(fmt, arg);
2 f6 s2 u+ r8 r; D7 I" y; e( j0 v - }
复制代码
9 P3 m8 |) Z0 I/ l- i截图: 6 [7 p. M4 l( n8 c3 w
2 s& |3 z k+ I7 `3 P. G N
是不是看着发晕?发晕就对了!% u8 K9 G/ _" Q0 T8 p
. V% E, X7 b' Y" u: b2 ~9 P# q
IOCCC 大赛全称:The International Obfuscated C Code Contest,国际 C 语言混乱代码大赛,目的是写出最有创意的最让人难以理解的 C 语言代码,并限制在 4 kb 以内。这项赛事也年头了,2020 年是第 27 次举办。 + \1 E+ A9 W: I1 H! p* H1 T
写这个程序的小哥 Carlini 已经在 GitHub 上解释了程序原理: 1 z6 m" p( u/ w O! N
& x8 O X4 P1 t8 h3 ]2 c
链接: http://github.com/carlini/printf-tac-toe
, p( Y2 M! V1 C/ H Y- V, |5 r' T |