Напишите симулятор машины Тьюринга .
Для простоты мы можем принять статусы как целое число, символы как символ, пустой символ равен пробелу
5-кортеж в виде текущего состояния, входного символа, следующего состояния, выходного символа, направления (влево или вправо), порядок не обязателен, но укажите, если вы меняете его местами
Машина должна остановиться при достижении неизвестного состояния, никакие другие условия остановки не допускаются.
Лента бесконечна в обоих направлениях, и вы всегда можете прочитать пустой символ.
Вход: начальная лента, исходное состояние и программа. Вы можете читать данные из любого места в формате, который вам нравится
Вывод: лента после выполнения программы
Требуется: пример программы, которая запускается поверх вашего симулятора
Это код-colf, поэтому самый короткий код выиграл.
Я опубликую реализацию и несколько примеров программ в ближайшие несколько часов.
источник
Ответы:
GolfScript, 92 символа
Машина Тьюринга в GolfScript стала намного длиннее, чем предполагалось. Все еще играю с различными представлениями ленты.
Первая строка ввода - это исходное состояние, вторая строка - исходная лента, за которой следует массив переходов (с текущим состоянием ордера, символом ввода, следующим состоянием, направлением, символом вывода).
Пример (также доступен онлайн )
источник
GNU sed с
-r
-13311711193 символовДа, sed завершается. GNU sed и
-r
(расширенные регулярные выражения) предназначены только для сохранения нескольких символов, это лишь небольшое изменение для работы с POSIX sed.Формат ввода
Разделители
@
,#
и голова персонажа>
не могут быть использованы в качестве символа на ленте. Метки состояния не могут содержать@
>
или#
.Он будет запускать все программы на входе, по одной на строку
Примеры:
Марко это п б п программа
Привет Марко! программа
источник
Так что я немного опоздал, но подумал, что оставлю это здесь ...
Машина Тьюринга, имитирующая машину Тьюринга: 370 байт?
Здесь я использую структуру, которую Тьюринг использовал в своей статье 1936 года. Я использую один символ = один байт, включая m-конфигурации и операции.
Вот один из примеров Тьюринга из статьи выше для моей машины:
Попробуйте онлайн! (Использует Python 3 в качестве переводчика) - Редактировать: Я только что проверил TIO, и он, кажется, на самом деле не работает правильно ... Попробуйте его на своей локальной машине, и он должен (надеюсь) работать. Это на моем.
источник
APL (110)
(Это даже не так коротко ...)
Он читает две строки с клавиатуры: первая - это программа, а вторая - начальная лента.
Формат
и все они должны быть на одной линии. «Движение» - это 0, чтобы двигаться вправо, и 1, чтобы двигаться влево.
Пример программы (разрывы строк вставлены для ясности, все они должны быть в одной строке.)
Программа добавляет два одинарных числа вместе, например:
Пример 2 (адаптировано из программы двоичного приращения из записи Марко Мартинелли):
источник
Питон,
101189152142b и p - входные данные, b - исходная лента, p кодирует правила как (строковое представление) из набора (в состоянии, в ленте) в кортеж (из состояния, перемещение головки, из ленты) , Если перемещение равно 0, программа завершается, 1 - перемещение вправо, а -1 - перемещение влево.
В этом примере программы проверяется, является ли последняя буква строки (перед пустой лентой) «a», в этом случае записывается «Y» в конце строки (первый пустой пробел).
Изменить 1:
Изменил ленту, чтобы она была представлена как диктовка, так как это казалось самым коротким способом написания расширяемой структуры данных. От второй до последней строки в основном преобразуется в читаемую форму для вывода.
Изменить 2:
Спасибо Strigoides за большое количество улучшений.
Изменить 3:
Я излишне сделал это так, что 0, поскольку выходные данные оставили бы место, как это. Я удалил это, так как мы всегда можем записать вывод так же, как ввод.
источник
r=0;s=0
статьr=s=0
(и точка с запятой в конце этой строки не нужна), вы можете удалить функциюw
, так как она не используется, скобки могут быть удалены(s,m,t)=r[s,c]
,try
/except
блок может быть сокращен используя dict.get;c=a.get(i,' ')
, такm
как это 0 или 1, вы можете использоватьif m-1:
, и вы можете сократить свойmap()
вызов, преобразовав его в понимание списка.постскриптум
(205)(156)(150)(135)Это, вероятно, обман, но таблица переходов содержит код для выполнения переходов. А так как лента представлена в виде преобразования целых чисел в целые, я представлял состояния в виде отображения имен в словари, поэтому лента и программа сосуществуют в одном анонимном словаре.
Дополнительная экономия за счет выполнения всех имен состояний исполняемыми, поэтому они автоматически загружаются.
Разгружен со встроенной программой "Hello".
Дополнительные 52 символа покупают цикл для чтения ленты со стандартного ввода.Беги сgsnd -q tm.ps
.Таким образом, формат таблицы
где
in-state
- имя,in-tape
иout-tape
являются символами (т. е. целыми числами или выражениями, которые дают целые числа),movement
--1
для левого или1
правого иout-state
является исполняемым именем. Несколькоin-tape
переходов для одного и того же состояния должны быть объединены, как указано выше.источник
currentdict{search-for-min-and-max}forall juggle-params-for-for
. :(0 1 0 not{(%stdin)(r)file read not{exit}if def}for
. Я не уверен, почему я думал, что смогу обойтись без этого в версии для гольфа. : P0 not
должно быть16#7fffffff
. Сожалею. Ага! вот почему это было прокомментировано! Он вышел прямо из блокнота, не прошел тестирование, и я обрезал все комментарии, не глядя, когда играл в гольф. Не говори парню Питона! : PC (еще не в гольф)
Я полагаю, я не могу победить с этим, все же было весело заставить его работать. Это еще более верно теперь , что это действительно делает работу. :)
За исключением того, что это только бесконечно в одном направлении. Полагаю, для этого тоже нужна отрицательная лента. Вздох....
Негатив не был так плох. Мы чередуем две стороны как четные и нечетные. Сложность теперь заключается в том, что лента должна отображаться в последовательном порядке , так как сам файл теперь перемешан. Я думаю, это законное изменение. Сам Тьюринг упростил этот путь.
И вот тест-запуск:
Программа выводит ленту в последовательном порядке, но файл представляет чередующиеся отрицательные и положительные стороны.
источник
0 'a' 0 'b' R; 0 'b' 0 'a' R
с вводом aaa, но вместо bbb выводится bab. И есть проблемы с движением влево.Groovy
234228154153149139124Отформатирован для удобства чтения
t это функция, которая устанавливает ленту e это функция, которая оценивает программу
Пример 1 - Распечатать "Hello!" на ленте :)
Пример 2 - Оставьте T на ленте, если начальная строка имеет вид a n b n , иначе остановитесь.
Пример 3 - Увеличение двоичного числа
в примерах 1 означает перемещение вправо, а -1 означает перемещение влево
источник