Forum: Knobelecke
Moderatoren: broesel, juergenThema: Hello, World!
Hello, World!
broesel (webmaster) am 25.06.2010 um 10:47
ich war fest davon überzeugt, dass ich dieses Rätsel schonmal gestellt habe, aber die Forensuche wollte mich vom Gegenteil überzeugen.
Gegeben folgender Programmtext:
Zitat:
int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
Führt man das Programm aus, erscheint die bereits vermutete Ausgabe, "hello, world!".
Frage: wie funktioniert das Programm?
Gruss,
Philip
EDIT: ich musste die C-CODE Tags gegen QUOTE Tags ersetzen, da sonst Operatoren unterschlagen werden. Der Code ist wohl zu verquer für Martins Syntax Highlighter :>
--
The C Programming Quiz
- bitte Fragen einreichen :)
Re: Hello, World!
Patrick am 25.06.2010 um 12:28
Mal schauen, vieleicht komme ich am Wochenende noch einmal auf das Rätzel.
Btw. danke für die Kopfnuss und bitte nicht auflösen, Philip
--
To follow the path: look to the master, follow the master, walk with the master, see through the master, become the master.
[EDIT] - Re: Hello, World!
Patrick am 25.06.2010 um 17:52
Vielleicht wird das ja eine Gemeinschaftslösung.
'-'-'-' ist 0, also STDIN ... warum?
'/'/'/'/ ist 1
Die Funktion read wird 14x aufgerufen.
#include <stdio.h>
int i;
main()
{
for(;i["]<i;++i){--i;}"]; read (0, i+++"hello, world!\n", 1));
}
read (j,i,p)
{
//write(j/p+p, i---j, i/i);
write (1, i, 1);
}
edit:
Solange sonst keiner etwas dazu schreibt, hänge ich meine Ideen einfach unten an.
i+++"hello, world!\n" macht vermutlich folgendes.
"hello, world!\n" ist eine Stringkonstante mit der Startadresse 0x01 (erfunden).
Per i++ wird i pro Schleifendurchlauf um eins erhöht und im Anschluss mit der Startadresse addiert, sodass über die Schleife nach für nach die Adressen der Zeichen (Bytes) der Stringkonstante an die Funktion read() übergeben werden.
Gemein ist hier der verwirrende Funktionsname - prima Negativbeispiel
An
Zitat:rätzel ich noch.
i["]<i;++i){--i;}"];
Philip, es wird bald Zeit für ein eigenes C-Rätzel-Buch von dir
--
To follow the path: look to the master, follow the master, walk with the master, see through the master, become the master.
Re: Hello, World!
Patrick am 26.06.2010 um 09:53
int i; ist automagisch 0 (warum?).
"]<i;++i){--i;}" ist eine 14 Byte große Stringkonstante.
"abcdefghijklmn" erfüllt den selben Zweck, verwirrt nur nicht so schön *g*
i["]<i;++i){--i;}"]; in der Schleife wandert Byte für Byte durch diese Konstante (14x).
read (0, i+++"hello, world!\n", 1); entspricht write (0, i+++"hello, world!\n", 1);.
write erwartet als zweiten Parameter eine Adresse.
i+++"hello, world!\n" wandert in der Schleife durch die Stringkonstante, sodass write jeweils ein Byte auf die Standardausgabe STDOUT zaubern kann.
Wie immer, eine sehr geile Aufgabe Philip
Danke.
--
To follow the path: look to the master, follow the master, walk with the master, see through the master, become the master.
[EDIT] - Re: Hello, World!
broesel (webmaster) am 26.06.2010 um 19:45
Wenn ich nichts übersehen habe, sind damit also alle Rätsel gelöst.
Das Programm stammt übrigens von einem unbekanntem Teilnehmer des ersten IOCCC (und ist auch bei den Gewinnern). Der Veranstalter sagt dazu:
Zitat:
The author was too embarrassed that he/she could write such trash, so I
promised to protect their identity. I will say that the author of this
program has a well known connection with the C programming language.
Das eigentliche Rätsel ist also: wer ist der Autor dieses Programms?
Die gängige Meinung scheint zu sein, dass es Dennis Ritchie ist. Ich tippe auf Ken Thompson. Ich glaube mal gelesen zu haben, dass nach dem Tod des Autors die IOCCC-Leute das Rätsel auflösen werden.
Gruss,
Philip
--
The C Programming Quiz
- bitte Fragen einreichen :)
