Re[2]: Мультиквайн - вынос мозга в избранное  новое ответить всё   подписка   модер. 
От: Кодт модератор 
Дата: 15.11.09 18:44
Мультиквайн питон-С++, ужасно многословный из-за "чистого" подхода.
Константы захардкожены, — лень было заниматься их программной подстановкой.
Питон...
c = [
    '#include <iostream>',
    'using namespace std;',
    'const char* const c[14] = {',
    '};',
    'const char* const p[9] = {',
    '};',
    'int main()',
    '{',
    '    for(int i=0; i!= 1; ++i) cout << p[i] << endl;',
    '    for(int i=0; i!=14; ++i) cout << char(9) << char(39) << c[i] << char(39) << char(44) << endl;',
    '    for(int i=1; i!= 3; ++i) cout << p[i] << endl;',
    '    for(int i=0; i!= 9; ++i) cout << char(9) << char(39) << p[i] << char(39) << char(44) << endl;',
    '    for(int i=3; i!= 9; ++i) cout << p[i] << endl;',
    '}',
    ]
p = [
    'c = [',
    '    ]',
    'p = [',
    '    ]',
    'for i in range(0, 3) : print c[i]',
    'for i in range(0,14) : print chr(9)+chr(34)+c[i]+chr(34)+chr(44)',
    'for i in range(3, 5) : print c[i]',
    'for i in range(0, 9) : print chr(9)+chr(34)+p[i]+chr(34)+chr(44)',
    'for i in range(5,14) : print c[i]',
    ]
for i in range(0, 3) : print c[i]
for i in range(0,14) : print chr(9)+chr(34)+c[i]+chr(34)+chr(44)
for i in range(3, 5) : print c[i]
for i in range(0, 9) : print chr(9)+chr(34)+p[i]+chr(34)+chr(44)
for i in range(5,14) : print c[i]

...который превращается в С++...
#include <iostream>
using namespace std;
const char* const c[14] = {
    "#include <iostream>",
    "using namespace std;",
    "const char* const c[14] = {",
    "};",
    "const char* const p[9] = {",
    "};",
    "int main()",
    "{",
    "    for(int i=0; i!= 1; ++i) cout << p[i] << endl;",
    "    for(int i=0; i!=14; ++i) cout << char(9) << char(39) << c[i] << char(39) << char(44) << endl;",
    "    for(int i=1; i!= 3; ++i) cout << p[i] << endl;",
    "    for(int i=0; i!= 9; ++i) cout << char(9) << char(39) << p[i] << char(39) << char(44) << endl;",
    "    for(int i=3; i!= 9; ++i) cout << p[i] << endl;",
    "}",
};
const char* const p[9] = {
    "c = [",
    "    ]",
    "p = [",
    "    ]",
    "for i in range(0, 3) : print c[i]",
    "for i in range(0,14) : print chr(9)+chr(34)+c[i]+chr(34)+chr(44)",
    "for i in range(3, 5) : print c[i]",
    "for i in range(0, 9) : print chr(9)+chr(34)+p[i]+chr(34)+chr(44)",
    "for i in range(5,14) : print c[i]",
};
int main()
{
    for(int i=0; i!= 1; ++i) cout << p[i] << endl;
    for(int i=0; i!=14; ++i) cout << char(9) << char(39) << c[i] << char(39) << char(44) << endl;
    for(int i=1; i!= 3; ++i) cout << p[i] << endl;
    for(int i=0; i!= 9; ++i) cout << char(9) << char(39) << p[i] << char(39) << char(44) << endl;
    for(int i=3; i!= 9; ++i) cout << p[i] << endl;
}

Как видите, ничего сложного нет.
Кавычки специально взял разные (" = 34 и ' = 39), чтобы показать, что нас это не волнует

А если вместо нескольких разных массивов использовать один (многомерный либо просто последовательный — склеить массивы c[] и p[], и брать правильные индексы) — то всё будет ещё короче!

На эзотерических языках, таких, как батфайлы или брейнфак, будет, конечно, мучительнее.
Например, у батфайлов будет много возни с экранированием процентов.
А у брейнфака структура программы, в силу исходной бедности языка, станет кудрявой (с множеством циклов).
Перекуём баги на фичи!