Veröffentlicht 30. August 200817 j 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.
30. August 200817 j ä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.
30. August 200817 j ä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.
30. August 200817 j Falls Antwortbedarf besteht danke ich schonmal im vorraus.Wie lautet denn eigentlich deine Frage? Das, was du da "Autograph" nennst, kenne ich als Quine.
30. August 200817 j 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.
31. August 200817 j 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
31. August 200817 j 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 ^^.
31. August 200817 j Mich würd die Lösung aber trotzdem interessieren. Steht doch im Wikipedia-Eintrag.
31. August 200817 j 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.
1. September 200817 j 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.
1. September 200817 j 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.
1. September 200817 j 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.
3. September 200817 j 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 200817 j von starbuck86
4. September 200817 j 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...
5. September 200817 j 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
5. September 200817 j 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;
5. September 200817 j 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:
5. September 200817 j 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.
5. September 200817 j 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
5. September 200817 j 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.
5. September 200817 j 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
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.