| 1 2 |
| Мультиквайн - вынос мозга | |
| От: | kochetkov.vladimir rsdn | ||
| Дата: | 09.11.09 10:12 | ||
| Оценка: | 190 (25) +1 ![]() | ||
Сабж:
Прога представляет собой код на ruby, который выдает на выходе код на питоне, который выдает на выходе код на перле, который выдает на выходе код на луа, который выдает на выходе код на окамле, который выдает на выходе код на хаскелле, который выдает код на си, который выдает код на яве, который выдает код на брейнфаке, который выдает код на вайтспейсе, который выдает код на анлямбде, который выдает код на руби (в доме, который построил Джек, ага). Собственно, этюд заключается в том, чтобы понять — как оно вообще работает P.S.: Я всегда с подозрением относился к японцам, а теперь я их просто боюсь... |
| Re: Мультиквайн - вынос мозга | |
| От: | Muxa | ![]() | |
| Дата: | 09.11.09 14:07 | ||
| Оценка: | ![]() | ||
показал этот код своей девушке:
|
| Re: Мультиквайн - вынос мозга | |
| От: | nikov | ||
| Дата: | 09.11.09 14:38 | ||
| Оценка: | 26 (3) | ||
| Здравствуйте, kochetkov.vladimir, Вы писали: Еще рекомендую: Tupper's self-referential formula Polyglot quines (особенно интересен квайн, одинаково хорошо работающий в Ruby, Perl и JavaScript и состоящий только из спецсимволов, без букв и цифр) |
| Re[2]: Мультиквайн - вынос мозга | |
| От: | Кодт модератор | ||
| Дата: | 09.11.09 15:51 | ||
| Оценка: | 5 (1) +2 | ||
| Здравствуйте, nikov, Вы писали: N>Tupper's self-referential formula Формула сперва показалась мне офигительной, а потом я понял, что это фигня! Пусть h — высота картинки. Тогда линейный индекс пиксела j(x,y) = h*x+(y`mod`h) Функция, возвращающая j-й бит в числе m, b(m,j) = floor(m/2**j)`mod`2 Подставляем b(m,x,y) = b(m,j(x,y)) Избавляемся от m: m = floor(y/h), где y = y0*h+dy Ну и несложно убедиться, что k/17 — это развёртка по столбцам той самой битмапки. Так что весь квест — в том, чтобы придумать формулу, занимающую как можно меньшую площадь ... << RSDN@Home 1.2.0 alpha 4 rev. 1237>> Перекуём баги на фичи! |
| Re[3]: Мультиквайн - вынос мозга | |
| От: | ghost92 | ||
| Дата: | 10.11.09 09:01 |
| Здравствуйте, Кодт, Вы писали: К>Здравствуйте, nikov, Вы писали: N>>Tupper's self-referential formula К>Формула сперва показалась мне офигительной, а потом я понял, что это фигня! полностью согласен. Если разобраться... банально, но, как такое придумать, пока до тебя этого никто раньше не делал. К>Пусть h — высота картинки. К>Тогда линейный индекс пиксела j(x,y) = h*x+(y`mod`h) К>Функция, возвращающая j-й бит в числе m, b(m,j) = floor(m/2**j)`mod`2 К>Подставляем b(m,x,y) = b(m,j(x,y)) К>Избавляемся от m: m = floor(y/h), где y = y0*h+dy К>Ну и несложно убедиться, что k/17 — это развёртка по столбцам той самой битмапки. К>Так что весь квест — в том, чтобы придумать формулу, занимающую как можно меньшую площадь |
| Re[3]: Мультиквайн - вынос мозга | |
| От: | vadimcher | ||
| Дата: | 11.11.09 19:37 |
| Здравствуйте, Кодт, Вы писали: К>Здравствуйте, nikov, Вы писали: N>>Tupper's self-referential formula К>Формула сперва показалась мне офигительной, а потом я понял, что это фигня! У меня была точно такая же реакция. А вот зайца кому, зайца-выбегайца?! ![]() |
| Re: Мультиквайн - вынос мозга | |
| От: | Кодт модератор | ||
| Дата: | 14.11.09 18:26 | ||
| Оценка: | 5 (1) | ||
| Здравствуйте, kochetkov.vladimir, Вы писали: KV>Прога представляет собой код на ruby, который выдает на выходе код на питоне, который выдает на выходе код на перле, который выдает на выходе код на луа, который выдает на выходе код на окамле, который выдает на выходе код на хаскелле, который выдает код на си, который выдает код на яве, который выдает код на брейнфаке, который выдает код на вайтспейсе, который выдает код на анлямбде, который выдает код на руби (в доме, который построил Джек, ага). KV>Собственно, этюд заключается в том, чтобы понять — как оно вообще работает Запустить интерпретаторы оных языков и последовательно посмотреть, что там творится. Общая идея, как сделать квайн первого ранга (из себя в себя) — несложная.
Строки в кавычках составляют словарь операторов языка программы (язык программы является подмножеством языка программирования). На самом деле, там немножко хитрее, потому что для вывода кавычек внутри строк придётся либо упражняться с подстановками, либо нарезать строку на более мелкие куски. Для квайна второго ранга нам потребуются два комплекта операторов
Ну и так далее, очевидно, для произвольного ранга: "вывод nachala", "vyvod BEGIN", "print начала"... Перекуём баги на фичи! |
| Re[2]: Мультиквайн - вынос мозга | |
| От: | Кодт модератор | ||
| Дата: | 14.11.09 21:08 | ||
| Оценка: | 20 (2) | ||
| случайно наткнулся на хабре про проекции Футурамы http://habrahabr.ru/blogs/crazydev/47418/ может, как-то ими воспользоваться для квайнения... надо подумать. Перекуём баги на фичи! |
| Re[3]: Мультиквайн - вынос мозга | |
| От: | kochetkov.vladimir rsdn | ||
| Дата: | 15.11.09 11:14 | ||
| Оценка: | ![]() | ||
| Здравствуйте, Кодт, Вы писали: К>случайно наткнулся на хабре про проекции Футурамы Ты злодей. Я пока до комментов не дочитал, его имя воспринимал именно так К>http://habrahabr.ru/blogs/crazydev/47418/ К>может, как-то ими воспользоваться для квайнения... надо подумать. Для квайнения хз, тоже в голове крутится, что как-то можно. Зато можно новые виды квайнов придумать: Квайн первой проекции Футамуры: программа, печатающая исходный текст своего интерпретатора, специализированного исходным текстом самой программы Квайн второй проекции Футамуры: программа, печатающая исходный текст компилятора, специализированного квайном первой проекции Квайн третьей проекции Футамуры: программа, печатающая исходный текст генератора компиляторов, специализированного квайном второй проекции |
| Re[2]: Мультиквайн - вынос мозга | |
| От: | Кодт модератор | ||
| Дата: | 15.11.09 18:44 |
| Мультиквайн питон-С++, ужасно многословный из-за "чистого" подхода. Константы захардкожены, — лень было заниматься их программной подстановкой. Питон...
...который превращается в С++...
Как видите, ничего сложного нет. Кавычки специально взял разные (" = 34 и ' = 39), чтобы показать, что нас это не волнует А если вместо нескольких разных массивов использовать один (многомерный либо просто последовательный — склеить массивы c[] и p[], и брать правильные индексы) — то всё будет ещё короче! На эзотерических языках, таких, как батфайлы или брейнфак, будет, конечно, мучительнее. Например, у батфайлов будет много возни с экранированием процентов. А у брейнфака структура программы, в силу исходной бедности языка, станет кудрявой (с множеством циклов). Перекуём баги на фичи! |
| Re[2]: Мультиквайн - вынос мозга | |
| От: | Кодт модератор | ||
| Дата: | 16.11.09 12:33 | ||
| Оценка: | 82 (7) | ||
| Мультиквайн, кстати, может быть построен и ещё проще. Поскольку основа квайна — это текст, выводящийся дважды (один раз как есть, другой раз в кавычках), можно построить такую схему (Пусть это будет Си в 4 степени)
И именно magic_puts будет отвечать за логику квайна. Но пока что выполним подстановку...
Теперь всё готово для квайнения!
ВНИМАНИЕ! Это эскиз, который ещё не работает. Где-то я очепятался с кавычками-шмавычками. Попробую написать генератор сишного мультиквайна, чтобы избежать ручной работы. Заодно можете сами попробовать сделать это. ... << RSDN@Home 1.2.0 alpha 4 rev. 1237>> Перекуём баги на фичи! |
| Re: Мультиквайн - вынос мозга | |
| От: | Кодт модератор | ||
| Дата: | 16.11.09 20:14 | ||
| Оценка: | 54 (4) | ||
| Написал генератор одноязычных мультиквайнов (си). http://files.rsdn.ru/4783/quines-exp.zip — самый наглядный http://files.rsdn.ru/4783/quines-gentle.zip — избавился от экспоненты ( http://files.rsdn.ru/4783/quines-tiny.zip — убрал все пробелы и комментарии В качестве генератора использую питон и два шаблона на си. Вкратце, идея этой адской машинки: Квайн состоит из 1) шаблона программы "printer", выполняющей печать текста — т.е. unescape. 2) шаблона программы "quine", творчески выполняющего escape своего собственного текста, а также принтера. Шаблон принтера очень простой
Наложение шаблона printer — это escape во время генерации и unescape во время исполнения. Сначала мы возводим фиктивную строку с маркером /*QUINE*/ в N-ную степень наложения шаблона printer. Если на этой стадии мы скомпилируем-исполним полученную программу, её вывод будет — (N-1)-я степень. Проделав эту операцию N раз, снова получим /*QUINE*/ Таким образом, наш N-printer — это программа, представляющая собой строку P1+"/*QUINE*/"+P2 Её легко разбить относительно маркера на P1 и P2 (голову и хвост принтера). Следующий шаг: рожаем квайн, печатающий себя в окружении принтера! Его структура такова
Назовём наши программы alfa (самый внешний принтер), bravo, charlie, ....., juliet (самый внутренний принтер), kilo (квайн). Генератор мысленно рожает alfa(bravo(charlie(....(juliet("/*QUINE*/"))....))) и затем рожает __QUINE.c, являющийся, по сути __kilo.c Чтобы получить __alfa.c, достаточно скомпилировать и выполнить __QUINE. Самый сок — в способе эскейпа. Как известно, в Си одни и те же символы можно эскейпнуть разными способами. — \ превращается в \\ либо в \x5C — " превращается в \" либо в \x22 Если возведём одиночный бэкслеш в N-ную степень эскейпа, то в первом случае получим 2^N слешей, а во втором — один \ и N x5C (итого 3N+1) Ну а возведение " вообще рожает фрактал — опять-таки, длиной 2^N, либо один \ и N x22 (аналогично) Поэтому будьте аккуратны с quines-exp.zip — __alfa.c занимает размер 18 Мегабайт! При том, что __kilo.c — всего лишь 19 килобайт. Немудрено: 2^10 ~ 1000. А после того, как я избавился от экспоненты, __alfa.c стал 20 килобайт, а __kilo.c — 4.5 килобайт. Т.е. примерно 3 раза. После избавления от всех лишних пробельных символов и комментариев, получается __alfa.c = 7151 байт, __kilo.c = 2451 байт. Несложно сделать и гетерогенный квайн. Только придётся немного допилить мой генератор (он сейчас эскейпит строки строго в сишном синтаксисе), сделать шаблоны принтеров на разных языках — и натравить их друг на друга. ... << RSDN@Home 1.2.0 alpha 4 rev. 1237>> Перекуём баги на фичи! |
| Re[2]: Мультиквайн - вынос мозга | |
| От: | Кодт модератор | ||
| Дата: | 16.11.09 20:44 |
| К>Несложно сделать и гетерогенный квайн. К>Только придётся немного допилить мой генератор (он сейчас эскейпит строки строго в сишном синтаксисе), сделать шаблоны принтеров на разных языках — и натравить их друг на друга. Кстати, стало очевидно, как умудрились подверстать брейнфак и вайтспейс в оригинальный мультиквайн. Это не квайны, а принтеры. Уж что-что, а вывести произвольный текст — можно на любом языке, даже не тьюринг-полном. Насколько я понял, квайн там то ли на хаскелле, то ли на яве, а всё остальное — генераторы. Сейчас не могу запустить исходник на руби, чтобы посмотреть точно. Там какая-то творческая беда с кодировками, один раз получилось, потом случайно стёр и забыл. ... << RSDN@Home 1.2.0 alpha 4 rev. 1237>> Перекуём баги на фичи! |
| Re[2]: Мультиквайн - вынос мозга | |
| От: | kochetkov.vladimir rsdn | ||
| Дата: | 16.11.09 23:26 | ||
| Оценка: | +3 ![]() | ||
| Здравствуйте, Кодт, Вы писали: К>Написал генератор одноязычных мультиквайнов (си). Теперь я понимаю, что японцы — это еще не самое страшное... |
| Re[3]: Мультиквайн - вынос мозга | |
| От: | Кодт модератор | ||
| Дата: | 17.11.09 12:05 |
| Здравствуйте, kochetkov.vladimir, Вы писали: KV>Теперь я понимаю, что японцы — это еще не самое страшное... Отож! Псевдокод гетерогенного квайна по моей схеме
Что мне здесь не нравится: квайн вынужден уметь эскейпить eall(), а не только e0(). То есть, квайн вынужден знать про все остальные языки. Ваши предложения? ... << RSDN@Home 1.2.0 alpha 4 rev. 1237>> Перекуём баги на фичи! |
| Re[2]: Мультиквайн - вынос мозга | |
| От: | McSeem2 | ||
| Дата: | 19.11.09 18:49 | ||
| Оценка: | 1 (1) +1 | ||
| Здравствуйте, Кодт, Вы писали: К>Написал генератор одноязычных мультиквайнов (си). Кодт, ты реально крут! Сиреневенькая мозговыколупывательница с преподвыподвертом. McSeem Socrates said "to be is to do". Jean-Paul Sartre said "to do is to be". Frank Sinatra said "to be do be do". |
| Re[2]: Мультиквайн - вынос мозга | |
| От: | McSeem2 | ||
| Дата: | 19.11.09 19:30 | ||
| Оценка: | ![]() | ||
| Здравствуйте, Кодт, Вы писали: К>Написал генератор одноязычных мультиквайнов (си). Кстати, вот вам и ответ на главный вопрос о Жизни, Вселенной и всего такого — в оценках получилось 42. Просьба не портить! McSeem Socrates said "to be is to do". Jean-Paul Sartre said "to do is to be". Frank Sinatra said "to be do be do". |
| Re[4]: Мультиквайн - вынос мозга | |
| От: | Кодт модератор | ||
| Дата: | 20.11.09 08:59 |
| К>Что мне здесь не нравится: квайн вынужден уметь эскейпить eall(), а не только e0(). К>То есть, квайн вынужден знать про все остальные языки. Продумал! Идея состоит в том, что экранирование строки дистрибутивно: e(a+b) = e(a)+e(b) Вообще-то, это необязательно. Скажем, для брейнфака более короткая запись будет инкрементная:
чем дистрибутивная
Таким образом: 1) Для языков 1..N определяем функции экранирования e1..eN и порождения принтеров p1..pN — к функциям экранирования требование дистрибутивности: e(a+b) = e(a)+e(b) — к функциям принтеров: p(s) = h + e(s) + t 2) Создаём мультипринтер: программу, печатающую программу, печатающую... печатающую заданную строку — eall(s) = e1(e2(...eN(s)...)) = concat(map((e1.e2...eN), s) — pall(s) = p1(p2(...pN(s)...)) = h1+e1(h2+e2(...(hN1+eN1(hN))...)) + eall(s) + e1(e2(...(eN1(tN)+tN1)...)+t2)+t1 Функцию eall удобно представить таблично: применить её к каждой букве. А функцию pall => hall,tall — поиском строки eall(TAG) в строке pall(TAG), хотя, конечно, можно и на основе { (pK,tK) } цепным суммированием (чтобы гарантированно не нарваться на случайное вхождение тэга в код принтера). 3) Гетероквайн на языке 0, печатающий код мультипринтера, печатающего код гетероквайна — содержит — табличную реализацию eall — тем самым, нам нет нужды кодировать алгоритм на языке квайна и тащить туда знания о языках всех принтеров — алгоритмическую реализацию e0 — это мы можем позволить — строки hall,tall — строки — фрагменты кода квайна с дырками вместо определений строк этих фрагментов — форматный вывод текста: hall + eall( фрагменты и e0(фрагменты) ) + tall ... << RSDN@Home 1.2.0 alpha 4 rev. 1237>> Перекуём баги на фичи! |
| Re[5]: Мультиквайн - вынос мозга | |
| От: | Аноним 813 | ||
| Дата: | 24.11.09 14:08 |
| а дальше? ^_^ p.s. так не долго и мозговой завороткишок получить |
| Re[6]: Мультиквайн - вынос мозга | |
| От: | Кодт модератор | ||
| Дата: | 24.11.09 14:58 |
| Здравствуйте, <Аноним>, Вы писали: А>а дальше? ^_^ А дальше сами давайте, присоединяйтесь! Подзадачи: 1) Как видно, дистрибутивность функции экранирования радикально упрощает нам жизнь. Но для брейнфака, вайтспейса и, наверно, унлямбды, это даёт большую избыточность. Поэтому было бы интересно по возможности обойтись без дистрибутивности 2) Экранировать можно по-всякому. В том числе — представить строку как массив чисел. 3) Попробовать выразить всё одним-махом-семерых-убивахом:
и т.д... А>p.s. так не долго и мозговой завороткишок получить Заворот котiв уже случился! Всю неделю в фоновом режиме об этом думаю. ... << RSDN@Home 1.2.0 alpha 4 rev. 1237>> Перекуём баги на фичи! |
| 1 2 |