Подобно другим головоломкам Куайна (точнее, этой ), напишите программу, которая сама создает исходный код.
Вот новый поворот: полученный код НЕ должен быть идентичен исходному. Скорее, он должен вывести другую программу, которая создаст первую.
Задача, связанная с вышеупомянутым, достигла этого путем перехода между двумя языками. Я думаю, что это будет сделано только на одном языке , но две (или более) версии источника должны значительно отличаться (см. Правила ниже). При таком ограничении односимвольные ответы будут запрещены, что потребует немного больше обдумывания для окончательного представления.
ПРАВИЛА
- Ваш код должен быть написан только на одном языке. (Несколько заявок, по одной для каждого языка вполне приемлемо.)
- Ваши разные версии кода должны быть синтаксически различны. Другими словами, если вы хотите нарисовать абстрактное синтаксическое дерево для вашего кода, должен быть хотя бы один другой узел.
- Поставляя в AST не будет необходимости, но если вы чувствуете , склонны предоставлять по одному для каждой из ваших программ, он бы помочь в оценке.
- Вы можете создавать столько итераций, сколько пожелаете, если они все остаются синтаксически различными. (Подробнее поможет ваш счет, см. Ниже.)
SCORING
Ваша итоговая оценка будет означать среднюю продолжительность всех ваших программ, поделенную на количество программ.
Пример 1:
A (источник для B) = 50 символов
B (источник для A) = 75 символов
Окончательная оценка = 31,25
Пример 2:
A (источник для B) = 50 символов
B (источник для C) = 75 символов
C (источник для A) = 100 символов
Окончательная оценка = 25
Ответы:
Python, 0 (ограничение (68 + 3 n ) / (16 n ))
Если два абстрактных синтаксических дерева различны, если они имеют разные константы,
Есть 16 п программ длиной не более 68 + 3n, дающие асимптотическую оценку 0.
Если вам нужны программы с переменной структурой, мы можем реализовать двоичный сумматор на n битах. Здесь есть 2 n программ длины O ( n 2 ). Идет в цикле из-за сброшенного переносного бита.
источник
pass
будет меняться наt=n(t)
и обратно, во всех 2 ^ n комбинациях.Perl, оценка 110,25
Я должен признать, что я не очень хорош с муками. Я на 100% уверен, что есть возможности для улучшения. Решение основано на том же принципе решения Element ниже.
Первая программа - 264 символа.
Вторая программа - 177 символов.
Я работаю над AST для этой записи (и записи Element).
Элемент , оценка 47,25
Первая программа 105 символов.
Вторая программа - 84 символа.
Я уверен, что есть много возможностей для улучшения.
В первой программе есть одна строка (в которой каждый символ экранирован, несмотря на большую избыточность), за которой следуют исполняемые части A и B. Часть A делает несколько вещей: печатает строку и экранирует каждый символ, печатает последнюю половину строки (которая является источником для части B), а затем не позволяет части B, которая следует за ней, что-либо делать.
Вторая программа - та же строка, за которой следует часть B. Часть B основана на простой квине; он печатает строку, которой предшествует экранированная версия. Это означает, что он печатает строку, и обе части A и B.
источник
[]{}
, что любая команда может быть размещена в любом месте всей программы, не вызывая синтаксической ошибки. Это идеально.VBA: (251 + 216) / 2/2 = 116,75
251
216
Это запускается в MSAccess для использования
Module
объекта. Модуль назван"Q"
для игры в гольф. Разница в синтаксисе происходит отIf ... Then
отсутствия в более короткой версии.источник
vbCrLF
вvbCr
С ++, оценка 0,734194
Следующий исходный код выводит мета-квин порядка 999 на консоль (пояснение ниже):
Единственная строка, которая изменяется, это первая строка. Значение
X
будет 1000, 999, 998, ..., 3, 2, и затем оно начнется снова. Однако для того, чтобы каждый раз получать разные синтаксические деревья,X
представляется с точки зрения его факторизации простых чисел, где каждое простое число записывается в виде суммы1
s. AST различны, потому что основная факторизация целых чисел различна для каждого значения.Программа напечатает сама себя, за исключением того, что первая строка будет изменена, а обратные слеши, разрывы строк и отступы
Q(...)
будут удалены.Следующая программа вычисляет оценку моего ответа:
Это напечатало 0.734194 к консоли. Очевидно, что 1000 можно заменить большими целыми числами, и в качестве предела счет приблизится к 0. Математическое доказательство с использованием дзета-функции Римана несколько запутано. Я оставляю это в качестве упражнения для читателя. ;)
источник
JavaScript,
84,56461Две программы, обе длины
169128122.Прежде чем я играл в гольф, для вашего удовольствия от просмотра:
Возвращает новую программу и выводит текущую часть!
Я мог бы сделать его короче без регулярного выражения, но ... я не хочу.источник
J - (24 + 30) / 2/2 = 13,5 балла
Обратите внимание , что строки в J не обратные косая черта маскирования, но цитата маскирования а - ля Паскаля:
'I can''t breathe!'
.Программа 1 имеет AST,
noun verb hook noun
а программа 2 имеет ASTnoun
. Программа 2 является цитированной версией программы 1, которая при запуске просто возвращает программу 1, поэтому этот метод нельзя легко расширить до трех копий: PПрограмма 1 работает, взяв копию кодовой части исходного кода, с кавычкой, добавленной впереди, и добавив пять из этих кавычек в конец (
(,5#{.)
). Затем он циклически берет 30 символов из этой 16-символьной строки, что дает в результате именно Программу 2.источник