আসুন এটিকে অবহেলা করি।
ইন্ডেন্ট করেও:
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 হয় ifi
4, 5, 6 বা 7 মড 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
ফাঁকা হিসাবে সাতটি বিভাগের প্রদর্শনের পরে ডিজাইন করা হয়েছে । সুতরাং, প্রথম টেবিলের এন্ট্রিগুলিতে অবশ্যই সেগমেন্টগুলি সংজ্ঞায়িত করা উচিত up
প্রথম টেবিল
__TIME__
প্রিপ্রোসেসর দ্বারা নির্ধারিত একটি বিশেষ ম্যাক্রো। এটি ফর্মের মধ্যে প্রিপ্রসেসরটি চালানো সময়ের সাথে যুক্ত স্ট্রিং ধীরে ধীরে প্রসারিত হয় "HH:MM:SS"
। দেখুন যে এটিতে 8 টি অক্ষর রয়েছে। নোট করুন যে 0-9 এর ASCII মান 48 এর মধ্য দিয়ে 57 হয় এবং :
ASCII মান 58 হয় The__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
: পেস্টবিন.com