Təxirə salınmış C Kod Yarışması 2006. Xahiş edirik sykes2.c

Bu C proqramı necə işləyir?

 main(_){_^448> 

Bu kimi tərtib edilir ( gcc 4.6.3 də test edilmişdir). Zaman tərtib edir. Sistemimdə:

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

Mənbə: sykes2 - bir satırda saatlar , sykes2 yazarın məsləhətləri

Bəzi göstərişlər: default olaraq tərtibat xəbərdarlığı yoxdur. " -Wall ilə tərtib olunmuşdur, aşağıdakı xəbərdarlıq verilir:

 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] 
898
13 марта '13 в 21:22 2013-03-13 21:22 qarğıdalı 13 Mart 13: 13-da təyin olunub
@ 4 cavab

De-obfuscation edək.

Girintilər:

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

Bu qarışıqlığı həll etmək üçün dəyişənlərin tətbiqi:

 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 putchar(32 | (b  1)); } else { putchar(10); // newline } } 

Xatırlayın ki, -~i == i+1 ikiqat tamamlayıcıya görə. Buna görə də var

 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 putchar(32 | (b  1)); } } 

İndi a[b] b[a] və dəyişməni yenidən tətbiq etdiyini -~ == 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 putchar(32 | (b  1)); } } 

Dəyişikliklərin qısa dövrəyə çevrilməsi və qısa müddətli sadələşdirilməsi:

 // 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 | (i/64)]; if((i  2) == 0) shift /= 8; shift = shift % 8; char b = a >> shift; putchar(32 | (b  1)); } } } 

Bu təkrarlama üçün bir simvol yazır. Hər 64-cü simvol yeni bir xətt çəkir. Əks təqdirdə, nəyin çıxılacağını anlamaq üçün bir cüt məlumat masası istifadə edir və ya xarakterə 32 (yer) və ya xarakterli 33 (a ! ) Yerləşdirir. Birinci masa ( ">'txiZ^(~z?" ) Hər bir xarakterin görünüşünü təsvir edən 10 bitmap şəklində bir sıra və ikinci masa ( ";;;====~$::199" ) müvafiq biti seçir bir bitmap göstərmək üçün.

İkinci cədvəl

İkinci masanın öyrənilməsi ilə başlayaq int shift = ";;;====~$::199"[(i*2 | (i/64)]; int shift = ";;;====~$::199"[(i*2 | (i/64)]; . i/64 , 4, 5, 6 və ya 7 mod 8'e bərabərdirsə, satır sayı (6-dan 0-a qədər) və i*2> 8-ə bərabərdir.

if((i 2) == 0) shift /= 8; shift = shift % 8 if((i 2) == 0) shift /= 8; shift = shift % 8 sekizli rəqəmi ( i%8 = 0,1,4,5 üçün) və ya aşağı sekizlik rəqəmi ( i%8 = 2,3,6,7) seçər. Şəffaflıq cədvəli belədir:

 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 

və ya cədvəlli formada

 00005577 11775577 11775577 11665577 22773377 22773377 44443377 

Müəllif masanındakı ilk iki giriş üçün sıfır məhdudlaşdırıcıyı (gizli!) İstifadə etdiyini unutmayın.

Yeddi seqment ekrandan sonra 7 boşluq kimi hazırlanmışdır. Beləliklə, birinci cədvəldəki girişlər işıqlandırılmaq üçün seqmentləri müəyyənləşdirməlidir.

Birinci masa

__TIME__ , preprocessor tərəfindən müəyyən olunan xüsusi __TIME__ . "HH:MM:SS" şəklində, preprocessorun yerinə yetirildiyi vaxtdan ibarət olan bir string sabitinə genişlənir. Tam 8 simvoldan ibarət olduğunu unutmayın. Qeyd edək ki, 0-9-dan ASCII dəyərləri 48-dən 57-ə, ASCII isə 58-ə bərabərdir. Çıxış faylı satır başına 64 simvol, yəni __TIME__ xarakterinə 8 simvol __TIME__ .

7 - i/8%8 bu səbəbdən hazırda __TIME__ indeksini __TIME__ ( 7- i tələb olunur, çünki biz yəni __TIME__ edirik). Beləliklə, t __TIME__ xarakterini __TIME__ .

ikili ifadədə aşağıdakı kimi bitər: giriş t bağlı olaraq:

 0 00111111 1 00101000 2 01110101 3 01111001 4 01101010 5 01011011 6 01011111 7 00101001 8 01111111 9 01111011 : 01000000 

Hər bir nöqtə, yeddi seqment ekranında vurğulanan seqmentləri təsvir edən raster şəkildir. Karakterler 7 bit ASCII olduğundan, yüksək bit həmişə təmizlənir. Beləliklə, seqment masasında 7 hər zaman bir yer kimi yazılır. İkinci masa belə görünür: 7 boşluq kimi:

 000055 11 55 11 55 116655 22 33 22 33 444433 

Məsələn, 4 , 01101010 (bit, 1, 3, 5, və 6 dəsti)

 ----!!-- !!--!!-- !!--!!-- !!!!!!-- ----!!-- ----!!-- ----!!-- 

Kodun həqiqətən başa düşülməsini göstərmək üçün, bu cədvəlin nəticəsini bir az tənzimləsin:

  00 11 55 11 55 66 22 33 22 33 44 

Bu "?;;?==? '::799\x07" kimi kodlanır. Bədii məqsədlər üçün, biz 64-ə bir neçə simvol əlavə edəcəyik (yalnız aşağı 6 bit istifadə olunur, bu çıxışa təsir etməyəcəkdir); bu "?{{?}}?gg::799G" (8-ci xarakterdən istifadə edilməyəcəyini unutmayın, buna görə də istədiyimizi edə bilərik). Yeni masanı mənbə koduna qoyun:

 main(_){_^448> 

biz alırıq

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

biz gözlənildiyi kimi. Müəllifin hazırladığı cədvəlin nəyə görə istifadə edilməsinə qərar verdiyini izah edən orijinal kimi möhkəm deyil.

1748
13 марта '13 в 22:46 2013-03-13 22:46 Cavab 13 Mart 2013, saat 10:46 'da, 2013-03-13 22:46 tarixində verilir

Okunabilirlik üçün formatlaşdırın:

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

Beləliklə, arqumentlər olmadan işlədilir _ (argc şərti) 1 . main() özünü recursively özünü çağırır, nəticəni -(~_) (mənfi bitsə deyil, _ ), belə ki, bu, həqiqətən, 448 nüsxə olacaqdır (yalnız şərait _^448 == 0 ).

Bunu alaraq, o, 64 xarakterli geniş xəttləri çap etdirəcək (xarici ternary dövlət və 448/64 == 7 ). Buna görə də bir az daha təmiz yazılsın:

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

İndi 32 ASCII yer üçün decimaldır. Bir boşluq ya da "!" (33 - "!", Buna görə " > " sonunda). Ortada olan ləkə diqqət edək:

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

Başqa bir posterin dediyinə görə, __TIME__ proqramın tərtibatma vaxtıdır və bu bir __TIME__ , buna görə də bir neçə ardıcıllıq ardıcıllığı və ikitərəfli array indeksinin istifadəsi: a [b] simvol diziləri üçün b [a] ilə eynidır.

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

Bu __TIME__ tarixində ilk 8 simvoldan __TIME__ . Daha sonra [">'txiZ^(~z?"-48] (0-9 simvol 48-57 ədəd) endekslenir. Bu [">'txiZ^(~z?"-48] simvolları ASCII dəyərləri üçün seçilməlidir. , xarakteri olan yerə görə '' və ya '' 'ilə nəticələnir.

96
14 марта '13 в 0:11 2013-03-14 00:11 cavab 14 mart '13, 2013 'da 0:11 2013-03-14 00:11' də verilir

Digər həllərə əlavə olaraq, -~x x+1 bərabərdir, çünki ~x (0xffffffff-x) bərabərdir. Əlavə 2 (-1-x) belədir -~x -(-1-x) = x+1 .

44
15 марта '13 в 2:54 2013-03-15 02:54 cavab 15.03.13 tarixində Tomas Song tərəfindən 2:54 2013-03-15 02:54

Mümkün olduğum qədər modulo aritmetikləri əldən verməmişəm və reccursionu silindim

 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 ? 1 : 8) ) % 8  1); } } putchar('\n'); } 

Bir az daha açar:

 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'); } 
3
21 апр. cavab verildi Lefteris E Apr 21 2013-04-21 17:48 '13 at 05:48 PM 2013-04-21 17:48