今天 Hacker News 上有个热帖讨论一个 C 程序,一次调用输出的井字棋游戏。 & i7 ^6 K- _1 [ p/ r
4 }5 f6 }% W+ n6 w4 j) {
打开一看,原来是 2020 年 IOCCC 大赛的一个参赛作品: - ; |8 {! _: f7 F
- #include <stdio.h>! T: V8 C/ p P' o& d- i1 G
- , Z2 w3 [5 W& h: u3 X y
- #define N(a) "%"#a"$hhn"+ q! [: S0 d- ~- h5 ]: T
- #define O(a,b) "%10$"#a"d"N(b)9 M1 C$ G8 \6 x: _
- #define U "%10$.*37$d"; `4 a# M" j, r$ E3 u! y
- #define G(a) "%"#a"$s"
# F F8 O, _. B& r8 s - #define H(a,b) G(a)G(b)0 }5 i3 b4 @* Q; a
- #define T(a) a a
& I" s2 x+ @/ t* M7 e+ T3 s - #define s(a) T(a)T(a)
. `; c0 @: E! T - #define A(a) s(a)T(a)a
8 b3 @1 c# q6 |5 W& \6 h" ^/ F - #define n(a) A(a)a
0 l9 w6 [" j* R - #define D(a) n(a)A(a)% ^# n' O$ b% [ m Z+ J
- #define C(a) D(a)a
" \: c& i# d8 l% Z' P* i - #define R C(C(N(12)G(12)))# C& M: y6 Q- Z. @; q) J( n
- #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
! o+ \8 m+ J: n2 X: O2 B - #define SS O(78,55)R "\n\033[2J\n%26$s";9 h: X# U. S4 K- q" p
- #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)R3 f3 F& Y. L' R# A- H
- #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)8 s" q' W3 i! R0 {. ^' T7 P9 r" Q
- + a9 y; h) U& A5 N" ]4 `7 C9 x
- 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(
& l1 Z# c% [2 Y; J9 C3 e - 45)N(46)N (47)N(48)N( 49)N( 50)N( 51)N(52)N(53 )O( 28,
/ g; e! z( y9 A9 Q X - 54)O(5, 55) O(2, 56)O(3,57)O( 4,58 )O(13, 73)O(4,% r: J. H& [4 s) K/ Q
- 71 )N( 72)O (20,59 )N(60)N(61)N( 62)N (63)N (64)R R1 Z6 ]$ K2 g' d y5 b5 M
- E(1,2, 3,13 )E(4, 5,6,13)E(7,8,9 ,13)E(1,4 ,7,13)E' V) Z" V3 v; `) M6 ` M
- (2,5,8, 13)E( 3,6,9,13)E(1,5, 9,13)E(3 ,5,7,13+ a8 O" r) I) H9 l% y
- )E(14,15, 16,23) E(17,18,19,23)E( 20, 21, 22,23)E5 h% J& R& M1 Y; }
- (14,17,20,23)E(15, 18,21,23)E(16,19, 22 ,23)E( 14, 18,
7 r$ f- O' z8 M) P% ] - 22,23)E(16,18,20, 23)R U O(255 ,38)R G ( 38)O( 255,36)$ e7 J4 q1 Y1 h+ g& C
- R H(13,23)O(255, 11)R H(11,36) O(254 ,36) R G( 36 ) O(( ?8 @$ T, W) c& ?: b8 t$ ^
- 255,36)R S(1,14 )S(2,15)S(3, 16)S(4, 17 )S (5, 18)S(6,
- [9 P4 Y$ j' j6 t. y" Q - 19)S(7,20)S(8, 21)S(9 ,22)H(13,23 )H(36, 67 )N(11)R
8 \( Q, S+ H1 x# t/ e! | - G(11)""O(255, 25 )R s(C(G(11) ))n (G( 11) )G(
' I8 _3 }% f) W" A' Q3 R1 o - 11)N(54)R C( "aa") s(A( G(25)))T (G(25))N (69)R o
& `6 a) Z* T+ _: j - (14,1,26)o( 15, 2, 27)o (16,3,28 )o( 17,4, 29)o(18 \' L3 D1 J2 f6 H- E+ j* z9 d
- ,5,30)o(19 ,6,31)o( 20,7,32)o (21,8,33)o (22 ,9,/ U Z6 d, a9 H. R
- 34)n(C(U) )N( 68)R H( 36,13)G(23) N(11)R C(D( G(11)))3 s+ \4 z* z# ?/ f/ u
- 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( z, E' L) D* v1 t+ _* S
- 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% D8 j( y% ]9 z, Q
& y- g% l) A! O& {5 J$ w- #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\% t# d6 _" i, }: P7 q' x' L$ Z3 k
- +26,d+28,d+30,d+32,d+34,d+36,d+38,d+40,d+50,(scanf(d+126,d+4),d+(6\% W+ k6 I% \% A. z- s+ G4 ?: E
- -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+\' w& }- D/ A+ g3 l1 C
- 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\$ b) p1 f3 g, m) J& U7 v$ \
- ,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+\
+ P1 d* Q+ j6 {/ e/ ~# c$ T - 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,\4 j1 d5 S4 ~7 P3 i M0 |
- d+128,d+1290 W y9 j$ c' f
# k) X' Y9 E$ |. D% V/ F8 n- char d[538] = {1,0,10,0,10};. r4 q( O- P4 Z1 w
- ! l% @- L2 @; t( H- \; k
- int main() {& l5 O& i' s) u' d2 R
- while(*d) printf(fmt, arg);1 ?/ q5 M% m* _( I: b# _# x( k7 ~
- }
复制代码 1 |5 X ?$ }: `' D3 \
截图: ' }" F8 v* N. I2 T1 c3 g
9 \5 C1 w. y: A( s" u3 m2 Q) [ 是不是看着发晕?发晕就对了!; F/ M" B0 i& D! i! S n+ w4 X( G6 u
. x; H4 l m! q5 i+ `0 t
IOCCC 大赛全称:The International Obfuscated C Code Contest,国际 C 语言混乱代码大赛,目的是写出最有创意的最让人难以理解的 C 语言代码,并限制在 4 kb 以内。这项赛事也年头了,2020 年是第 27 次举办。
% U% S1 ~6 u9 x6 G1 O- D
写这个程序的小哥 Carlini 已经在 GitHub 上解释了程序原理: ) A9 d- e3 B4 E3 B8 g
0 u0 X O8 W4 i! P
链接: http://github.com/carlini/printf-tac-toe + }5 f! q# y& L% B1 L
|