Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Perl - "Autograph" Aufgabe

Empfohlene Antworten

Veröffentlicht

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.

ä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.

ä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.

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.

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

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 ^^.

Mich würd die Lösung aber trotzdem interessieren.

Steht doch im Wikipedia-Eintrag.

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.

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.

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.

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.

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

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...

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

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:

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

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.

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.