Задача, которая, на мой взгляд, была бы очень крутой, состоит в том, чтобы создать переводчика для полного по Тьюрингу языка по вашему выбору.
Правила просты:
- Вы можете использовать любой язык для создания этого переводчика, даже если он новее, чем этот вызов.
- Вы можете использовать любой язык, полный Тьюринга, если он не совпадает с тем, на котором вы его пишете.
- Вы не можете просто оценить код, например, использовать функции eval.
- Объяснение того, как вы подошли к этому, будет неплохо, но не обязательно.
- Это будет оценено в байтах.
- Каждое представление должно быть полностью работоспособным, это означает, что должна присутствовать каждая функция, которую имеет ваш выбранный язык.
Проще говоря:
Ваша задача - создать работающего переводчика для любого языка, полного тьюринга, на любом языке по вашему выбору.
Удачи!
code-golf
interpreter
arodebaugh
источник
источник
eval
решений.eval
команды / функции, так как некоторые языки имеют встроенные модули для оценки кода на другом языке.Ответы:
Brachylog (2) → Проблема почтовой корреспонденции , 9 байт
Попробуйте онлайн!
Ввод представляет собой список списков строк. (В задаче переписки Post, определенной в Википедии, каждый из внутренних списков состоит из двух элементов, хотя эта программа на самом деле может обрабатывать обобщение на любое количество элементов.) Эта программа решает проблемы методом грубой силы в порядке длины, пока решение найдено. Известно, что проблема почтовой переписки способна моделировать машину Тьюринга, и, таким образом, ее решение является грубым. Если он запускается как функция, а не как программа, он на самом деле также производит значимый вывод.
Программа в ссылке TIO выше есть
[["a","baa"],["ab","aa"],["bba","bb"]]
, которую я скопировал из Википедии. Решение (которое программа находит довольно быстро) это["bbaabbbaa","bbaabbbaa"]
.объяснение
Это в значительной степени просто прямой перевод проблемы почтовой переписки в брахилог.
По сути, мы создаем список, который повторяет входные данные (как можно меньше, что означает, что мы не упускаем никаких возможностей при грубом форсировании), берем один элемент из каждой копии, затем объединяем соответствующие элементы (как в корреспонденции Post). проблема).
источник
~dp
(что не означает, что то же самое, но достаточно близко, чтобы все еще быть Turing-complete), за исключением того, что интерпретатор брахилога еще не знает, как повернуть вспятьd
.Желе → «Добавить минимум для транспонирования»,
54 байтаПопробуйте онлайн! (выполняется только одна итерация, чтобы избежать тайм-аутов)
Очень простая конструкция, полная по Тьюрингу: мы берем квадратную матрицу в качестве программы и выполняем цикл навсегда, идентифицируя лексикографически наименьшую строку, затем увеличивая каждый элемент первой строки на первый элемент лексикографически наименьшего, каждый элемент второй строки вторым элементом лексикографически наименьшего и т. д. (Программа Jelly - это «
+"
добавить соответствующие элементы {входных данных и}Ṃ
минимальный {исходный},ẞ
цикл»; это на байт короче, чем моя предыдущая программаZ+ṂZß
, которая делала то же самое. Очевидно, я должен был сосредоточиться на игре в гольф Желе, а не просто игра в гольф реализованный язык.)Получившийся в результате язык Тьюринга полон по той же причине, что и кенгуру, Первый элемент каждой строки действует как количество пропусков (хотя вместо количества пропусков каждой команды, уменьшающегося при ее пропуске, мы вместо этого увеличиваем количество пропусков каждой команды при ее запуске, и ищем команду с наименьшим количеством пропусков, а не чем команды с нулевым количеством пропусков, это то же самое). Мы гарантируем, что этот первый элемент выше, чем другие элементы (которые представляют количество раз, когда каждая команда появляется в мультимножестве каждой команды), таким образом гарантируя, что первая строка никогда не будет минимальной; остальная часть первого ряда может быть мусором. Единственная оставшаяся проблема заключается в моделировании способа, которым команды с одинаковым количеством пропусков выполняются циклически по порядку, но мы можем сделать это, умножив все значения пропусков на большую константу, а затем добавив маленькую «начальную» пропустить отсчет до первого столбца, чтобы послужить разрывом связей. Это дает нам связь между «первыми пропущенными командами без пропусков», а не «непропущенными командами, запускаемыми циклически по порядку», но конструкцию полноты по Тьюрингу для Kangaroo не заботит об этом различии.
источник
Mathematica интерпретирует игру жизни Конвея, 64 байта
Игра жизни Конвея, как известно, завершена по Тьюрингу; и клеточные автоматы - самая настоящая одержимость Стивена Вольфрама.
CellularAutomaton@{224,{2,{t={2,2,2},{2,1,2},t}},{1,1}}
это правило, которое преобразует двумерный массив из 0 и 1 в соответствии с одним из этапов игры жизни Конвея. (Я думаю, что поведение по умолчанию состоит в том, что этот массив обвивает его края, поэтому на самом деле это отдельный дискретный тор.)~Nest~##&
Превращает это правило в функцию, которая при задании начального состояния платы (любых размеров) и целого числа вn
качестве аргументов выводит результатn
итераций правила игры жизни.Для собственного удовольствия вы можете использовать упакованную версию
и пролистайте свой путь через 100 поколений на доске 50х50.
источник
Turtlèd интерпретация CT , 49 байтов
Я мог бы в гольф это
Кроме того, это не выводит ничего полезного. он просто останавливается, если и только если останавливается данная программа CT.
это тот, который я сделал некоторое время назад на самом деле (тогда игра в гольф сейчас)
Как это работает:
Turtlèd использует ячейки сетки. Когда я говорю «напишите что-нибудь на сетке», я имею в виду, что на сетке расположена непрерывная группа символов. пример
на программу
данные вводятся первыми:
по сути это программа для кошек. он записывает ввод в сетку.
затем команды вводятся:
что он делает с этими командами:
Эти команды являются «продукцией». если крайний левый бит данных равен 1, он копирует производство в конец строки данных. в противном случае ничего не происходит. затем самый левый бит данных удаляется, и он использует следующую продукцию со следующим самым левым битом данных. программа останавливается, когда в строке данных нет битов. Способ создания этих производств состоит в том, чтобы иметь дело с битами и окончанием производства отдельно. это то, что делает наша программа. он отдельно копирует биты из командной строки в конец строки данных и отдельно удаляет биты из строки данных
о том, как эта программа делает это. после ввода команд указатель черепаха / сетка возвращается к крайнему левому биту строки данных. затем он идет в петлю
что он делает в этом цикле, так это перемещается вверх от крайней левой строки данных и записывает текущий символ команды (и.). если это;; конец производства, он перемещается вниз и удаляет самый левый бит данных под ним и перемещается обратно вверх (
(;d' u)
). тогда, так или иначе, это понижается один (d
). если бит там не был удален, это означает, что он должен проверить, копировать ли бит из команд в конце. поэтому, если этот символ, который является или был самой левой базой данных, равен 1, он переместится в конец правого конца строки данных, скопирует бит из командной строки и вернется в пространство слева от крайних левых данных. бит ((1[ r].[ l])
). теперь это либо левый край данных, который был нулем, либо левый крайний край данных. Итак, мы движемся вправо, если на пробел (( r)
). затем указатель команды увеличивается, поэтому мы запишем следующую команду в следующей итерации цикла. Если больше нет строки данных, это означает, что мы окажемся в пространстве, и цикл закончится. в противном случае мы перезапустим цикл.источник
Perl → вариант трехзвенного программатора , 26 + 1 = 27 байт
Попробуйте онлайн! (Эта ссылка содержит заголовок, который выходит из программы после заданного количества итераций (чтобы время ожидания не было у TIO), и для печати внутреннего состояния при каждой итерации (чтобы он что-то наблюдал).)
Запуск с
-a
(штраф 1 байт, так как вы можете установить его до того,-M5.010
как произвести-aM5.010
).В частности, здесь реализован Three Star Programmer, в котором команды разделены пробелами, и в файле запрещены комментарии без расширений ввода / вывода. (Эти изменения не имеют никакого значения для полноты по Тьюрингу языка, очевидно.) Нет онлайн-подтверждения полноты по Тьюрингу для трехзвездного программиста в Интернете, но это полная по Тьюрингу (я поделился эскизным доказательством его тьюринга). -полнота с другими эзопрограммистами, но перестала работать над языком, когда я обнаружила, что на самом деле довольно легко программировать, как только вы преодолели первоначальный шок).
Программа на самом деле не нуждается в большом объяснении; Программа «Три звезды» имеет очень простую спецификацию, и это ее прямой перевод. Единственные тонкие моменты:
@F
это ввод в программу в виде массива (это является следствием-a
); иredo
будет повторять всю программу, поскольку она находится в неявном цикле (также является следствием-a
).источник
сборка x86 (синтаксис Intel / MASM) -Brainfuck 2127 байт.
Все еще в состоянии гольфа
источник
Pip- интерпретация систем циклических тегов , 16 байтов
Принимает продукцию системы тегов в качестве аргументов командной строки и исходную строку данных из stdin.
Приведенный выше код довольно сложно проверить, потому что он не производит никакого вывода (поэтому единственное наблюдаемое поведение - «завершается» против «не заканчивается»). Таким образом, вот версия без заглавных букв, которая выводит строку данных после каждого шага, а также завершается через 20 шагов, поэтому TIO не приходится иметь дело с тоннами вывода из бесконечных циклов: попробуйте онлайн!
Системы циклических меток
Системы циклических тегов являются чрезвычайно простой, но полной по Тьюрингу вычислительной моделью. Они состоят из списка производств, которые определяют операции над строкой данных . Продукция и строка данных состоят из 1 и 0.
На каждом шаге крайний левый символ строки данных удаляется.
В любом случае текущее производство циклически перемещается к следующему производству в списке: если мы были на последнем производстве, мы возвращаемся к первому. Выполнение продолжается до тех пор, пока строка данных не станет пустой.
объяснение
источник
1
источник: esolangs ссылки на этот arxiv.org/abs/1312.6700 . Я скоро отредактирую свой ответ, и если это поможет вашему ответу, вы должны это сделать (т. Е. Ваш вклад кажется довольно гольфы на самом деле)Итерированные обобщенные функции Коллатца -> Python 2, 46 байт
Вызовите эту функцию со списками m-1 a и b, начальным значением x и делителем m, которые вместе составляют «программу» для IGCF. Вместо того, чтобы брать третий массив, чтобы указать, на каких модулях остановиться, он просто останавливается всякий раз, когда модуль равен m-1. Это упрощение означает, что может потребоваться дополнительное усилие для преобразования данной программы Fractran в этот вариант, но оно сохраняет пару байтов в интерпретаторе.
Попробуйте онлайн! Этот TIO демонстрирует, как добавить 5 + 5 с этим языком. Программа a = [3], b = [0], m = 2 выполняет сложение и, начиная с 7776 = 2 ^ 5 * 3 ^ 5, в конечном итоге дает 59049 = 3 ^ 10.
источник
ResPlicate вариант -> Python 2, 47 байт
Эта функция интерпретирует вариант ResPlicate
Последнее изменение означает, что некоторые программы ResPlicate (которые соответствуют первому условию) не будут вести себя одинаково в этом варианте, но, к счастью, интерпретаторы BCT не требуют удаленной функциональности, и поэтому язык остается TC.
Попробуйте онлайн! В этот TIO встроен отпечаток, показывающий его работоспособность, а также заголовок, который убивает программу через 1 секунду, и пример, который способен генерировать больше выходных данных, чем TIO может обработать за одну секунду.
источник
l=input()
? Был бы байта короче.Perl
-a
→ I / D machine , 24 байтаПопробуйте онлайн! (содержит заголовок, который печатает внутреннее состояние и останавливается после 10 итераций, чтобы поведение можно было наблюдать)
О языке
Я провел последние пару дней, работая над машиной ввода-вывода , одной из моих последних идей для очень простых языков программирования. Он работает следующим образом: хранилище данных состоит из неограниченной оперативной памяти, изначально все нули. Каждый элемент может хранить неограниченное целое число (хотя на практике большинство машинных программ I / D сохраняют только маленькие целые числа в большинстве из них и используют неограниченные целые числа только для адресации ячеек с большими адресами). Также есть указатель данных, который указывает на ячейку (т.е. содержит адрес как ячейку); изначально тоже ноль.
Есть только две команды:
I
: Увеличить ячейку, на которую указывает указатель данных. (Сам указатель данных остается неизменным.)D
: Разыменовать указатель данных, то есть прочитать значение ячейки, на которую указывает указатель данных. Затем сохраните полученное значение обратно в указатель данных.Выполнение просто запускает программу в цикле многократно, навсегда.
Довольно удивительно, что этот простой язык завершен по Тьюрингу, поэтому я работаю над тем, чтобы доказать это. Вот доказательство . Это очень похоже на (но проще, чем) доказательство для Three Star Programmer, очень похожего языка (и на самом деле в этом представлении используется одна и та же базовая «оболочка» OISC вокруг программы, отличающаяся только фактической выполненной инструкцией).
О программе
использование
Входные данные должны быть заданы на стандартном вводе и являются машинной программой I / D без комментариев и с использованием синтаксиса RLE / OISC. (Машина I / D имеет два разных, эквивалентных синтаксиса, но для удобства игры эта программа поддерживает только один из них.) В этом синтаксисе программа представляет собой последовательность чисел в десятичном формате, представляющую длины серий
I
команд междуD
командами. (Вы можете указать две или более последовательныхD
команды, поместивI
между ними «прогон 0 команд», так что синтаксис полностью общий.)объяснение
Как видно из программы, это не осуществляет
I
иD
команды по отдельности. На самом деле, это (очень немного) оптимизирующий интерпретатор (просто потому, что так писать короче). Ключ в том, чтобы увидеть, что выполнение n команд приращения увеличивает целевую точку указателя данных n раз, то есть добавляет к ней n ; и запуск 0 команд приращения также может быть реализован таким образом, так как добавление 0 в память не имеет никакого эффекта. Таким образом, операция, которую мы на самом деле реализуем, заключается в чередовании реализации серийI
и aD
. Или, другими словами, "добавить ндо значения, на которое указывает указатель данных (сохраняя его обратно в значении, на которое указывает указатель данных), затем считайте значение, на которое указывает указатель данных, и сохраните его в указателе данных ". Это явно более многословно, чем необходимо быть, и мы можем еще больше упростить это, чтобы «добавить n к значению, на которое указывает указатель данных, а затем сохранить это значение как в целевом указателе данных, так и в самом указателе данных».Так что это составляет ядро нашей программы. Мы используем массив
$a
для хранения оперативной памяти и$p
в качестве указателя данных (индексация в массиве):Удобно, что Perl интерпретирует неинициализированные элементы массива как 0, когда они обрабатываются как числа, поэтому массив будет лениво инициализироваться для нас нулями без какого-либо явного кода для этого. (Одна потенциальная проблема - числовая точность, когда числа становятся большими; однако, это произойдет, только если объем используемого массива превышает адресное пространство машины (целые числа Perl достаточно велики, чтобы содержать указатели), чего не может случиться на идеализированной машине.)
Наконец, все, что нам нужно сделать, это поместить эту программу в несколько циклов.
for@F
Петля, в сочетании с-a
параметром командной строки, будет цикл над полями стандартным вводом (определение по умолчанию «поля» здесь будет разделено на пробельном).redo
Цикл будет поместить всю программу в неявном цикле (кроме, удобно, чтение стандартного ввода), что приведет к тому , программа для запуска в цикле многократно, в соответствии с требованиями семантики машины I / D.источник
-a
». codegolf.meta.stackexchange.com/a/14339/9365Желе → 2-теговая система , 8 байт
Попробуйте онлайн!
У меня есть награда в пользу практических языков, но я подумал, что с таким же успехом я могу попытаться выиграть оригинальное задание, поскольку я не могу точно выиграть свою собственную награду).
Реализует вариант систем тегов без состояния остановки, так как он не нужен для полноты по Тьюрингу. Состояния нумеруются последовательно от 1, и начальная строка предшествует программе.
Например, Википедия дает пример системы тегов {
a
,b
,c
}, {a
→bc
,b
→a
,c
→aaa
} с начальной строкойaaa
; в этом формате ввода, это[1,1,1]
,[[2,3],[1],[1,1,1]]
. (Системы тегов не имеют фиксированного синтаксиса, и это кажется разумным способом сделать это.)Ссылка TIO имеет добавленное
Ṅ
(«записать внутреннее состояние и перевод новой строки в стандартный вывод»), чтобы показать, что программа действительно работает.объяснение
источник
BF / P ", реализованный в машине Тьюринга, 842 байта
Таблица переходов (связана из-за длины)
Переходный стол, менее гольф-версия
Симулятор машины Тьюринга, который я использовал
Это, конечно, не принесет никаких наград за длину, но это то, что я всегда хотел сделать, так как BF очень похож на машину Тьюринга. Каждая ячейка хранит значение из
0x0
-0xF
. Тем не менее, ширина сайта Turing Machine далеко не может привести к сбою браузера. Функции,
и.
(вход и выход) не определены, так что это немного больше похоже на P, чем на истинный BF.Чтобы запустить его, вставьте таблицу переходов в симулятор Turing Machine, установите для ввода некоторый код BF и нажмите run.
Лента ТМ хранит как код BF, так и данные BF, с одним пробелом в середине. Он отслеживает свою позицию в коде, изменяя символ, который он в данный момент выполняет (
[
->(
и т. Д.), И свою позицию в данных с символом^
перед ячейкой. Как только он читает командный символ, он перемещается, пока не достигнет каретки, не переместится на одну ячейку вправо и не выполнит соответствующую функцию. Затем он возвращается к поиску одного из «модифицированных» командных символов в коде BF и переходит к следующему, повторяя весь процесс. Когда код заканчивается, он останавливается.Лучший способ понять, как это работает, - запустить версию без игры, перевести ее в пошаговый режим и посмотреть, какие строки ведут к каким другим, и что делает каждое состояние / блок строк.
Версии для игры в гольф и без игры одинаково с точки зрения того, как они работают, но версия без гольфа имеет более понятные для человека имена и разбита на разделы.
источник
C реализует (2,3) машину Тьюринга ,
236205 байт (4631 меньше, если вам не нужны неловкие входные данные)Благодаря Appleshell для -11 байт, VisualMelon для -12 байт и Johan du Toit для -7 байт.
CeilingCat сделал версию, которая использует только 144 байта, смотрите здесь .
(Я добавил несколько разрывов строк здесь, чтобы вам не приходилось прокручивать, но обычно большинство из них будут удалены)
Попробуйте онлайн!
Использование: введите строку до 256 единиц, нулей и двойок, чтобы инициализировать ленту. Любые неинициализированные значения будут равны нулю. (Значения, отличные от 0, 1 и 2, могут вызывать неопределенное поведение.) Программа выполнит итерацию за 256 шагов. Количество шагов, которые он повторяет, можно увеличить, изменив код, но, очевидно, для этого требуется больше символов.
Это довольно длинный вход, но я впервые делаю один из них, и я не использовал специальный язык для игры в гольф. Мне было очень весело, даже если получилось дольше, чем я ожидал.
Большая часть байтов связана с вводом и выводом, и я потерял целые 42 байта, заставив его принимать 0, 1 и 2 вместо NUL, SOH, STX. (Чтобы изменить это, удалите
k;
спереди иfor(;k<256&&d[k];)d[k++]-=48;
со второй строки.)Таблица переходов, особенно строка
*p=-t*t+(2-s)*t+1+s;
(которая устанавливает значения на ленте), вероятно, также может быть сжата больше.источник
k,j;c s,d[256];
(int
неявно в C, затем вы также можете перейтиi
к глобальному объявлению, чтобы сохранить на 3 байта больше)k++
и удаление{}
сохраняет еще пару байтов:for(;k<256&d[k];)d[k++]-=-48;
посколькуj
это просто хронометраж (значение, которое никогда не использовалось), вы можете заменить его (иi
)k
на обратный отсчет: вы знаете,k==256
после первого цикла, так что отсчитайте до нуля во второмfor(;k>0;)
, который уходитk==-1
, так что последний цикл может статьfor(;++k<256;)
. (Отказ от ответственности: я обычно играю в гольфC#
, но это, кажется, компилируется).k<256&&d[k]
, а не&
потому, что меняd[k]
оценивалиk==256
. Кроме того, такk
как больше не гарантировалось, что256
после этого цикла я должен был сбросить его впоследствии, чтобы гарантировать 256 шагов. (Если у вас (то есть, у VisualMelon) есть какие-то другие предложения, мы, вероятно, должны поместить их в чат, чтобы не получать слишком много комментариев)Röda, реализующий Fractran ,
114112106 байтов1 байт сохранен благодаря @fergusq путем изменения параметров
Попробуйте онлайн!
Вызов функции следующим образом:
f reference_to_input program
. Вывод будет сохранен в расположенииinput
.источник
e[1]
является избыточной. Также вы можете сохранить один байт, изменив порядок параметров:f&n,a
.f&n,a
трюк, и я как раз собирался удалить этуClojure,
8281 байт (машина Тьюринга)Обновление: убрал пробел из
t{} s
.Реализует машину Тьюринга как цикл, возвращает ленту при достижении состояния остановки. В правилах перехода состояний это указывается путем пропуска переходного состояния. Это settins
N
кnil
и последующееif-let
прервет как соответствующий переход состояния не найден из входного хэш-карте%
. На самом деле подойдет любое значение для этого состояния, например:abort
0 или -1.Ungolfed с примером занятого бобра с 3 символами из 2 состояний из Википедии .
Попробуйте онлайн .
На одном ядре 6700K он запускает 5-символьного занятого бобра с 47 символами (47,1 миллиона шагов) примерно за 29 секунд, или 1,6 миллиона шагов в секунду.
источник
M → Tip , 4 байта
Попробуйте онлайн!
Ссылка TIO добавляет нижний колонтитул для вызова функции с примером программы Tip, показанной на странице Esolang («автоматическая обертка» M для вызова функций, как если бы они были программами, которые не могут обрабатывать рациональные числа или числа с фиксированной запятой, или, по крайней мере, у меня есть Я не понял, как это объяснить, поэтому мне нужно превратить функцию в полноценную программу вручную, чтобы иметь возможность ее запускать.)
Это на самом деле печатает полезные выходные данные отладки; программа не может быть записана в 3 байта в M, потому что программа, состоящая ровно из трех диад, вызывает особый случай в синтаксическом анализаторе, поэтому мне пришлось добавить дополнительную команду, чтобы избежать особого случая. Создание этого
Ṅ
(печать с новой строкой) по крайней мере дает ему полезную цель.ı
Не реализует ввод / вывод (кроме останова / без остановки). Ввод / вывод является расширением для Tip (не является частью самого языка) и не требуется для полноты по Тьюрингу.
Объяснение / фон
[1,2,3]
[1,2,3,1,2,3,1,2,3,…]
ḅ
Поэтому я оглянулся и немного переоценил. Есть ли какие-либо операции, которые мы могли бы использовать вместо полиномиальной оценки? В идеале, те, которые являются коммутативными, поэтому нам не нужно беспокоиться о порядке аргументов? Вскоре после этого я понял, что функции Коллатца являются более сложными, чем они должны быть.
И, конечно, в отличие от base translation (
ḅ
), multiplication (×
) является коммутативным, и, таким образом, не имеет значения, в каком порядке размещены аргументы. Поэтому все, что нам нужно написать, - это×ị
затем поместить программу в бесконечную рекурсию с помощьюß
, и у нас есть полный по Тьюрингу язык. Правильно?¹×ịß
¹
¹
Ṅ
это хороший выбор, потому что он дает полезные выходные данные отладки.Возможны ли три байта? Если только я что-то упустил, не с этим конкретным выбором реализуемого и реализованного языка, но в этот момент наверняка кажется, что это как-то возможно, так как существует четыре способа сделать это за четыре и так много Turing-complete языки, которые вы могли бы реализовать.
источник
ḋ
иṙ
вместо×
иị
; результирующий язык не совсем совпадает с языком Tip, но он довольно похож и почти наверняка завершен по Тьюрингу по той же причине. К сожалению,ḋ
не реализовано в M, и я не могу найти способ заставить Jelly выполнять вычисления произвольной точности, когда любой из входных данных является нецелым действительным числом. Если кто-то знает какие-либо другие языки игры в гольф, где эта конструкция могла бы работать, не стесняйтесь попробовать.C интерпретация Brainfuck, 187 байт
Попробуйте онлайн
источник
Lua интерпретация Brainf ***, 467 байт
Я знаю, что есть еще какое-то похудение, которое я могу сделать позже, но на этом мой первый проход закончился. Принимает код brainf из стандартного ввода.
источник
brains
, это всегда весело, когда игроки в гольф назначить список переменных.CJam → ResPlicate Variant,
151413 байт-1 байт благодаря @ ais523
Вариант такой же, как и в этом ответе , за исключением того, что количество элементов, извлеченных из очереди, на единицу меньше, чем верхнее число в очереди.
l~{ ... }h
Часть просто принимает массив в качестве входных данных и повторяется до тех пор , что массив не пуст.Пояснение к основному циклу:
источник
Чип , 20 + 3 = 23 байта (правило 110)
+3 за флаг
-z
Попробуйте онлайн!
Эта передача не идеальна, поскольку у Chip (пока) нет возможности зацикливания, поэтому выходные данные должны передаваться как входные данные для имитации нескольких поколений, с чем-то вроде этого (конечно, вы можете запускать этот цикл бесконечно, и Chip может обрабатывать произвольно длинный ввод, поэтому эта комбинация является завершением по Тьюрингу).
Эта реализация принимает входные и выходные данные в форме ASCII
0
и1
s. Логика здесь следующая:Остальные элементы предназначены для служебного пользования:
e*f
вызывают цифровой вывод ASCII иE~Zt
прекращают выполнение через два байта после исчерпания ввода (поскольку ширина увеличивается на 2 при каждом поколении).источник
Clojure, 75 байтов (система циклических тегов)
Обновление 1: заменено
some?
наnil?
.Обновление 2: исправлено отсутствие
S
в другой веткеif s
.Реализует систему циклических тегов , возвращает,
nil
если программа останавливается, в противном случае зацикливается. Clojure действительно сияет здесь бесконечными ленивыми последовательностями (такими как цикл ) и деструктуризацией . Единицы и нули обозначаются как истинные и ложные значения. Когда строка данных заканчивается,s
становитсяnil
.Ungolfed:
Пример результатов:
источник
JavaScript интерпретирует правило 110 , 131 байт (99 байт ?, 28 байт?)
Как видите, код определяет 3 функции
a
,b
иc
. Возможно, можно сохранить байты, объединив их в одну функцию (я не понимаю, как), но хорошо, что они разделены, потому что каждый из них уже выполняет эту задачу в некотором смысле.Функция
a
принимает 3 числа в качестве входных данных и вычисляет некоторый странный полином из них. Когда эти 3 числа0
или1
они могут быть замечены как клетки Правила 110. Тогда паритет выходных данныхa
можно рассматривать как значение средней ячейки в следующем поколении. Так что в некотором смысле эта простая функция уже является «интерпретатором» правила 110 (28 байт):Затем мы можем создать новую функцию,
b
которая оцениваетa
каждый символ строки из нулей и единиц. Этоb
лучше, чемa
интерпретатор правила 110. Взяв мод 2 после оценки сохраненных скобок (99 байт):Чтобы фактически вычислить функцию с помощью правила 110, пользователь должен указать начальное состояние и количество поколений, после которых вывод будет «появляться». Мы можем создать третью функцию,
c
которая принимает строку из нулей и единиц, а также положительное целое числоn
, которое затем оцениваетb
строку,n
времена. Таким образом, мы действительно можем видеть Правило 110 как язык программирования, где программа - это начальное состояние и числоn
, а вывод - это состояние послеn
поколений. Теперь эта функцияc
является настоящим интерпретатором для этого языка программирования, поэтому окончательный код для этой задачи - это то, что я представил выше.источник
JS -> Новая строка 854 байта
Супер гольф благодаря Google.
источник
var
утверждения:var b=0,n=!0,c=[],h=[],e=0,l=[],m=0,f=2,a=0,g=!1;
var
тыClojure, 87 байт (правило 110)
Кредит на код паритета переходит к Jens Renders! Я действительно боролся за то, как это выразить, и собирался перейти
[p q r]
от двоичного к целочисленному и использовать таблицу поиска.Здесь
partition
и деструктуризация Clojure делает применение логики довольно простым. Эта функция возвращает бесконечную последовательность состояний, поэтому вызывающая сторона отвечает заtake
столько, сколько им нужно, или простоnth
за переход к определенному состоянию. Если бы отступы с нулем были двумя элементами вместо одного, то лента постоянно росла бы, избегая проблем с границами. Теперь он остается оригинальной ширины.Пример:
источник
cycle
мог бы построить бесконечный шаблон заполнения, но выполнение первого шага заняло бы бесконечное количество времени: /APL (Dyalog) → Fractran вариант, 15 байтов
Попробуйте онлайн!
Функция принимает рациональные числа в виде списка чисел, а не двух списков, содержащих числитель и знаменатель, и выводит результат, если программа заканчивается. Это реализует вариант Fractran, который имеет рациональную 1/1 (= 1) в конце программы. 1 не влияет на полноту по Тьюрингу (насколько я понимаю), потому что вход в программу попадает в 1 только тогда, когда не работает ни одно из других рациональных чисел, а когда это происходит, вход не изменяется. Это используется только для того, чтобы функция знала, когда заканчивать.
Ссылка TIO запускает функцию в течение 2 итераций (чтобы вы могли видеть выходные данные, поскольку программа не заканчивается) на первом входе и выполняет второй ввод до завершения, после чего возвращает результат.
(⊃0~⍨××0=1|×)⍣≡
принимает список рациональных аргументов в качестве левого аргумента, именуемого ⊣, и ввод в качестве правого аргумента, именуемого ⊢(⊃0~⍨××0=1|×)
функциональный поезд1|×
получить часть после десятичной точки (по модулю 1) произведения×
⊣ и ⊢0=
это равно 0?××
умножьте этот результат на ⊣ × ⊢, где рациональное × not не является целым числом, оно заменяется на 00~⍨
удалить все 0⊃
получить первый элемент⍣
Цикл до тех пор, пока≡
вход не изменится, обратите внимание, что результат(⊃0~⍨××0=1|×)
используется повторно в качестве входа, поэтому, если он перестает изменяться (в результате 1 в конце), программа останавливаетсяисточник
JavaScript: лямбда-исчисление (
123114)Представлено с помощью Debruijn Indicies в Duples.
S комбинатор есть
[0, [0, [0, [[3, 1], [2, 1]]]]]
К есть
[0, [0, 2]]
Я есть
[0, 1]
Изменить: побрил 9 байтов, заменив
"number"==typeof c
на!isNaN(c)
источник
APL (Dyalog Unicode) , 15 байтов SBCS
Полная программа, которая реализует обобщенный одномерный исполнитель клеточных автоматов. Это включает в себя правило 110, которое является полным по Тьюрингу. Запрашивает стандартный ввод для начального состояния, количества итераций (или
≡
для продолжения до стабильного состояния, или{⍵≡⎕←⍺}
для отображения всех промежуточных значений до стабильного) и для набора правил.Попробуйте онлайн! (4 итерации правила 110)
⎕
запросить начальное состояние и⊢
вывести это (отделяет состояние от количества итераций)⍣⎕
запросите количество итераций и примените следующую функцию много раз:(
…)
Применить следующую молчаливую функцию:⌺3
получить все окрестности длины 3 (с информацией о том, находятся ли они на краю) и применить следующую молчаливую функцию к каждой паре:⊂
окружить окрестности∘
а также⊢
дать это (отбрасывая информацию о том, чтобы быть на грани)∘
тогда∊⍨
проверьте, являются ли они членами⎕
запросить список окрестностей, ведущих к включению в следующую итерациюисточник