Вдохновленный гиперпрограммированием: N + N, N × N, N ^ N все в одном .
Спасибо @MartinEnder и @trichoplax за их помощь в песочнице.
Определения
Hyperquines
Определите гиперхине порядка n как полную программу или функцию P , аналогичную квине , которая удовлетворяет всем правилам, применимым к правильным квинам, и, кроме того, имеет следующую структуру.
P - объединение групп символов ‡ , состоящих из n копий одного и того же символа. Когда P выполняется, выводом является конкатенация тех же групп, дополненная еще одной копией символа.
Примеры
На гипотетическом языке программирования, где исходный код
aabbcc
генерирует выходные данныеaaabbbccc
, эта программа представляет собой гиперхин порядка 2 .Определение не требует, чтобы символы разных групп были разными.
Если исходный код
aabbcc
генерирует выходные данныеaaaabbbbcccc
, программа является гиперхинейой порядка 1 ; Исходный код состоит из шести односимвольных групп, вывод из шести пар символов.В GS2 пустая программа печатает
\n
, и программа\n
печатает\n\n
. Однако ни гиперхины , ни они\n
не\n\n
являются, так как они не удовлетворяют всем свойствам собственных хининов ; ни одна часть исходного кода не кодирует другую часть вывода.
Гиперквиновые цепи
Определите гиперхиневу цепочку длины n как конечную последовательность из n полных программ или n функций
(P 1 ,…, P n ), которая удовлетворяет следующим ограничениям.
Выходы P 1 ,…, P n-1 равны P 2 ,…, P n соответственно.
P 1 ,…, P n - гиперхины.
Порядки P 1 ,…, P n образуют строго возрастающую последовательность смежных целых чисел.
Наконец, определим бесконечную цепочку гиперхинов как бесконечную последовательность полных программ или функций (P 1 , P 2 ,…), такую, что каждый начальный интервал (P 1 ,…, P n ) составляет цепочку гиперхин длины n .
Примеры
В гипотетическом языке программирования, где исходный код
aabbcc
генерирует выходные данныеaaabbbccc
, которые, в свою очередь, генерируют выходные данныеaaaabbbbcccc
, пара (aabbcc
,aaabbbccc
) образует цепочку гиперхинов длиной 2 .Обратите внимание, что
aaaabbbbcccc
- вывод последней гиперхины в цепочке - не должен производить конкретный вывод; это даже не должен быть действительный исходный код.Продолжая предыдущий пример, если
aaaabbbbcccc
формирует выходной сигналaaaaabbbbbccccc
, триплет (aabbcc
,aaabbbccc
,aaaabbbbcccc
) представляет собой hyperquine цепь длиной 3 .Если эта картина продолжается вечно, последовательность (
aabbcc
,aaabbbccc
,aaaabbbbcccc
...) представляет собой бесконечную цепь hyperquine.Пара программ (
abc
,aabbcc
) с выходами (aabbcc
,aaaabbbbcccc
) не является цепью гиперхина, поскольку порядки гиперхинов обе равны 1 , поэтому они не образуют строго возрастающую последовательность.Пара программ (
aabbcc
,aaaabbbbcccc
) с выходами (aaaabbbbcccc
,aaaaabbbbbccccc
) не является цепью гиперхин, поскольку порядки гиперхинов равны 1 и 4 , поэтому они не образуют последовательность смежных целых чисел.
правила
задача
На выбранном вами языке программирования напишите нетривиальную цепочку гиперхинов, т. Е. Цепочку, состоящую как минимум из двух гиперхинов.
Как обычно, ваши программы не могут вводить данные или получать доступ к своему исходному коду в любой форме.
Если ваш переводчик печатает неявную новую строку, ваши гиперхины должны учитывать это.
Применяются все стандартные лазейки, особенно те, которые связаны с куинами.
счет
Самая длинная цепь гиперхина побеждает. Если два или более представления связаны, то представление среди них, которое начинается с самой короткой гиперхины (измеряется символами ‡ ), выигрывает. Как обычно, время публикации является окончательным тай-брейком.
‡ Вы должны использовать одинаковую кодировку символов для исходного кода, вывода, количества символов и выполнения. Например, программа Python print 42
является не 2-символов UTF-32 представления, так как интерпретатор обрабатывает каждый байт как один символ. Если выбранный вами язык не основан на символах, обрабатывайте все отдельные байты как символы.
Ответы:
Befunge-98 , бесконечный порядок,
54523836 байтВторой подход - бесконечный порядок, 36 байтов
Эта программа фактически сломалась бы на 34-й гиперхине, так как значение ASCII
"
нарушило бы интерпретацию строки (и на 59,;
), но мы сместили хранение этого значения в позицию, которая никогда не будет выполнена (то есть(0, 1)
вместо(0, 0)
).Попробуйте онлайн: 1 , 2 , 10 , 34 , 42
объяснение
Первый подход - порядок 34, 52 байта (использует самоанализ, поэтому технически не легален)
По причине, описанной в приведенном выше посте, эта программа будет работать с ошибкой 34 (хотя я не проверял).
Попробуйте онлайн!
источник
g
, который, кажется, непосредственно читает исходный код программы. Тем не менее, я вряд ли эксперт Befunge, поэтому я могу что-то неправильно понять.g
здесь две цели: хранить данные и читать исходный код. Второй может быть немного отрывочным, хотя у esolangs.org/wiki/Befunge#Quine есть пример, использующийсяg
для чтения исходного кода. А пока я посмотрю, смогу ли я создать версию, которая не использует самоанализ.> <> , бесконечный порядок, 178 байт
Программа содержит завершающий перевод строки.
Попробуйте онлайн: 1 , 2 , 3 , 10 (для запуска последнего требуется время.)
Retina скрипт для генерации исходного кода из линейной программы.
объяснение
Основная идея состоит в том, чтобы повернуть куину по вертикали, чтобы повторение не влияло на реальный поток управления. Например, второй гиперхайн начинается так:
Поскольку мы перемещаемся только через первый столбец, нам не нужно беспокоиться о повторяющихся символах. Кроме того, когда мы помещаем большую часть кода в строку
'
, это приводит к появлению пробела для каждой пустой строки, что дает нам возможность определить количество повторений. Тем не менее, есть некоторые ограничения из-за этих пустых строк:"
нажатие больших чисел в качестве кодов символов в основной части квин, потому что это приведет к добавлению дополнительных32
s, которые нам не нужны.?
или!
потому, что они пропускают только следующий символ, который в этом случае будет пробелом (так что они фактически не будут пропускать следующую команду).Следовательно, весь поток управления выполняется с явными переходами (в основном, 2D-переход), чьи фактические смещения нам нужно рассчитывать на основе количества повторений.
Итак, давайте посмотрим на реальный код. Начнем с
^
того, что код выполняется снизу вверх. Для удобства чтения давайте выпишем реальный код в порядке выполнения (и отбросим его,^
потому что он никогда не выполняется снова):Это
'
стандартная техника квинтинга для> <> (и, наверное, Befunge). Он переключается в строковый режим, что означает, что встречающиеся символы помещаются в стек, пока не встретятся следующие'
. Пустые строки неявно дополняются пробелами, поэтому мы получаем все пробелы между ними. Пустые строки в конце программы игнорируются. Таким образом, после того, как IP обернулся и ударил'
снова, у нас есть первый столбец программы в стеке, за исключением'
самого.Давайте посмотрим, как мы используем это для печати всей программы.
Программа завершается, когда стек пуст и первый внутренний цикл не может распечатать другой символ.
источник