Code (cpp):
#include <iostream>
using namespace std;
const char* data[] = {
"int main()",
"{",
"\tsize_t size = sizeof(data)/sizeof(const char*);",
"",
"\tcout << \"#include <iostream>\n\nusing namespace std;\n\nconst char* data[] = {\";",
"",
"\tfor (size_t i = 0; i < size; ++i) {",
"\t\tif (i > 0) {",
"\t\t\tcout << \",\";",
"\t\t}",
"",
"\t\tcout << \"\\n\\t\\\"\";",
"",
"\t\tfor (const char *p = data[i]; *p != 0; ++p) {",
"\t\t\tswitch (*p) {",
"\t\t\tcase \'\\t\':",
"\t\t\t\tcout << \"\\\\t\";",
"",
"\t\t\t\tbreak;",
"\t\t\tcase \'\\n\':",
"\t\t\t\tcout << \"\\\\n\";",
"",
"\t\t\t\tbreak;",
"\t\t\tcase \'\\\"\': case \'\\\'\': case \'\\\\\':",
"\t\t\t\tcout << \"\\\\\" << *p;",
"",
"\t\t\t\tbreak;",
"\t\t\tdefault:",
"\t\t\t\tcout << *p;",
"",
"\t\t\t\tbreak;",
"\t\t\t}",
"\t\t}",
"",
"\t\tcout << \"\\\"\";",
"\t}",
"",
"\tcout << \"\\n};\\n\\n\";",
"",
"\tfor (size_t i = 0; i < size; ++i) {",
"\t\tbool quotes = false;",
"",
"\t\tfor (const char *p = data[i]; *p != 0; ++p) {",
"\t\t\tswitch (*p) {",
"\t\t\tcase \'\n\':",
"\t\t\t\tcout << (quotes ? \"\\\\n\" : \"\\n\");",
"",
"\t\t\t\tbreak;",
"\t\t\tcase \'\t\':",
"\t\t\t\tcout << (quotes ? \"\\\\t\" : \"\\t\");",
"",
"\t\t\t\tbreak;",
"\t\t\tcase \'\\\'\': case \'\\\"\':",
"\t\t\t\tquotes = !quotes;",
"\t\t\t\tcout << *p;",
"",
"\t\t\t\tbreak;",
"\t\t\tdefault:",
"\t\t\t\tcout << *p;",
"",
"\t\t\t\tbreak;",
"\t\t\t}",
"\t\t}",
"",
"\t\tcout << \"\n\";",
"\t}",
"",
"\treturn 0;",
"}"
};
int main()
{
size_t size = sizeof(data)/sizeof(const char*);
cout << "#include <iostream>\n\nusing namespace std;\n\nconst char* data[] = {";
for (size_t i = 0; i < size; ++i) {
if (i > 0) {
cout << ",";
}
cout << "\n\t\"";
for (const char *p = data[i]; *p != 0; ++p) {
switch (*p) {
case '\t':
cout << "\\t";
break;
case '\n':
cout << "\\n";
break;
case '\"': case '\'': case '\\':
cout << "\\" << *p;
break;
default:
cout << *p;
break;
}
}
cout << "\"";
}
cout << "\n};\n\n";
for (size_t i = 0; i < size; ++i) {
bool quotes = false;
for (const char *p = data[i]; *p != 0; ++p) {
switch (*p) {
case '\n':
cout << (quotes ? "\\n" : "\n");
break;
case '\t':
cout << (quotes ? "\\t" : "\t");
break;
case '\'': case '\"':
quotes = !quotes;
cout << *p;
break;
default:
cout << *p;
break;
}
}
cout << "\n";
}
return 0;
}
#include <iostream>
using namespace std;
const char* data[] = {
"int main()",
"{",
"\tsize_t size = sizeof(data)/sizeof(const char*);",
"",
"\tcout << \"#include <iostream>\n\nusing namespace std;\n\nconst char* data[] = {\";",
"",
"\tfor (size_t i = 0; i < size; ++i) {",
"\t\tif (i > 0) {",
"\t\t\tcout << \",\";",
"\t\t}",
"",
"\t\tcout << \"\\n\\t\\\"\";",
"",
"\t\tfor (const char *p = data[i]; *p != 0; ++p) {",
"\t\t\tswitch (*p) {",
"\t\t\tcase \'\\t\':",
"\t\t\t\tcout << \"\\\\t\";",
"",
"\t\t\t\tbreak;",
"\t\t\tcase \'\\n\':",
"\t\t\t\tcout << \"\\\\n\";",
"",
"\t\t\t\tbreak;",
"\t\t\tcase \'\\\"\': case \'\\\'\': case \'\\\\\':",
"\t\t\t\tcout << \"\\\\\" << *p;",
"",
"\t\t\t\tbreak;",
"\t\t\tdefault:",
"\t\t\t\tcout << *p;",
"",
"\t\t\t\tbreak;",
"\t\t\t}",
"\t\t}",
"",
"\t\tcout << \"\\\"\";",
"\t}",
"",
"\tcout << \"\\n};\\n\\n\";",
"",
"\tfor (size_t i = 0; i < size; ++i) {",
"\t\tbool quotes = false;",
"",
"\t\tfor (const char *p = data[i]; *p != 0; ++p) {",
"\t\t\tswitch (*p) {",
"\t\t\tcase \'\n\':",
"\t\t\t\tcout << (quotes ? \"\\\\n\" : \"\\n\");",
"",
"\t\t\t\tbreak;",
"\t\t\tcase \'\t\':",
"\t\t\t\tcout << (quotes ? \"\\\\t\" : \"\\t\");",
"",
"\t\t\t\tbreak;",
"\t\t\tcase \'\\\'\': case \'\\\"\':",
"\t\t\t\tquotes = !quotes;",
"\t\t\t\tcout << *p;",
"",
"\t\t\t\tbreak;",
"\t\t\tdefault:",
"\t\t\t\tcout << *p;",
"",
"\t\t\t\tbreak;",
"\t\t\t}",
"\t\t}",
"",
"\t\tcout << \"\n\";",
"\t}",
"",
"\treturn 0;",
"}"
};
int main()
{
size_t size = sizeof(data)/sizeof(const char*);
cout << "#include <iostream>\n\nusing namespace std;\n\nconst char* data[] = {";
for (size_t i = 0; i < size; ++i) {
if (i > 0) {
cout << ",";
}
cout << "\n\t\"";
for (const char *p = data[i]; *p != 0; ++p) {
switch (*p) {
case '\t':
cout << "\\t";
break;
case '\n':
cout << "\\n";
break;
case '\"': case '\'': case '\\':
cout << "\\" << *p;
break;
default:
cout << *p;
break;
}
}
cout << "\"";
}
cout << "\n};\n\n";
for (size_t i = 0; i < size; ++i) {
bool quotes = false;
for (const char *p = data[i]; *p != 0; ++p) {
switch (*p) {
case '\n':
cout << (quotes ? "\\n" : "\n");
break;
case '\t':
cout << (quotes ? "\\t" : "\t");
break;
case '\'': case '\"':
quotes = !quotes;
cout << *p;
break;
default:
cout << *p;
break;
}
}
cout << "\n";
}
return 0;
}
P.S.
Ako se desi da ne dobijete isti izlaz redirektovanjem standardnog izlaza u fajl (npr. ako vam browser pretvori tabulatore u razmake), onda kompajlirajte taj izlaz. Izlaz je ispravan quine.
Recimo:
$ g++ -o quine main.cpp
$ ./quine > src.cpp
$ g++ -o quine src.cpp
$ ./quine > out
Fajlovi src.cpp i out biće identični.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.