Quines sind Programme, die sich selbst ausgeben. Das klingt erstmal einfach – solange man nicht genauer drüber nachdenkt. Das ist schon ein wenig Rocket Science.
quine-relay hat das ganze auf die Spitze getrieben. Ich zitiere mal:
This is a Ruby program that generates Scala program that generates Scheme program that generates ...(through 100 languages in total)... REXX program that generates the original Ruby code again.
Hossa! Ich bin beeindruckt. Seriously!
Ich habe es zugegebenermaßen nicht komplett ausprobiert, aber da das Programm wohl
generiert wird, glaube ich dem ganzen. Ein Programm in Sprache X generieren zu lassen, das einen Text Y ausgibt, klingt lösbar. Das für mehrere Sprachen zu bauen, ebenfalls. Das kann man dann ja einfach verketten: Generiere ein Programm X, das Text Y ausgibt. Generiere ein Programm W, das (Programm X, das Text Y ausgibt) ausgibt. Generiere ein Programm V, das (Programm W, das (Programm X, das Text Y ausgibt) ausgibt) ausgibt…
Bleibt nur die große Frage: Wie schaft man es nach 100 solcher Verkettungen, wieder beim Ausgangstext anzukommen? Und das noch
so schön formatiert?
Ich backe mal kleinere Brötchen, unter Perl ist ein Quine dank
__DATA__
ziemlich einfach. Kommt mir dadurch aber auch irgendwie geschummelt vor:
- #!/usr/bin/perl -w
- use strict;
- $/=undef;
- $a=<DATA>;
- print "${a}__DATA__\n$a";
- __DATA__
- #!/usr/bin/perl -w
- use strict;
- $/=undef;
- $a=<DATA>;
- print "${a}__DATA__\n$a";
(Ja, da könnte man noch golfen.)
Für C würde ich im ersten Moment an
#include "michselbst.c"
denken, aber da muss man dann ja die Anführungszeichen passend escapen… Für Java hab ich absolut null Idee, wie man da rangeht. Das können andere besser, da halte ich mich raus :-)
Ist aber mal ne schöne Bastelaufgabe, da mal drüber nachzudenken, wenn man nichts besseres zu tun hat.
Und vielleicht stöbere ich mal im Internet, wie man sowas in APL, Brainfuck oder COBOL macht, um mal etwas exotischere Dinge in den Raum zu schmeißen.
Wenn man's genau nimmt, ist das jetzt nicht mein erstes Quine: Ich habe vor Urzeiten mal ein PHP-Skript (iiiih!) geschrieben, das auf einem Server verwurstet wurde, den ich nicht unter meiner Kontrolle hatte – ergo käme ich nicht an den Sourcecode ran. Irgendein Source-Repository hatte ich auch nicht in Reichweite. Also habe ich da was reingefrickelt, dass das Script bei einem bestimmten Parameter seinen Quellcode ausgegeben hat - den Link dazu hat es auf jede generierte Seite geschrieben. Das war aber total langweilig und doof, das Skript hat nämlich versucht, seinen Namen zu erraten und dann ein fopen() auf sich selbst gemacht. Vermutlich hab ich da schlimmstenfalls ein Sicherheitsloch aufgerissen. Und unter Windows hätte das vermutlich auch nicht geklappt, weil die Datei schon durch das Ausführen des Skriptes in Benutzung wäre ;-)
Mitch's Manga Blog am : Bunter Code
Mitch’s Manga Blog am : Polyglott