Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zabava - C/C++ Quine-ovi

[es] :: C/C++ programiranje :: Zabava - C/C++ Quine-ovi

[ Pregleda: 975 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2789 Profil

icon Zabava - C/C++ Quine-ovi23.02.2013. u 16:05 - pre 135 meseci
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.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Zabava - C/C++ Quine-ovi

[ Pregleda: 975 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.