आइए इसे डिफ्यूज़ करें।
इंडेंट:
main(_) {
_^448 && main(-~_);
putchar(--_%64
? 32 | -~7[__TIME__-_/8%8][">'txiZ^(~z?"-48] >> ";;;====~$::199"[_*2&8|_/64]/(_&2?1:8)%8&1
: 10);
}
इस गंदगी को हटाने के लिए चर का परिचय:
main(int i) {
if(i^448)
main(-~i);
if(--i % 64) {
char a = -~7[__TIME__-i/8%8][">'txiZ^(~z?"-48];
char b = a >> ";;;====~$::199"[i*2&8|i/64]/(i&2?1:8)%8;
putchar(32 | (b & 1));
} else {
putchar(10); // newline
}
}
ध्यान दें कि -~i == i+1
क्योंकि twos- पूरक। इसलिए, हमारे पास है
main(int i) {
if(i != 448)
main(i+1);
i--;
if(i % 64 == 0) {
putchar('\n');
} else {
char a = -~7[__TIME__-i/8%8][">'txiZ^(~z?"-48];
char b = a >> ";;;====~$::199"[i*2&8|i/64]/(i&2?1:8)%8;
putchar(32 | (b & 1));
}
}
अब, ध्यान दें कि a[b]
जैसा हैb[a]
, और -~ == 1+
फिर से लागू करें:
main(int i) {
if(i != 448)
main(i+1);
i--;
if(i % 64 == 0) {
putchar('\n');
} else {
char a = (">'txiZ^(~z?"-48)[(__TIME__-i/8%8)[7]] + 1;
char b = a >> ";;;====~$::199"[(i*2&8)|i/64]/(i&2?1:8)%8;
putchar(32 | (b & 1));
}
}
पुनरावृत्ति को एक पाश में बदलना और थोड़ा और सरलीकरण करना:
// please don't pass any command-line arguments
main() {
int i;
for(i=447; i>=0; i--) {
if(i % 64 == 0) {
putchar('\n');
} else {
char t = __TIME__[7 - i/8%8];
char a = ">'txiZ^(~z?"[t - 48] + 1;
int shift = ";;;====~$::199"[(i*2&8) | (i/64)];
if((i & 2) == 0)
shift /= 8;
shift = shift % 8;
char b = a >> shift;
putchar(32 | (b & 1));
}
}
}
यह प्रति वर्ण एक वर्ण आउटपुट करता है। हर 64 वें चरित्र में, यह एक नई रूपरेखा प्रस्तुत करता है। अन्यथा, यह आउटपुट करने के लिए क्या पता लगाने के लिए डेटा तालिकाओं की एक जोड़ी का उपयोग करता है, और या तो चरित्र 32 (एक स्थान) या चरित्र 33 (ए) को डालता है!
) । पहली तालिका ( ">'txiZ^(~z?"
) प्रत्येक वर्ण की उपस्थिति का वर्णन करने वाले 10 बिटमैप का एक सेट है, और दूसरी तालिका ( ";;;====~$::199"
) बिटमैप से प्रदर्शित करने के लिए उपयुक्त बिट का चयन करती है।
दूसरी तालिका
की दूसरी तालिका का परीक्षण करके शुरू करते हैं, int shift = ";;;====~$::199"[(i*2&8) | (i/64)];
। i/64
पंक्ति संख्या (6 से 0) और हैi*2&8
8 iff i
4, 5, 6 या 7 mod 8 है।
if((i & 2) == 0) shift /= 8; shift = shift % 8
या तो उच्च ओक्टल अंक ( i%8
= 0,1,4,5 के लिए) या i%8
तालिका मूल्य के कम ऑक्टल अंक ( = 2,3,6,7 के लिए) का चयन करता है। पारी तालिका इस तरह से समाप्त होती है:
row col val
6 6-7 0
6 4-5 0
6 2-3 5
6 0-1 7
5 6-7 1
5 4-5 7
5 2-3 5
5 0-1 7
4 6-7 1
4 4-5 7
4 2-3 5
4 0-1 7
3 6-7 1
3 4-5 6
3 2-3 5
3 0-1 7
2 6-7 2
2 4-5 7
2 2-3 3
2 0-1 7
1 6-7 2
1 4-5 7
1 2-3 3
1 0-1 7
0 6-7 4
0 4-5 4
0 2-3 3
0 0-1 7
या सारणीबद्ध रूप में
00005577
11775577
11775577
11665577
22773377
22773377
44443377
ध्यान दें कि लेखक ने पहले दो टेबल प्रविष्टियों (डरपोक!) के लिए नल टर्मिनेटर का उपयोग किया था।
इसे सात-खंड के प्रदर्शन के बाद डिज़ाइन किया गया है 7
रिक्त स्थान है। तो, पहली तालिका में प्रविष्टियों को उन खंडों को परिभाषित करना होगा जो कि जलते हैं।
पहली तालिका
__TIME__
प्रीप्रोसेसर द्वारा परिभाषित एक विशेष मैक्रो है। यह उस स्ट्रिंग स्थिरांक तक फैलता है जिसमें उस समय होता है जिस पर प्रीप्रोसेसर को फॉर्म में चलाया गया था "HH:MM:SS"
। गौर करें कि इसमें ठीक 8 अक्षर हैं। ध्यान दें कि 0-9 में 57 के माध्यम से एएससीआईआई के 48 मान हैं और:
एएससीआईआई का मूल्य 58 है। आउटपुट 64 वर्ण प्रति पंक्ति है, जिससे प्रति वर्ण 8 अक्षर निकलते हैं __TIME__
।
7 - i/8%8
इस प्रकार उस का सूचकांक __TIME__
वर्तमान में उत्पादन किया जा रहा है ( 7-
जरूरत है क्योंकि हम i
नीचे की ओर पुनरावृत्ति कर रहे हैं )। तो, t
का चरित्र है__TIME__
आउटपुट होने ।
a
इनपुट के आधार पर बाइनरी में निम्नलिखित को बराबर करना होता है t
:
0 00111111
1 00101000
2 01110101
3 01111001
4 01101010
5 01011011
6 01011111
7 00101001
8 01111111
9 01111011
: 01000000
प्रत्येक संख्या एक बिटमैप है जो उन खंडों का वर्णन करता है जो हमारे सात-खंड प्रदर्शन में जलाए जाते हैं। चूंकि वर्ण सभी 7-बिट ASCII हैं, इसलिए उच्च बिट को हमेशा साफ़ किया जाता है। इस प्रकार, 7
खंड तालिका में हमेशा रिक्त के रूप में प्रिंट होता है। दूसरी तालिका 7
एस के साथ इस तरह दिखती है :
000055
11 55
11 55
116655
22 33
22 33
444433
तो, उदाहरण के लिए, 4
है 01101010
(बिट्स 1, 3, 5, और 6 सेट) है, जो के रूप में प्रिंट
----!!--
!!--!!--
!!--!!--
!!!!!!--
----!!--
----!!--
----!!--
यह दिखाने के लिए कि हम वास्तव में कोड को समझते हैं, आइए इस तालिका के साथ आउटपुट को थोड़ा समायोजित करें:
00
11 55
11 55
66
22 33
22 33
44
यह इनकोडेड है "?;;?==? '::799\x07"
। कलात्मक उद्देश्यों के लिए, हम 64 अक्षरों में से कुछ को जोड़ेंगे (चूंकि केवल कम 6 बिट्स का उपयोग किया जाता है, यह आउटपुट को प्रभावित नहीं करेगा); यह देता है "?{{?}}?gg::799G"
(ध्यान दें कि 8 वां वर्ण अप्रयुक्त है, इसलिए हम वास्तव में इसे जो चाहें बना सकते हैं)। हमारी नई तालिका को मूल कोड में लाना:
main(_){_^448&&main(-~_);putchar(--_%64?32|-~7[__TIME__-_/8%8][">'txiZ^(~z?"-48]>>"?{{?}}?gg::799G"[_*2&8|_/64]/(_&2?1:8)%8&1:10);}
हमें मिला
!! !! !!
!! !! !! !! !! !! !! !! !!
!! !! !! !! !! !! !! !! !!
!! !! !! !!
!! !! !! !! !! !! !! !! !!
!! !! !! !! !! !! !! !! !!
!! !! !!
जैसा हमें उम्मीद थी। यह मूल के रूप में ठोस दिखने वाला नहीं है, जो बताता है कि लेखक ने उस तालिका का उपयोग करने के लिए क्यों चुना जो उसने किया था।
printf("%d", _);
की शुरुआत में जोड़नाmain
: pastebin.com/HHhXAYdJ