[ Nedeljko @ 23.02.2013. 16:05 ] @
Napravio sam iz zabave jedan C++ quine. To je program koji ne prihvata nikakav ulaz, a na izlazu ispisuje sopstveni kod. Pošto je C++ u pitanju, misli se na C++ kod, to jest sors, a ne binarni kod. Nije mi cilj bio da program bude što kraći, već lepo struktuiran i čitljiv. Evo ga, a ko želi može da okači svoj: 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; } 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. |