අපි එය අපැහැදිලි කරමු.
ඉන්ඩෙන්ටින්:
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
ද්වි-අනුපූරක නිසා බව සලකන්න . ඒ නිසා, අපට තිබේ
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
s හිස්ව ඇත. එබැවින්, පළමු වගුවේ ඇතුළත් කිරීම් මඟින් දැල්වෙන කොටස් අර්ථ දැක්විය යුතුය.
පළමු වගුව
__TIME__
යනු පෙර සැකසුම්කරු විසින් අර්ථ දක්වා ඇති විශේෂ සාර්ව ය. එය පෙර සැකසුම ක්රියාත්මක කළ වේලාව අඩංගු ස්වරූපයෙන් නියත නියතයක් දක්වා විහිදේ "HH:MM:SS"
. එහි හරියටම අක්ෂර 8 ක් ඇති බව නිරීක්ෂණය කරන්න. 0-9 ට ASCII අගයන් 48 සිට 57 දක්වා :
ඇති අතර ASCII අගය 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
හිස් ලෙස s සමඟ පෙනේ :
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);}
අපිට ලැබෙනවා
!! !! !!
!! !! !! !! !! !! !! !! !!
!! !! !! !! !! !! !! !! !!
!! !! !! !!
!! !! !! !! !! !! !! !! !!
!! !! !! !! !! !! !! !! !!
!! !! !!
අපි බලාපොරොත්තු වුනා වගේ. එය මුල් පිටපත තරම් solid න පෙනුමක් නොවේ, එය කතුවරයා තමා කළ වගුව භාවිතා කිරීමට තෝරාගත්තේ මන්දැයි පැහැදිලි කරයි.
printf("%d", _);
කිරීමmain
: මුද්රණ ආරම්භයට එකතු කිරීම : pastebin.com/HHhXAYdJ