Pull to refresh

Comments 14

К сожалению, не только не причастен, но даже и не подозревал о нём. Спасибо за наводку.
Простите за офтопик, но прочитал как «мультикавайногенератор», и очень удивился :).
Дваждую. Минусуйте сколько угодно, но оно действительно так читается =)
UFO just landed and posted this here
Кто о чем больше осведомлен, тот так и прочитал :)
Я сразу прочитал правильно, а вот ваше слово не с первой попытки.
>> ассоциативность по операции сложения (конкатенации) строк: E (x+y) = Ex + Ey.
По-моему, это свойство называется линейность. Один из критериев линейности функции, оператора…
Ассоциативность — это скобки расставлять.
Это свойство называется аддитивность. Для линейности еще надо умножение на константу.
Если считать умножением строки на число её повторение соответствующее количество раз (в контексте питона это особенно логично), то вот и линейность получаем :)
Большое спасибо, поправил.
Хабр торт.

По существу, хотя, может, это бред: а можно ли как-нибудь упростить себе задачу, если рассмотреть все языки, которые мы хотим использовать в цепочке квайнов, как алгорифмы Маркова или машины Тьюринга?
Ну, у меня были похожие думки, но они слишком далеки от реализации.
Конечно, удобнее всего использовать языки с мощной обработкой строк, идейно близкие к алгорифмам Маркова и машине Поста — рефал, perl, а может быть, даже awk и sed.

Но как максимально обобщить задачу о мультиквайне, я пока не придумал.
Решение вида принтер-принтер-принтер-...-квайн — вот оно, пожалуйста. Причём таких решений может быть много разных.
В статье указаны два: с двумя строками и двойным декорированием и с тремя строками и одинарным декорированием.

Интересно, что добавление каждой ступени к мультипринтеру линейно (а в плохом случае — экспоненциально) увеличивает размер программы.
text = «hello \» world"
P text = «main(){printf(»%s", «hello \\\» world");}
PP text = «main(){printf(»%s",«main(){printf(\»%s\", «hello \\\\\\\» world\");}");}
видите, что там творится с бэкслешами? Они, заразы, удваиваются! (Квайн 30 порядка просто не поместился в память).
Именно поэтому приходится писать окт-код "\134" вместо "\\".

Квайнер же подходит радикально: будучи длиной len(a+b+c) + len(Ex+Ey+Ez), он порождает текст длиной len(Fx+Fy+Fz)+len(x+y+z). То есть, длина квайнера сравнима или меньше длины его результата.

Поэтому следует поискать, как встроить несколько квайнеров в цепочку: принтер1-квайнер2-принтер3-квайнер4…
Ладно, это, пожалуй, тема для статьи.
Ждем статью :) Безумству храбрых поем мы песню…

А по поводу алгорифмов Маркова и т.д., я так понимаю, сложность в том, что у каждого языка свои грамматика и синтаксис, поэтому заставить их читать один текст нельзя. Но можно для каждого написать какой-то минимальный интерпретатор алгорифмов Маркова например, с простой спецификацией. Правда, это уже не задача о квайнах :)
Добавлю свой квайн на Прологе
s(':- s(X),writef("s(%p). %w.",[X,X])'). :- s(X),writef("s(%p). %w.",[X,X]).

Sign up to leave a comment.

Articles