Signatur von DrGreenthumb



  • Hi,

    Ich habe mal die Signatur von DrGreenthumb einfach durch meinen C-Compiler gejagt und bin erschaunt, dass da "DENIS" erscheint, denn das sieht wirklich nicht sehr nach was aus:

    main(k){for(k=0;k<125;++k)putchar((k+1)%25? ("[k<qFUF>XB]X=9V=hm9FC"[k/6]-52)&1<<k%6?64:32:10);}
    

    Ich habe versucht das zu strukturieren, wie z.B.:

    main(k)
    {
      //???
    }
    

    aber ich habe schon bald gemerkt, dass ich mit den herkömmlichen Mitteln nicht weit komme.

    Mich würde es sehr interessieren, wie man dieses Gebilde step by step auseinander nehmen und dann einen "normal-strukturierten" C-Code bilden kann. Eine kleine Erklärung jeweils wäre ausserdem sehr hilfreich.

    Ich denke mal die Buchstaben, Zahlen haben was mit der position zu tun, wenn man es nach ASCII Code umwandelt.

    Ich bin mal gespannt. Vielen Dank.

    syn0ps1s



  • der kode ist ein dekompressor, der die '@', ' ' und '\n' aus dem text dekomprimiert
    diese sind dabei in den ersten 6 bit je zeichen kodiert, und jedes 25. ist immer eine newline



  • syn0ps1s schrieb:

    Mich würde es sehr interessieren, wie man dieses Gebilde step by step auseinander nehmen und dann einen "normal-strukturierten" C-Code bilden kann.

    du könntest zunächst die ?:-Paare durch ifs ersetzen.



  • Hi r0nny, DrGreenthumb,

    Ich werde es heute mal aufstellen und zur Korrektur hier nochmals einfügen, nicht dass ich ein falscher code analysiere. Aber danke vielmals!!!

    gruss syn0ps1s



  • Lustiges Programm. Ich hab das ganze aus Neugier auch mal auseinandergebastelt und im Debugger angeguckt.
    So kann man es auch ganz gut verstehen.

    main(k)
    {
    	int c;
    	int a;
    	int b;
    	int d;
    	for(k=0;k<125;++k)
    	{	
    		if((k+1)%25)
    		{
    			a="[k<qFUF>XB]X=9V=hm9FC"[k/6];
    			b=a-52;
    			d=b&1<<k%6;
    
    			if(d)
    				c=64;
    			else
    				c=32;
    
    		}
    		else
    			c=10;
    
    		putchar(c);	
    	}
    }
    


  • hi, _sepp_ du bist fies, jetzt hast du mir die denkarbeit weggenommen :p

    egal. ich kapier das nicht:

    a="[k<qFUF>XB]X=9V=hm9FC"[k/6];
    

    und

    d=b&1<<k%6;
    

    Kann mir jemand hier helfen? Danke

    Gruss syn0ps1s



  • syn0ps1s schrieb:

    egal. ich kapier das nicht:

    a="[k<qFUF>XB]X=9V=hm9FC"[k/6];
    

    a wird ein element des arrays "[k<qFUF>XB]X=9V=hm9FC" zugewiesen.
    solange k<6 ist es das element von position 0
    ist k>=6 aber <12 dann von position 1
    bei 12 bis 17 position 2
    usw...

    syn0ps1s schrieb:

    und

    d=b&1<<k%6;
    

    mach' klammern drum. z.b. so:

    d= b & (1 << (k % 6));
    


  • syn0ps1s schrieb:

    egal. ich kapier das nicht:

    a="[k<qFUF>XB]X=9V=hm9FC"[k/6];
    

    Ist dasselbe wie

    const char * const foo="[k<qFUF>XB]X=9V=hm9FC";
    a = foo[k/6];
    

    und

    d=b&1<<k%6;
    

    Das erste Bit von b von rechts wird um k mod 6 Stellen nach links verschoben und in d gespeichert.



  • Michael E. schrieb:

    Das erste Bit von b von rechts wird um k mod 6 Stellen nach links verschoben und in d gespeichert.

    nö, das ergebnis der 'und-verknüpfung' von b und 2^(k mod 6) wird in d gespeichert.



  • So ich bin's, __sepp__, hab mich jetzt mal registriert hier.

    Also:

    "[k<qFUF>XB]X=9V=hm9FC"
    

    ist ein Array aus Characters, darauf wird mit

    [k/6]
    

    zugegriffen, also bei den ersten 6 Iterationen wird auf das erste Element des Arrays zugegriffen (k/6=0), bei den nächsten 6 Iterationen auf das zweite Element (k/6=1) usw...

    Für

    d=b&1<<k%6;
    

    musste ich mir erstmal angucken in welcher Prioritätsreihenfolge die einzelnen Operatoren abgearbeitet werden.
    Zuerst wird k%6 berechnet, dann wird so oft die 1 nach links geshiftet.
    Beispiel: k=4-> k%6 = 4 -> 1<<k%6 = 010000.

    Das ganze wird ver-undet mit b und dabei kommt entweder 0 raus oder nicht, hängt von b ab.

    Dahinter steckt also, dass die Bits der einzelnen Zeichen in dem Array (minus 52) das Muster für die einzelnen Zeilen angeben (naja vll etwas blöd ausgedrückt aber egal)



  • vielleicht kennt einer den noch nicht

    main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);}
    

    ich weiss, eigentlich ein alter hut...



  • Koennte ein Quine sein...


Anmelden zum Antworten