সি কোড প্রতিযোগিতা 2006 অবরুদ্ধ করা হয়েছে। দয়া করে sykes2.c ব্যাখ্যা করুন


974

এই সি প্রোগ্রামটি কীভাবে কাজ করে?

main(_){_^448&&main(-~_);putchar(--_%64?32|-~7[__TIME__-_/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[_*2&8|_/64]/(_&2?1:8)%8&1:10);}

এটি যেমন পরীক্ষিত হয় তেমন সংকলন করে gcc 4.6.3। সংকলনের সময় এটি মুদ্রণ করে। আমার সিস্টেমে:

    !!  !!!!!!              !!  !!!!!!              !!  !!!!!! 
    !!  !!  !!              !!      !!              !!  !!  !! 
    !!  !!  !!              !!      !!              !!  !!  !! 
    !!  !!!!!!    !!        !!      !!    !!        !!  !!!!!! 
    !!      !!              !!      !!              !!  !!  !! 
    !!      !!              !!      !!              !!  !!  !! 
    !!  !!!!!!              !!      !!              !!  !!!!!!

উত্স: sykes2 - এক লাইনে একটি ঘড়ি , sykes2 লেখক ইঙ্গিত

কিছু ইঙ্গিত: ডিফল্ট হিসাবে কোনও সংকলন সতর্কতা নেই। এর সাথে সংকলিত -Wall, নিম্নলিখিত সতর্কতাগুলি নির্গত হয়:

sykes2.c:1:1: warning: return type defaults to int [-Wreturn-type]
sykes2.c: In function main’:
sykes2.c:1:14: warning: value computed is not used [-Wunused-value]
sykes2.c:1:1: warning: implicit declaration of function putchar [-Wimplicit-function-declaration]
sykes2.c:1:1: warning: suggest parentheses around arithmetic in operand of ‘|’ [-Wparentheses]
sykes2.c:1:1: warning: suggest parentheses around arithmetic in operand of ‘|’ [-Wparentheses]
sykes2.c:1:1: warning: control reaches end of non-void function [-Wreturn-type]

6
ডিবাগ: প্রিন্টগুলির printf("%d", _);শুরুতে যুক্ত করা main: পেস্টবিন.com
কর্নি

পূর্ণসংখ্যা, প্রতিটি টাইপযুক্ত ভেরিয়েবলের ডিফল্টint
drahnr

18
আপনি কি ইঙ্গিতটি পড়েছেন? ioccc.org/2006/sykes2/hint.text
nhahtdh

2
এছাড়াও পঠিত stackoverflow.com/questions/10321196/...
Xofo

আপনি যদি এটির মতো চালান এটি ক্র্যাশ হয়ে যায়:./a.out $(seq 0 447)
এসএস আন

উত্তর:


1819

আসুন এটিকে অবহেলা করি।

ইন্ডেন্ট করেও:

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&88 হয় ifi 4, 5, 6 বা 7 মড 8 হয়।

if((i & 2) == 0) shift /= 8; shift = shift % 8i%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);}

আমরা পেতে

          !!              !!                              !!   
    !!  !!              !!  !!  !!  !!              !!  !!  !! 
    !!  !!              !!  !!  !!  !!              !!  !!  !! 
          !!      !!              !!      !!                   
    !!  !!  !!          !!  !!      !!              !!  !!  !! 
    !!  !!  !!          !!  !!      !!              !!  !!  !! 
          !!              !!                              !!   

আমরা যেমন প্রত্যাশা করেছি ঠিক তেমন এটি আসলটির মতো দৃ -়-দৃষ্টিকোণ নয়, যা লেখক কেন তার টেবিলটি ব্যবহার করতে বেছে নিয়েছেন তা ব্যাখ্যা করে।


2
@ ডিগ্রনর - প্রযুক্তিগতভাবে এটি উভয়ই *( +
সম্মান

18
@ АртёмЦарионов: প্রায় 30 মিনিট, তবে আমি ফিরে এসে এটিকে মোটামুটি সম্পাদনা করছি। আমি সি প্রচুর ব্যবহার করি এবং এর আগেও আমি ব্যক্তিগত স্বার্থের জন্য কয়েকটি আইওসিসি ডিওফাস্কেশন করেছি (শেষটি আমি কেবল ব্যক্তিগত স্বার্থে করেছি, এই সুন্দর রেরেটার ছিল )। আপনি যদি এটি কীভাবে কাজ করে তা জানতে চান, আমি বাধ্য হয়ে খুশি হব;)
nneonneo

5
@।: প্রায় এক দিন আইআইআরসি (রেট্রেসার জ্যামিতি বোঝার জন্য ব্যয় করা সময়ও গণনা করে)। এই প্রোগ্রামটি খুব চালাক, কারণ এটি কোনও কীওয়ার্ড ব্যবহার করে না
নিনেনিও

178
সি .. সমাবেশ ভাষার পাঠ্যতার সাথে মিলিত সমাবেশ ভাষার সমস্ত শক্তি
উইম

6
এই শিরাতে আরও তথ্যের জন্য, ডন লিবস দ্বারা "অবফসেক্টেড সি এবং অন্যান্য রহস্যগুলি" দেখুন। এটি ওফফসকেটেড সি প্রতিযোগিতার এন্ট্রি বিশ্লেষণ করে সি কৌশল শেখায়।
ক্রিস এন

102

আসুন সহজ পড়ার জন্য এটি বিন্যাস করুন:

main(_){
  _^448&&main(-~_);
  putchar((--_%64) ? (32|-(~7[__TIME__-_/8%8])[">'txiZ^(~z?"-48]>>(";;;====~$::199")[_*2&8|_/64]/(_&2?1:8)%8&1):10);
}

সুতরাং, কোনও যুক্তি ছাড়াই এটি চালানো, _ (প্রচলিত অর্গক) 1main()পুনরাবৃত্তভাবে নিজেকে কল করবে, -(~_)(নেতিবাচক বিটওয়াইজ অব নট _) এর ফলাফলটি পাস করার পরে , সত্যই এটি 448 পুনরাবৃত্তি হবে (কেবলমাত্র শর্ত যেখানে _^448 == 0)।

এটি গ্রহণ করে, এটি 7 -৪-অক্ষরের প্রশস্ত লাইনগুলি (বাইরের দিকের অবস্থা এবং 448/64 == 7) মুদ্রণ করবে । সুতরাং এটি একটু ক্লিনার পুনরায় লিখুন:

main(int argc) {
  if (argc^448) main(-(~argc));
  if (argc % 64) {
    putchar((32|-(~7[__TIME__-argc/8%8])[">'txiZ^(~z?"-48]>>(";;;====~$::199")[argc*2&8|argc/64]/(argc&2?1:8)%8&1));
  } else putchar('\n');
}

এখন, 32ASCII স্থানের জন্য দশমিক। এটি হয় কোনও স্থান ছাপায় না একটি '!' (33 হল '!', অতএব শেষে ' &1')। আসুন মাঝখানে ফোঁড়া উপর ফোকাস:

-(~(7[__TIME__-argc/8%8][">'txiZ^(~z?"-48]) >>
     (";;;====~$::199"[argc*2&8|argc/64]) / (argc&2?1:8) % 8

অন্য পোস্টার __TIME__যেমন বলেছিল যে প্রোগ্রামটির সংকলন করার সময়, এবং এটি একটি স্ট্রিং, তাই কিছু স্ট্রিংথ পাটিগণিতও চলছে, পাশাপাশি একটি অ্যারে সাবস্ক্রিপ্টকে দ্বিদ্বিধায়নের সুবিধা গ্রহণ করা: a [b] বি এর সমান চরিত্র অ্যারে জন্য।

7[__TIME__ - (argc/8)%8]

এটি প্রথম 8 টি অক্ষরের মধ্যে একটি নির্বাচন করবে __TIME__। এরপরে এটি সূচিবদ্ধ হয় [">'txiZ^(~z?"-48](0-9 অক্ষরগুলি 48-57 দশমিক) এই স্ট্রিংয়ের অক্ষরগুলি অবশ্যই তাদের ASCII মানগুলির জন্য চয়ন করা উচিত। এই একই অক্ষর ASCII কোড ম্যানিপুলেশন প্রকাশের মাধ্যমে অবিরত থাকে, ফলস্বরূপ একটি '' বা 'মুদ্রণের ফলে!' চরিত্রের গ্লাইফের মধ্যে অবস্থানের উপর নির্ভর করে।


49

অন্যান্য সমাধানের যোগ করা হচ্ছে, -~xসমান x+1কারণ ~xসমতূল্য (0xffffffff-x)। এটি (-1-x)2 এস পরিপূরক হিসাবে সমান , তাই -~xহয় -(-1-x) = x+1


5
মজাদার. আমি কিছুক্ষণের জন্য জানি যে ~ x == -x - 1, তবে আমি এর পিছনে গাণিতিক যুক্তি জানতাম না।
ApproachingDarknessFish

3
আই, কোল, (-1-x) একই (-x-1), আপনার এটি "ফিক্স" করার দরকার নেই !!
থমাস গান

7
একই কারণে যদি কেউ -1338 হয় তবে তারা 1337 নয়
অ্যান্ড্রু মাও

4

আমি যতটা পারি মডুলো পাটিগণিতকে অবিচ্ছিন্ন করে দিয়েছিলাম এবং পুনরুদ্ধারটি সরিয়েছি

int pixelX, line, digit ;
for(line=6; line >= 0; line--){
  for (digit =0; digit<8; digit++){
    for(pixelX=7;pixelX > 0; pixelX--){ 
        putchar(' '| 1 + ">'txiZ^(~z?"["12:34:56"[digit]-'0'] >> 
          (";;;====~$::199"[pixel*2 & 8  | line] / (pixelX&2 ? 1 : 8) ) % 8 & 1);               
    }
  }
  putchar('\n');
}

এটি আরও কিছুটা প্রসারিত করা:

int pixelX, line, digit, shift;
char shiftChar;
for(line=6; line >= 0; line--){
    for (digit =0; digit<8; digit++){
        for(pixelX=7;pixelX >= 0; pixelX--){ 
            shiftChar = ";;;====~$::199"[pixelX*2 & 8 | line];
            if (pixelX & 2)
                shift = shiftChar & 7;
            else
                shift = shiftChar >> 3;     
            putchar(' '| (">'txiZ^(~z?"["12:34:56"[digit]-'0'] + 1) >> shift & 1 );
        }

    }
    putchar('\n');
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.