Beckerman2609 Geschrieben 30. August 2008 Geschrieben 30. August 2008 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. Zitieren
Aiun Geschrieben 30. August 2008 Geschrieben 30. August 2008 ä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. Zitieren
Bubble Geschrieben 30. August 2008 Geschrieben 30. August 2008 ähä, also es gibt folgende möglichkeiten Du vergisst die gesuchte Variante: Ein Programm, das als Ausgabe seinen eigenen Quelltext produziert, ohne ihn irgendwoher einzulesen. Zitieren
Klotzkopp Geschrieben 30. August 2008 Geschrieben 30. August 2008 Falls Antwortbedarf besteht danke ich schonmal im vorraus.Wie lautet denn eigentlich deine Frage? Das, was du da "Autograph" nennst, kenne ich als Quine. Zitieren
Bubble Geschrieben 30. August 2008 Geschrieben 30. August 2008 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. Zitieren
Beckerman2609 Geschrieben 31. August 2008 Autor Geschrieben 31. August 2008 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 Zitieren
Aiun Geschrieben 31. August 2008 Geschrieben 31. August 2008 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 ^^. Zitieren
dr.dimitri Geschrieben 31. August 2008 Geschrieben 31. August 2008 Mich würd die Lösung aber trotzdem interessieren. Zitieren
Bubble Geschrieben 31. August 2008 Geschrieben 31. August 2008 Mich würd die Lösung aber trotzdem interessieren. Steht doch im Wikipedia-Eintrag. Zitieren
Bubble Geschrieben 31. August 2008 Geschrieben 31. August 2008 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. Zitieren
Aiun Geschrieben 1. September 2008 Geschrieben 1. September 2008 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. Zitieren
Beckerman2609 Geschrieben 1. September 2008 Autor Geschrieben 1. September 2008 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. Zitieren
Bubble Geschrieben 1. September 2008 Geschrieben 1. September 2008 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. Zitieren
starbuck86 Geschrieben 3. September 2008 Geschrieben 3. September 2008 (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 3. September 2008 von starbuck86 Zitieren
Beckerman2609 Geschrieben 4. September 2008 Autor Geschrieben 4. September 2008 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... Zitieren
Mr Unix Geschrieben 5. September 2008 Geschrieben 5. September 2008 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. 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 Zitieren
Klotzkopp Geschrieben 5. September 2008 Geschrieben 5. September 2008 War das nun richtig oder nicht? Schau in die Aufgabenstellung: Eine Losung, die darin besteht, dass das Programm seinen Quelltext aus einer Datei einliest und ausgibt, ist nicht zulassig; Zitieren
Mr Unix Geschrieben 5. September 2008 Geschrieben 5. September 2008 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: Zitieren
Klotzkopp Geschrieben 5. September 2008 Geschrieben 5. September 2008 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. Zitieren
Mr Unix Geschrieben 5. September 2008 Geschrieben 5. September 2008 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 Zitieren
Bubble Geschrieben 5. September 2008 Geschrieben 5. September 2008 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. Zitieren
Mr Unix Geschrieben 5. September 2008 Geschrieben 5. September 2008 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 Zitieren
Empfohlene Beiträge
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.