[Knobelaufgabe] Programm, dass seinen Quellcode ausgibt
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
dabei ist nicht so etwas billiges wie PHP gemeint, wo ein Befehl zur ausgabe des eigenen Quellcodes existiert.
die Knobelaufgabe ist schon etwas älter.
hatte vor längerem mal verschiedene Lösungen in verschiedenen Sprachen gesehen,
hab mir aber weder gemerkt wo noch wie die aussahen, so sehr hat's mich nicht interessiert.
das Kernproblem ist die logische Rekursivität:
Angenommen, ich schreibe ein Programm, dass seinen Quellcode in einer Datasection enthält.
dann brauche ich eine Schleife, um diese Datasection auszulesen,
also muss in der Datasection eine Schleife drinstehen und ein Abbild der Datasection.
das ist eine Katze die sich in den Schwanz beißt, ein Paradoxon...
die Knobelaufgabe ist schon etwas älter.
hatte vor längerem mal verschiedene Lösungen in verschiedenen Sprachen gesehen,
hab mir aber weder gemerkt wo noch wie die aussahen, so sehr hat's mich nicht interessiert.
das Kernproblem ist die logische Rekursivität:
Angenommen, ich schreibe ein Programm, dass seinen Quellcode in einer Datasection enthält.
dann brauche ich eine Schleife, um diese Datasection auszulesen,
also muss in der Datasection eine Schleife drinstehen und ein Abbild der Datasection.
das ist eine Katze die sich in den Schwanz beißt, ein Paradoxon...
-
- Beiträge: 237
- Registriert: 17.10.2008 18:24
- Kontaktdaten:
@Kaeru Gaman
Absolut richtig erfasst.
Dabei ist halt wichtig, dass der gesamte Code wiedergegeben wird, den man auch in der IDE stehen hat.
@#NULL
Ich seh dort keine (sinnvollen) Loesungen
Die Loesung in C++ sieht uebrigens so aus:
Finde ich wirklich genial. Nach kompilierung des Codes bekommt man ein exaktes Abbild des Codes wiedergegeben.
Und genau das versuch ich schon seit gestern in PB hinzukriegen ...
Absolut richtig erfasst.
Dabei ist halt wichtig, dass der gesamte Code wiedergegeben wird, den man auch in der IDE stehen hat.
@#NULL
Ich seh dort keine (sinnvollen) Loesungen

Die Loesung in C++ sieht uebrigens so aus:
Code: Alles auswählen
/* Das Programm listet sich selbst */
#include <string>
#include <iostream>
using namespace std;
char AS = 34;
char BS = 92;
char NZ = 10;
void c(const string& t) {
cout << t << AS;
unsigned int i = 0;
while (i < t.length()) {
if (t[i] == NZ) cout << BS << 'n' << AS << t[i] << AS;
else cout << t[i];
++i;
}
cout << AS << ')' << ';' << 'c' << '(' << 's' << ')' << ';' << ')' << NZ;
}
int main() { string s("/* Das Programm listet sich selbst */\n"
"#include <string>\n"
"#include <iostream>\n"
"char AS = 34;\n"
"char BS = 92;\n"
"char NZ = 10;\n"
"void c(const string& t) {\n"
" cout << t << AS;\n"
" unsigned int i = 0;\n"
" while (i < t.length()) {\n"
" if (t[i] == NZ) cout << BS << 'n' << AS << t[i] << AS;\n"
" else cout << t[i];\n"
" ++i;\n"
" }\n"
" cout << AS << ')' << ';' << 'c' << '(' << 's' << ')' << ';' << ')' << NZ;\n"
"}\n"
"int main() { string s("); c(s);}
Und genau das versuch ich schon seit gestern in PB hinzukriegen ...
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
dann musst du hingucken:Dare Devil hat geschrieben:@#NULL
Ich seh dort keine (sinnvollen) Loesungen
Code: Alles auswählen
s$="s$= : Debug Mid(s$,1,3)+Chr(34)+s$+Chr(34)+Mid(s$,4,100)" : Debug Mid(s$,1,3)+Chr(34)+s$+Chr(34)+Mid(s$,4,100)
@Dare Devil
das ist doch auch keine gute lösung, schließlich wird einfach der geschriebene Code noch mal als String hinten rangehangen, also das was NULL auch gepostet hat.
MeinerMeinung nach ist das das schnellste in PB:
das ist doch auch keine gute lösung, schließlich wird einfach der geschriebene Code noch mal als String hinten rangehangen, also das was NULL auch gepostet hat.
MeinerMeinung nach ist das das schnellste in PB:
Code: Alles auswählen
ReadFile(1,#PB_Compiler_File) : Debug ReadString(1) : CloseFile(1)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
- Beiträge: 237
- Registriert: 17.10.2008 18:24
- Kontaktdaten:
-
- Beiträge: 237
- Registriert: 17.10.2008 18:24
- Kontaktdaten:
Ja richtig, hab grad nochma in der PB_Hilfe wegen der Konstante nachgeschaut.Kiffi hat geschrieben:datt gildet nich:Dare Devil hat geschrieben:@STARGATE
Hm, ja, moeglich (greift der Compiler hier nich auf die Source-Datei zu?).Dare Devil hat geschrieben:Wie bereits erwaehnt: Dateizugriff nicht gestattet
War grad etwas verwirrt

Interessanters Phänomen :
Sollte ich hier nicht als Ausgabe
Der Trick ist das einzelne " oben im Macro, das verleitet wahrscheinlich den Compiler das auch Variablen in Strings ersetzt werden, oder kanns jemand anders erklären wie das zu stande kommt ?
Code: Alles auswählen
Macro Q : "
EndMacro
Macro CreateCode(Source)
SourceCode$ = "Source"
Source
EndMacro
CreateCode( Debug SourceCode$ )
bekomme ?Source
Der Trick ist das einzelne " oben im Macro, das verleitet wahrscheinlich den Compiler das auch Variablen in Strings ersetzt werden, oder kanns jemand anders erklären wie das zu stande kommt ?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr