| Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | kochetkov.vladimir rsdn | http://vkochetkov.blogspot.com |
| Дата: | 09.11.09 11:12 | |
| Оценка: | 190 (25) ![]() | |
Сабж:
Прога представляет собой код на ruby, который выдает на выходе код на питоне, который выдает на выходе код на перле, который выдает на выходе код на луа, который выдает на выходе код на окамле, который выдает на выходе код на хаскелле, который выдает код на си, который выдает код на яве, который выдает код на брейнфаке, который выдает код на вайтспейсе, который выдает код на анлямбде, который выдает код на руби (в доме, который построил Джек, ага). Собственно, этюд заключается в том, чтобы понять — как оно вообще работает P.S.: Я всегда с подозрением относился к японцам, а теперь я их просто боюсь... "Не станет он искать побед. Он ждет, чтоб высшее начало его все чаще побеждало, чтобы расти ему в ответ" (с) Р. Рильке. | |
| Re: Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Muxa |
| |
| Дата: | 09.11.09 15:07 | ||
| Оценка: | ![]() | ||
показал этот код своей девушке:
Ищешь программиста CUDA? | Ищу интересные проекты. Jacket: GPU плагин для Матлаба |
| Re[2]: Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Кодт модератор | |
| Дата: | 16.11.09 13:33 | |
| Оценка: | 82 (7) | |
| Мультиквайн, кстати, может быть построен и ещё проще. Поскольку основа квайна — это текст, выводящийся дважды (один раз как есть, другой раз в кавычках), можно построить такую схему (Пусть это будет Си в 4 степени)
И именно magic_puts будет отвечать за логику квайна. Но пока что выполним подстановку...
Теперь всё готово для квайнения!
ВНИМАНИЕ! Это эскиз, который ещё не работает. Где-то я очепятался с кавычками-шмавычками. Попробую написать генератор сишного мультиквайна, чтобы избежать ручной работы. Заодно можете сами попробовать сделать это. ... << RSDN@Home 1.2.0 alpha 4 rev. 1237>> Перекуём баги на фичи! |
| Re[2]: Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | kochetkov.vladimir rsdn | http://vkochetkov.blogspot.com |
| Дата: | 17.11.09 00:26 | |
| Оценка: | +3 ![]() | |
| Здравствуйте, Кодт, Вы писали: К>Написал генератор одноязычных мультиквайнов (си). Теперь я понимаю, что японцы — это еще не самое страшное... "Не станет он искать побед. Он ждет, чтоб высшее начало его все чаще побеждало, чтобы расти ему в ответ" (с) Р. Рильке. | |
| Re: Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Кодт модератор | |
| Дата: | 16.11.09 21: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: Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | nikov | My buzz |
| Дата: | 09.11.09 15:38 | |
| Оценка: | 26 (3) | |
| Здравствуйте, kochetkov.vladimir, Вы писали: Еще рекомендую: Tupper's self-referential formula Polyglot quines (особенно интересен квайн, одинаково хорошо работающий в Ruby, Perl и JavaScript и состоящий только из спецсимволов, без букв и цифр) Microsoft MVP 2010 |
| Re[2]: Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Кодт модератор | |
| Дата: | 09.11.09 16: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]: Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | kochetkov.vladimir rsdn | http://vkochetkov.blogspot.com |
| Дата: | 15.11.09 12:14 | |
| Оценка: | ![]() | |
| Здравствуйте, Кодт, Вы писали: К>случайно наткнулся на хабре про проекции Футурамы Ты злодей. Я пока до комментов не дочитал, его имя воспринимал именно так К>http://habrahabr.ru/blogs/crazydev/47418/ К>может, как-то ими воспользоваться для квайнения... надо подумать. Для квайнения хз, тоже в голове крутится, что как-то можно. Зато можно новые виды квайнов придумать: Квайн первой проекции Футамуры: программа, печатающая исходный текст своего интерпретатора, специализированного исходным текстом самой программы Квайн второй проекции Футамуры: программа, печатающая исходный текст компилятора, специализированного квайном первой проекции Квайн третьей проекции Футамуры: программа, печатающая исходный текст генератора компиляторов, специализированного квайном второй проекции "Не станет он искать побед. Он ждет, чтоб высшее начало его все чаще побеждало, чтобы расти ему в ответ" (с) Р. Рильке. | |
| Re[2]: Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Кодт модератор | |
| Дата: | 14.11.09 22:08 | |
| Оценка: | 20 (2) | |
| случайно наткнулся на хабре про проекции Футурамы http://habrahabr.ru/blogs/crazydev/47418/ может, как-то ими воспользоваться для квайнения... надо подумать. Перекуём баги на фичи! |
| Re[2]: Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | McSeem2 | http://www.antigrain.com |
| Дата: | 19.11.09 19: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[7]: Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Spiceman | |
| Дата: | 24.11.09 16:41 | |
| Оценка: | +1 ![]() | |
| Здравствуйте, Кодт, Вы писали: А>>а дальше? ^_^ К>А дальше сами давайте, присоединяйтесь! Прочитал всю тему, под конец начался смех, переходящий в истерический |
| Re: Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Кодт модератор | |
| Дата: | 14.11.09 19:26 | |
| Оценка: | 5 (1) | |
| Здравствуйте, kochetkov.vladimir, Вы писали: KV>Прога представляет собой код на ruby, который выдает на выходе код на питоне, который выдает на выходе код на перле, который выдает на выходе код на луа, который выдает на выходе код на окамле, который выдает на выходе код на хаскелле, который выдает код на си, который выдает код на яве, который выдает код на брейнфаке, который выдает код на вайтспейсе, который выдает код на анлямбде, который выдает код на руби (в доме, который построил Джек, ага). KV>Собственно, этюд заключается в том, чтобы понять — как оно вообще работает Запустить интерпретаторы оных языков и последовательно посмотреть, что там творится. Общая идея, как сделать квайн первого ранга (из себя в себя) — несложная.
Строки в кавычках составляют словарь операторов языка программы (язык программы является подмножеством языка программирования). На самом деле, там немножко хитрее, потому что для вывода кавычек внутри строк придётся либо упражняться с подстановками, либо нарезать строку на более мелкие куски. Для квайна второго ранга нам потребуются два комплекта операторов
Ну и так далее, очевидно, для произвольного ранга: "вывод nachala", "vyvod BEGIN", "print начала"... Перекуём баги на фичи! |
| Re[2]: Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Кодт модератор | |
| Дата: | 19.12.09 21:22 | |
| Оценка: | 1 (1) | |
| Здравствуйте, xonixx, Вы писали: X>Чисто для протокола X>http://habrahabr.ru/blogs/crazydev/75663/ Чисто для протокола, может, и ссылку на здешнюю дискуссию кинешь на хабр? Перекуём баги на фичи! |
| Re[2]: Мультиквайн - вынос мозга | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | McSeem2 | http://www.antigrain.com |
| Дата: | 19.11.09 20: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". |