|
今天 Hacker News 上有个热帖讨论一个 C 程序,一次调用输出的井字棋游戏。 ; R% c- s3 x, X4 c8 Y* d
, f5 [9 j% F/ f8 t5 J7 k) b
打开一看,原来是 2020 年 IOCCC 大赛的一个参赛作品:
5 Q0 H& z: O& D* Z5 `6 Q! {- #include <stdio.h>
8 W/ ]/ V6 u* O/ D% M6 @
- A+ x4 ~, J$ S/ I8 {- #define N(a) "%"#a"$hhn"" Z/ X: e. r% T+ l5 b3 G5 i
- #define O(a,b) "%10$"#a"d"N(b)
/ Q. M: q! i, J# _9 d1 P2 h. O$ Q - #define U "%10$.*37$d"0 O8 `: N( u5 ~5 T- U: V3 o
- #define G(a) "%"#a"$s"
L. Z# _5 F; c8 Z - #define H(a,b) G(a)G(b)5 B0 ?/ y! `" x# l
- #define T(a) a a + Z; ?3 L6 P+ q( w' M$ V- V0 l
- #define s(a) T(a)T(a); e# S" A9 v9 y; r/ d$ L- W
- #define A(a) s(a)T(a)a8 M1 V; {- P p4 o* ]
- #define n(a) A(a)a
. T8 C5 e# L# q) l* r- d/ N - #define D(a) n(a)A(a)
6 V; h2 T0 ?) i X - #define C(a) D(a)a5 c) {- S; a6 V3 O# ^0 A3 q
- #define R C(C(N(12)G(12)))
$ H! G# L3 m7 Z4 s( H" O - #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
5 Y. e# w/ t A: A5 U - #define SS O(78,55)R "\n\033[2J\n%26$s";
; Y, d+ E1 a0 } R - #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% ~1 L6 k* I3 W! \# o
- #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)
# b& z c$ i) k/ S N7 @/ ^, l
9 o5 l0 g; a4 p% Y# w6 Q f- 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(
- y0 w$ c( M9 i# x5 X! W: E/ | - 45)N(46)N (47)N(48)N( 49)N( 50)N( 51)N(52)N(53 )O( 28,7 @# ~, {1 Q+ w7 F3 H/ C
- 54)O(5, 55) O(2, 56)O(3,57)O( 4,58 )O(13, 73)O(4,9 b/ f, L8 L$ M* i/ a
- 71 )N( 72)O (20,59 )N(60)N(61)N( 62)N (63)N (64)R R
( o/ Z; a2 E7 A }& t8 W - E(1,2, 3,13 )E(4, 5,6,13)E(7,8,9 ,13)E(1,4 ,7,13)E1 K; N+ D- T( H1 C6 l! \ N
- (2,5,8, 13)E( 3,6,9,13)E(1,5, 9,13)E(3 ,5,7,13
3 J) H# T/ M5 i2 N - )E(14,15, 16,23) E(17,18,19,23)E( 20, 21, 22,23)E# }& F$ L3 a! S4 _* I) i
- (14,17,20,23)E(15, 18,21,23)E(16,19, 22 ,23)E( 14, 18,
) r; c# N, u8 W6 Z( p( ~. Y - 22,23)E(16,18,20, 23)R U O(255 ,38)R G ( 38)O( 255,36)
/ D6 I. ?% c( f$ v( B' h - R H(13,23)O(255, 11)R H(11,36) O(254 ,36) R G( 36 ) O(& k9 \1 w" r* |' _; n6 x
- 255,36)R S(1,14 )S(2,15)S(3, 16)S(4, 17 )S (5, 18)S(6,
& R6 V C+ @& i9 r; _% e! ^ - 19)S(7,20)S(8, 21)S(9 ,22)H(13,23 )H(36, 67 )N(11)R3 l4 Q0 ~3 z* e' s9 _. c2 V! G
- G(11)""O(255, 25 )R s(C(G(11) ))n (G( 11) )G(
9 J, d- m8 w7 j8 U, w2 X - 11)N(54)R C( "aa") s(A( G(25)))T (G(25))N (69)R o- k+ i( U1 Z9 X! `3 W/ Q$ s
- (14,1,26)o( 15, 2, 27)o (16,3,28 )o( 17,4, 29)o(184 m4 ~& ?5 C: ?# `
- ,5,30)o(19 ,6,31)o( 20,7,32)o (21,8,33)o (22 ,9,
6 X: @. J4 |! L4 @. K; g$ x - 34)n(C(U) )N( 68)R H( 36,13)G(23) N(11)R C(D( G(11)))- }8 E. W$ \/ t* X& `4 e3 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(, p3 P' S* Z0 _0 [
- 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/ ?, B5 n1 m O+ C2 x
- 7 }& R. k7 G$ l6 C
- #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\9 a* z5 @, Q2 F Y' a5 B( h
- +26,d+28,d+30,d+32,d+34,d+36,d+38,d+40,d+50,(scanf(d+126,d+4),d+(6\
2 |! S4 a1 h" h- c- j) u0 r3 W* K - -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+\
. ~$ z: f* y' R- L - 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. j V: Q4 k5 ^2 @" W8 ?& Q- ~
- ,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+\6 c- A( T+ s3 | V$ u2 n
- 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,\
2 f" a3 T, G6 Z/ d9 y b - d+128,d+129
: D! {( N* o# C2 `6 l5 \ - 8 F s: F. X! |1 L* B7 M
- char d[538] = {1,0,10,0,10};, m" o" }- F% ~. c
- 8 N) D; d6 i+ }* B
- int main() {, ?9 R$ T) O- R9 d, |1 u
- while(*d) printf(fmt, arg);
; @: v6 t0 E) P0 Q7 p- g, [* m - }
复制代码 0 |1 C( p2 A# E+ U5 m
截图: 2 v/ E; j% ^6 D/ j. F5 [
; F6 D S3 A8 C& b1 y% z 是不是看着发晕?发晕就对了!
4 U7 o$ a0 s% j* O2 m
! c5 q$ G e9 m; e$ l
IOCCC 大赛全称:The International Obfuscated C Code Contest,国际 C 语言混乱代码大赛,目的是写出最有创意的最让人难以理解的 C 语言代码,并限制在 4 kb 以内。这项赛事也年头了,2020 年是第 27 次举办。
1 x- O# e: l) F s& T
写这个程序的小哥 Carlini 已经在 GitHub 上解释了程序原理: 8 W% w0 U% P* Y# d1 X2 k: e
; e {" q! ]& \* b& F
链接: http://github.com/carlini/printf-tac-toe
1 |/ ^; L9 }% A9 \' v. a |