Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo zusammen,

ich habe in meiner Berufsschule eine Aufgabe aufbekommen, die einen Sonderstatus hat. Sie ist nämlich recht schwer, zumindest behauptet unser Lehrer das. Es geht um Autographen (was auch immer das sein mag).

Hier einfach mal die Aufgabenstellung:

(Autograph) Schreiben Sie ein Programm, das seinen eigenen Quelltext

Zeichen fur Zeichen ausgibt, kein Zeichen mehr und keines weniger.

Hinweis: Die Losung besteht aus nur zwei Zeilen. Eine Losung, die darin besteht, dass das Programm seinen Quelltext aus einer Datei einliest und ausgibt, ist nicht zulassig; Diese Aufgabe ist erfahrungsgem¨aß auch fur erfahrene Informatiker sehr schwer, und es wird nicht erwartet, dass Sie sie losen konnen!

Falls Antwortbedarf besteht danke ich schonmal im vorraus.

Geschrieben

ähä, also es gibt folgende möglichkeiten

- Quellcode aus Datei

- Quelllcode aus dem interpreter, wobei mir neu wäre das ein interpreter den überhaupt vorhält.

- Native laufzeitdaten byte für byte aus dem ram, aber das ist kein Sourcecode und bei weitem nicht einfach.

Also irgend einen Ansatz sollte er schon für euch haben.

du kannst auch ein programm schreiben das seinen eigenen Quellcode als String speichert, und den dann als eval() ausführt, sowas wird es vermutlich auch bei perl geben, aber irgendwie nicth sinn der sache.

Geschrieben

Das, was du da "Autograph" nennst, kenne ich als Quine.

Mit dem Begriff und dem Link hast Du ihm die Aufgabe praktisch abgenommen, der Artikel enthält Beispiele, auch eins in Perl. Quine ist aber IMO die richtige Bezeichung, zumindest im Englischen.

Geschrieben

Vielen Dank für die Antworten.

Habe die Aufgabenstellung aus einem Buch übernommen. Der Lehrer hat uns auch gesagt, dass diese Aufgabe äußert schwer sein soll. Dennoch bin ich natürlich gewillt die Aufgabe zu lösen. Danke für eure Hilfe

Geschrieben

rein von der Aufgabenstellung her sind aber Quines falsch ^^

Quines besitzen einen string der den gleichen Quellcode enthält wie das Programm. das ist nicht! der Quellcode des Programms und das Programm gibt nicht "seinen" Quellcode aus. Sondern nur ein Stück quellcode das zufällig genauso aussieht wie der eigene.

die kleinste veränderung und das Quine-Prog ist nutzlos ;)

by the way: was solltet ihr nun daraus lernen ? - mir ist keine praktische anwendung davon bekannt ^^.

Geschrieben
Sondern nur ein Stück quellcode das zufällig genauso aussieht wie der eigene.

Wenn der ausgegebene Quellcode identisch mit dem ist, aus dem das Programm übersetzt wurde, dann ist das schon der "eigene" Quellcode des Programms.

Geschrieben

nein ^^, das ist ein logischer unterschied. Einen String zu basteln der Programmcode enthält ist keine Kunst, aktiv verwendeten Programmcode zu finden und zu parsen etwas anderes. letzteres könnte zum Debuggen oder für eigene Parser verwendet werden. Ein tippfehler im String und alles ist vorbei. da der aber nicht aktiv ausgeführt wird, schädigt es das Programm nicht, dennoch eine falsche ausgabe.

Geschrieben

Also ich denke ich werde es mal mit einem solchen Quine ausprobieren, wie er bei Wikipedia beschrieben ist. Ist vielleicht nicht die 100%ig richtige Lösung, doch besser als nichts. Sobald ich eine Lösung von meinem Lehrer bekomme, werde ich euch diese mitteilen.

Geschrieben
nein ^^, das ist ein logischer unterschied.

Ich glaube, Du hast nicht ganz verstanden, was ein Quine ist und tun soll. Es geht nicht darum, einen Decompiler zu bauen.

Natürlich darf man keine Tippfehler machen.

Geschrieben (bearbeitet)

In PERL wäre das wohl auf diese Art und Weise zu lösen.


#!/usr/bin/perl

#/home/user/readmyself.pl

open(MYSELF,"/home/user/readmyself.pl");

while(defined(my $i = <MYSELF>)) { print $i; }

close(MYSELF);

Gruß

//edit: oh, das zählt ja gar nicht. Naja ich lass es jetzt trotzdem mal stehen :-)

Bearbeitet von starbuck86
Geschrieben
Habe diese Woche das Programm nicht besprochen. Scheint wohl doch etwas zu kompliziert zu sein, als dass uns der Lehrer die Erklärung direkt am Anfang vor die Nase knallen würde. Mal sehen wann das kommt...

Dasn Witz oder? :eek Also entweder versteh' ich die Aufgabenstellung nicht oder dein Lehrer sollte lieber Hauswirtschaft unterrichten. :rolleyes: Hier die Loesung:

#!/usr/bin/perl -w

open(FH, $0) and print <FH>;

Das ganze ausgefuehrt:

% perl test.pl

#!/usr/bin/perl -w

open(FH, $0) and print <FH>;

War das nun richtig oder nicht?

mfg

Unix

Geschrieben
Schau in die Aufgabenstellung: ;)

Danke fuer's Vorlesen. War ne lange Nacht gestern... :schlaf: Also wenn ich es recht verstanden habe, dann geht es nur um den Bytecode des Programms? Also das was tatsaechlich ausgefuehrt wird? Wie stehts mit folgender Loesung?

Irgendein Quellkaes' - Relativ egal was man reinschreibt.

% cat test.pl

#!/usr/bin/perl -w

# vim: set sw=4 ts=4

# ich kann hier was auch immer reinschreiben

use strict;

use warnings;

print "Ich habe perldoc O gelesen!\n";

Ausgabe des Perlcodes ueber das Perl Compiler Backend:

% perl -MO=Deparse test.pl

BEGIN { $^W = 1; } use warnings;

use strict 'refs';

print "Ich habe perldoc O gelesen!\n";

test.pl syntax OK

Wenn ich nicht wieder zu doof fuer die Aufgabenstellung war, dann stimmt das so, oder? :mod:

Geschrieben
Wenn ich nicht wieder zu doof fuer die Aufgabenstellung war, dann stimmt das so, oder? :mod:

Nö. Erstens entspricht die Ausgabe nicht dem Quellcode, und zweitens wird die Ausgabe nicht vom Programm selbst produziert.

Geschrieben
Nö. Erstens entspricht die Ausgabe nicht dem Quellcode

Die Ausgabe entspricht dem Quellcode auf's i-Tuepfelchen. Genau das was hier rauskommt leitet der Perl Compiler weiter. Wenn es dir nur um die letzte Zeile geht mit dem "OK", dann kann man das ganze auch per perl -MO=-qq,Deparse test.pl aufrufen und dann entspricht die Ausgabe dem Quellcode soweit, dass man es sogar wieder zum Perlinterpreter pasten kann.

und zweitens wird die Ausgabe nicht vom Programm selbst produziert.

Doch, eigentlich schon, aber das ist wohl Ansichtssache.

OK, dann ein anderer Ansatz. Vielleicht habe ich es ja diesmal getroffen? Der Quellkaes':

% cat test.pl

#!/usr/bin/perl -w

# vim: set sw=4 ts=4

use strict;

use warnings;

$_ = 'print chr(36).chr(97).chr(61).chr(39).$_.chr(39).chr(59).chr(10).$_;';

print chr(36).chr(97).chr(61).chr(39).$_.chr(39).chr(59).chr(10).$_;

Das ausgefuehrte Programm:

% perl test.pl

$a='print chr(36).chr(97).chr(61).chr(39).$_.chr(39).chr(59).chr(10).$_;';

print chr(36).chr(97).chr(61).chr(39).$_.chr(39).chr(59).chr(10).$_;

Wenn es das jetzt nicht ist, dann weiss ich auch nicht weiter... :eek

Geschrieben

Wenn es das jetzt nicht ist, dann weiss ich auch nicht weiter... :eek

Die Ausgabe entspricht nicht exakt dem Quelltext (=der Eingabe an perl), da die beiden mit "#" und mit "use" beginnenden Zeilen in der Ausgabe fehlen, sowie die vorletzte Zeile in der Ausgabe mit "$a" beginnt, im Quelltext jedoch mit "$_". Damit ist es keine der gesuchten Lösungen.

Geschrieben
Die Ausgabe entspricht nicht exakt dem Quelltext (=der Eingabe an perl), da die beiden mit "#" und mit "use" beginnenden Zeilen in der Ausgabe fehlen, sowie die vorletzte Zeile in der Ausgabe mit "$a" beginnt, im Quelltext jedoch mit "$_". Damit ist es keine der gesuchten Lösungen.

Naja... Kommentare, Shebang, use, Variablennamen kann man ja rausnehmen/aendern.

Das geht als Code:

% cat test.pl 

$a='print chr(36).chr(97).chr(61).chr(39).$a.chr(39).chr(59) .chr(10).$a;';

print chr(36).chr(97).chr(61).chr(39).$a.chr(39).chr(59) .chr(10).$a; 
Dann stimmt auch die pingelige Anforderung:
% perl test.pl 

$a='print chr(36).chr(97).chr(61).chr(39).$a.chr(39).chr(59) .chr(10).$a;';

print chr(36).chr(97).chr(61).chr(39).$a.chr(39).chr(59) .chr(10).$a;

Die MD5-Summe ist in beiden Faellen jetzt a3192c066c633d88cb39ba8204f96367 und somit stimmen Code und Ausgabe exakt ueberein. :e@sy

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...