Как известно, определение того, останавливается ли машина Тьюринга, неразрешимо, но это не обязательно верно для более простых машин.
Foo машина представляет собой машину с конечной лентой, где каждая ячейка на ленте имеет целое число или символ HALT h
, например ,
2 h 1 -1
Указатель инструкции начинается с указания на первую ячейку:
2 h 1 -1
^
На каждом шаге указатель инструкции перемещается вперед на число, на которое он указывает, а затем отрицает это число. Итак, после одного шага, он будет двигаться вперед 2
клетки и превратить 2
в -2
:
-2 h 1 -1
^
Машина Foo продолжает делать это, пока указатель инструкции не укажет на символ остановки ( h
). Итак, вот полное выполнение этой программы:
2 h 1 -1
^
-2 h 1 -1
^
-2 h -1 -1
^
-2 h -1 1
^
-2 h 1 1
^
Лента также является круглой, поэтому, если указатель инструкций перемещается с одной стороны ленты, он переходит на другую сторону, например:
3 h 1 3
^
-3 h 1 3
^
-3 h 1 -3
^
-3 h -1 -3
^
-3 h -1 3
^
3 h -1 3
^
Одна интересная вещь об этих машинах Foo - то, что некоторые не останавливаются, например:
1 2 h 2
^
-1 2 h 2
^
-1 -2 h 2
^
-1 -2 h -2
^
-1 2 h -2
^
-1 2 h 2
^
Эта программа будет продолжаться в тех четырех последних состояниях навсегда.
Итак, напишите программу, которая определяет, останавливается ли машина Foo или нет! Вы можете использовать любой (разумный) формат ввода, который вам нравится для машин Foo, и вы можете использовать его 0
в качестве символа остановки. Вы можете использовать любые два разных выхода для случая, когда он останавливается, и для случая, когда он не останавливается. Ваша программа, конечно, должна выводить ответ за ограниченное время для всех допустимых входных данных.
Это код-гольф , поэтому постарайтесь сделать свою программу максимально короткой!
Контрольные примеры
2 h 1 -1
Halts
3 h 1 3
Halts
h
Halts
1 1 1 1 h
Halts
2 1 3 2 1 2 h
Halts
3 2 1 1 4 h
Halts
1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 h -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36
Halts
2 h
Does not halt
1 2 h 2
Does not halt
8 1 2 3 3 4 8 4 3 2 h
Does not halt
1 2 4 3 h 2 4 5 3
Does not halt
3 1 h 3 1 1
Does not halt
1 2 h 42
Does not halt
источник
1 2 h 42
(не останавливается)3 2 1 1 4 h
. Это останавливает, но требует больше итераций, чем удвоенное количество элементов.1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 h -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36
останавливается после 786430 шагов.Ответы:
C # (интерактивный компилятор Visual C #) , 71 байт
Попробуйте онлайн!
Я не знаю, является ли следующее действительным, так как для него требуется пользовательский делегат с подписью
unsafe delegate System.Action<int> D(int* a);
и должен быть обернут вunsafe
блок, который будет использоваться, но здесь это в любом случае:C # (.NET Core) , 64 байта
Попробуйте онлайн!
Эта функция принимает int * и возвращает Action; другими словами, это функция карри. Единственная причина, по которой я использую указатели, заключается в codegolf.meta.stackexchange.com/a/13262/84206, который позволяет мне сохранять байты, уже имея переменную, уже определенную с длиной массива.
Сохранено 9 байтов благодаря @someone
источник
1<<f
с ,2*f
чтобы сохранить байты.Python 3 ,
6389 байтПопробуйте онлайн!
Также работает для Python 2; Байт можно сохранить в Python 2, заменив return на print и используя функцию print для stdout вместо return. R поворачивается
True
для остановки иFalse
не остановки.Спасибо @Neil и @Arnauld за то, что я заметил, что мне нужно больше проверять, чтобы остановить. Спасибо @Jitse за указание на проблему с
[2,0]
. Спасибо @mypetlion за то, что отметили, что абсолютные значения ленты могут превышать длину ленты.источник
x+x
, достаточно?[ 3, 2, 1, 1, 4, 0 ]
это остановка более чем за 12 итераций.len(x)*x
не будет работать. Например,[8,7,6,5,7,4,0,3,6]
останавливается в более чем итераций.2**len(x)
все еще немного меньше максимума? Я рассчитываю количество состояний какn*(2**n)
(сn=len(x)-1
).Желе ,
1511 байтПопробуйте онлайн!
Монадическая ссылка, которая принимает входные данные в виде списка целых чисел, используя 0 для обозначения остановки. Возвращает 0 для остановки ввода и 1 для тех, которые не останавливаются.
Избегает необходимости отрабатывать количество итераций из-за использования
ÐL
которых будет повторяться до тех пор, пока не будет получен новый результат.Спасибо @JonathanAllan за сохранение байта!
объяснение
источник
N1¦ṙ⁸ḢƊÐLḢẸ
Python 3 , 91 байт
Попробуйте онлайн!
-40 байт благодаря Джокингу и Джитсе
источник
while
условие.Perl 6 ,
46 4336 байтПопробуйте онлайн!
Представляет halt by
0
и возвращает true, если машина останавливается. Это повторяет логические2**(length n)
времена, когда указатель попадает в ячейку остановки, в противном случае он остается в ячейке без остановки.Это работает, потому что существуют толькоХорошо, да, есть состояния, чем это, но из-за ограниченных возможных переходов между указателями (и, следовательно, состояниями) будет менее 2 ** $ _ состояний ... Я думаю,2**n
возможные состояния (игнорирование ячеек остановки) для машины Foo, так как каждая ячейка без остановки имеет только два состояния.объяснение
источник
05AB1E ,
1413 байтПопробуйте онлайн!
Принимает входные данные как список целых чисел с 0 в качестве инструкции остановки. Возвращает 1 для остановки и 0 для не остановки.
Спасибо @KevinCruijssen за сохранение 2 байта!
источник
ć
! Я ждал объяснения в надежде сыграть в гольф мой ответ, но вы меня опередили, хаха. ; p -1 байт, играя в тот же гольф, что и мой ответ:g·F
to«v
( Попробуйте онлайн. )©®
вместоDŠs
:«vć©(š®._}®_
( Попробуйте онлайн. )«v
кgoF
.Java 8,
787973 байтаПрямой порт ответа @EmbodimentOfIgnorance 's C # .NET , так что не забудьте его поддержать!
Спасибо @Arnauld за нахождение двух ошибок (что также относится к некоторым другим ответам).
Приводит к
java.lang.ArithmeticException: / by zero
ошибке, когда она может остановиться, или нет, если нет.Попробуйте онлайн.
Объяснение:
источник
int*
(из codegolf.meta.stackexchange.com/a/13262/84206 )Haskell , 79 байтов
Попробуйте онлайн!
Возвращает
True
за остановку машины иFalse
прочее. Ввод в виде списка с0
представлением состояния остановки.Предполагается, что версия GHC больше 8,4 (выпущена в феврале 2018 года).
источник
JavaScript (Node.js) ,
7167 байтВ основном так же, как @EmbodimentOfIgnorance 's C # .NET answer
4 байта сохраняются благодаря @Arnaud
Попробуйте онлайн!
JavaScript (Node.js) , 61 байт
Эта версия использует
undefined
в качестве символа остановки и бросает a,TypeError: Cannot read property 'f' of undefined
когда машина останавливается, и тихо завершает работу, когда машина не останавливается.Попробуйте онлайн!
источник
Scala , 156 байт
ИМО по-прежнему пригоден для игры в гольф, но пока я в порядке. Возвращает
0
для не останавливающихFoo
s и1
для останавливающихFoo
s. Принимает входные данные вa
видеArray[Int]
, поэтомуh
принимается как0
.Он довольно длинный для запуска (около 4 секунд для всех тестовых случаев) из-за нескольких выполненных мною поисков полного массива, а также для
.deep
создания копий ... Но вы все равно можете попробовать это онлайн.источник
Perl 5
-ap
, 88 байтПопробуйте онлайн!
источник
Атташе , 40 байт
Попробуйте онлайн!
объяснение
Это выполняет одну итерацию машины Foo; он отрицает первый член, затем вращает массив с помощью (исходного, неотрицанного) первого элемента массива.
Periodic
будет применять эту функцию, пока не будет получен повторяющийся результат. Машина либо останавливается, либо входит в тривиальный бесконечный цикл. Если он остановится, первый элемент будет 0. В противном случае он будет ненулевым.&N
это гольф-способ получения первого элемента числового массива. ЗатемNot
возвращаетсяtrue
для 0 (остановка машины) иfalse
для всего остального (не остановка машины).источник
Древесный уголь , 28 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Выходы, использующие логический выход Charcoal по умолчанию, который
-
для true и ничего для false. Объяснение:Инициализируйте указатель инструкции.
Цикл столько раз, сколько есть теоретически возможных состояний.
Отмените значение в указателе инструкций.
Вычтите новое значение из указателя инструкций. Доступ к массиву угля является циклическим, поэтому он автоматически эмулирует кольцевую ленту Фу.
В конце цикла выведите, остановилась ли программа.
источник
Stax , 11 байт
Запустите и отладьте его
Он принимает входные данные в виде целочисленного массива с
0
представлением остановки.Это выводит
1
для остановки и0
для машины без остановки.источник
Pyth , 12 байт
Тестирование!
Использует прямой подход. Повторяйте, пока мы не увидим список дважды в одинаковом состоянии. Для программ, которые останавливаются, список в конечном итоге будет иметь лидерство,
0
потому что именно там останавливается рекурсия. Для программ, которые не останавливаются, список не начинается с0
, а скорее находится в состоянии, из которого процесс будет периодическим, и поэтому машина Foo не будет останавливаться.источник