schon einmal was von Quines gehört?

Gast #1518367
Lesenswert?

bin gerade zufällig über folgendes gestolpert: International Obfuscated 
C Code Contest, in welchem es darum geht, code möglichst füchterlich 
aussehen zu lassen. als beispiel ist folgendes angegeben:
1
#define _ -F<00||--F-OO--;
2
 int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
3
 {
4
             _-_-_-_
5
        _-_-_-_-_-_-_-_-_
6
     _-_-_-_-_-_-_-_-_-_-_-_
7
   _-_-_-_-_-_-_-_-_-_-_-_-_-_
8
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
9
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
10
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
11
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
12
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
13
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
14
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
15
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
16
   _-_-_-_-_-_-_-_-_-_-_-_-_-_
17
     _-_-_-_-_-_-_-_-_-_-_-_
18
         _-_-_-_-_-_-_-_
19
             _-_-_-_
20
 }

kann mir jemand erklären was hier passiert, bzw wie es funktioniert?

mehr infos:
http://de.wikipedia.org/wiki/IOCCC
Gast #1518392
Lesenswert?

> kann mir jemand erklären was hier passiert, bzw wie es funktioniert?

Ist doch eigentlich nicht so schwer. Der Anfang, vor diesem hübschen 
Ball mal etwas übersichtlicher geschrieben:
1
#define _  -F < 0 || --F - OO--;
2

3
int F=0, OO=0;
4

5
main()
6
{
7
    F_OO();
8
    printf("%1.3f\n",4.0 * -F / OO / OO);
9
}
10

11
F_OO()
12
{

Also macht main eigentlich nichts weiter, als die Funktion F_OO 
aufzurufen, dann das Ergebnis von 4.0 * -F   / OO   / OO auszugeben.
Der Ball wird durch Makro-Auflösung zu Code.
Schauen wir uns mal die erste Zeile an:
1
             _-_-_-_

Also, _ wird durch '-F<00||--F-OO--;' ersetzt. Damit wird daraus:
1
-F<00||--F-OO--;
2
--F<00||--F-OO--;
3
-F<00||--F-OO--;
4
--F<00||--F-OO--;
5
-F<00||--F-OO--;
6
--F<00||--F-OO--;
7
-F<00||--F-OO--;

Die erste Zeile davon mal etwas übersichtlicher

-F < 0 || --F - OO--;

Der Operator || arbeitet hier als Ersatz für if, da der Ausdruck 
dahinter nur dann ausgewertet wird, wenn der davor nicht 0 ist. Der Wert 
des ganzen wird hier einfach ignoriert. Dadurch wird auch das Ergebnis 
der  Subtraktion ignoriert. Also könnte man das auch noch lesbarer 
schreiben:
1
if (F > 0)
2
{
3
    F--;
4
    OO--;
5
}

Das
1
--F<00||--F-OO--;

funktioniert dann genaus, nur eben mit umgekehrtem Vorzeichen. Diese 
Operationen werden dann eben entsprechend oft ausgeführt (nachzählen 
darfst du selber).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren