Давайте определим простой 2D-язык, который мы дадим невероятно оригинальному названию befinge . У Бефинге есть 5 инструкций:
<>^v
, как и в большинстве двумерных esolangs, перенаправьте указатель инструкции в их соответствующих направлениях..
это неоперация.
Указатель инструкций начинается в верхнем левом углу и идет вправо. Если указатель инструкции доходит до края, программа останавливается. Каждая программа Befinge, очевидно, либо остановится, либо войдет в бесконечный цикл, который ничего не делает. Вот два примера:
Приостановление:
>.v
..<
Non-Приостановление:
>....v
..v..<
..>v..
^..<..
Проблема остановки не решаема для языка, полного Тьюринга, но для этого. Ваша задача - написать программу (или функцию), которая принимает в качестве входных данных строку, представляющую программу befinge, и возвращает истинное или ложное значение в зависимости от того, останавливается она или нет.
- Вы можете предположить, что ввод будет состоять только из этих символов и будет дополнен пробелами для формирования прямоугольника.
- Вы можете использовать любой набор из пяти символов для инструкций (например
adws
).
Тестовые случаи
Приостановление:
.
v>
>^
....v....
....>...v
.^..<....
.......v<
.......v.
....^..<.
v<>v>v^
>v^>^>v
<>>^v<v
v^<>v^<
Non-Приостановление:
>..v
^..<
>v<
v<.
>v.
v<.
>.^
>.>.>.v
.><.<.<
Это код-гольф , поэтому выигрывает самая короткая (в байтах) программа.
источник
>..>.
или><
.Ответы:
ES6 (JavaScript),
111101 байтРЕДАКТИРОВАТЬ: изменил выходные значения на истину и ложь , вместо Y и N , чтобы сбрить еще 10 байтов
Golfed
Тест
Пример вывода
источник
Y
и вN
качестве вывода, как в JavaScript, они оба правдивы .Python 2 ,
116105 байтПопробуйте онлайн!
Задача старая, но я решил, что это самый короткий Python, я опубликую его. Ввод - это список строк, но используемые символы необычны.
Например, третий пример остановки превращается в
['LLLLCLLLL', 'LLLLGLLLC', 'LFLLBLLLL', 'LLLLLLLCB', 'LLLLLLLCL', 'LLLLFLLBL']
. Вывод осуществляется через код завершения, 0 (успех) для отсутствия остановки и 1 (ошибка) для остановки. Любые советы или хитрости приветствуются.источник
Befunge-98 (PyFunge) ,
217209200 байтПопробуйте онлайн!
Для того, чтобы остановить проблему, нужно найти решение. Возвращает 0 для правды и 1 для фальси. Помещает ввод в сетку, начиная с 1,15, а затем перемещается сверху, заменяя стрелки нулями. Как только мы достигаем нуля, мы знаем, что он зацикливается. Что-нибудь кроме> <^ v. и ноль считается для остановки программы, которая включает в себя границу пробелов, которую мы получаем вокруг программы, помещая ее в сетку с небольшим смещением.
Один из простых способов избавиться от нескольких укусов - использовать числа вместо> <^ v. но я не чувствую, что это того стоит.
источник
A befinge halting problem needs a befunge solution.
Точно. +1Turtlèd , 146 байт
Эта программа использует ввод-вывод по-разному: пожалуйста, завершите каждую строку пробелом, включая последнюю. Turtlèd не любит переводы строк, поскольку он использует сетку для второго измерения символов.
Попробуйте онлайн!
0 для циклов навсегда, 1 для остановок.
Общее объяснение:
Он записывает входные данные в сетку, затем фактически следует пути, по которому стрелки делают вокруг сетки, заменяя каждую стрелку на *, сохраняя направление в char var. Если он встречает *, стрелку, которую он ударил ранее, программа не остановится, поэтому она устанавливает char var в значение
0
, выход из цикла. В противном случае он достигнет конца сетки и выйдет из цикла. Он напишет символ вар. Если он достигает конца сетки, он использует направление, сохраненное в char var, чтобы вернуться к сетке, и устанавливает char var в значение1
, для остановок. Если char var был на самом деле 0, а не направление, ему не нужно возвращаться, так как он все еще там, и он устанавливает его обратно0
. Он очищает сетку, затем записывает char var,1
для остановок, иначе0
.источник
JavaScript (Node.js) , 80 байт
Попробуйте онлайн!
JavaScript (Node.js) , 86 байт
Попробуйте онлайн!
источник
JavaScript (ES6),
158127 байтПринимает ввод в виде двумерного символьного массива и возвращает
true
для остановки иfalse
бесконечного цикла. Работает, устанавливая символы посещенного направления в~
s, поскольку он рекурсивно обходит их. Редактировать: Сохраненные 31 байт путем обновления моего вектора направления перед повторением.Злоупотребление инструкцией символов (
1=^ 4=< 5=. 6=> 9=v
) приводит меня к 101 байту:источник
f=
в число байтов, но не код ...SmileBASIC,
158145 байтЕсли одна и та же стрелка встречается более одного раза, программа никогда не остановится. Когда указатель инструкции пропускает стрелку, он заменяется другим символом, который заставит функцию возвращать 0, если она будет достигнута снова. Если IP выходит за пределы, он возвращает 1.
Принимает ввод как массив строк.
<any non-digit chracter>
,1
,2
,3
,4
=.
,>
,<
,v
,^
источник
Python 2, 182 байта
Принимает массив строк в качестве входных данных. Мне нужно больше играть в гольф, но сейчас настало время подчеркнуть выборы.
Ungolfed:
источник
[-1,1][d=='v'] -> 2*(d>'>')-1
и[-1,1][d=='>'] -> 2*(d>'<')-1
сохранить в общей сложности 6 байтов.["<>"]
Clojure, 143 байта
Функция с 4 аргументами состояния: положение
p
, скоростьv
, индекс шагаi
и размер одной строкиs
. Возвращает,1
если мы не вышли за пределы в 10 ^ 9 шагов иnil
иначе. На самом деле , сколько шагов мы должны проверить , чтобы убедиться,(count %)
? Я думаю, что это больше, чем тот же NOP, который можно пройти по горизонтали и вертикали.Может быть вызвано так (принимает нормальные строки в качестве аргументов,
get
возвращаетnil
когда выходит за пределы):Переходы состояний (+1, -1, + s, -s) кодируются в словаре
{\> 1\< -1\^(- s)\. v\v s}
.источник
Python 2/3,
201192 байтаПопробуйте онлайн!
Дает правильный ответ для
["<>"]
источник
def f(x):
наx=input()
0 байтовой разницей, затем удалить лишние отступы (-8 байт), а затем заменитьreturn x
наexit(x)
(разрешено для каждого мета-консенсуса ) еще на 2 байта. В любом случае, хорошее решение!Ява, 477
Я знаю, что это не выигрыш, n = и, вероятно, может быть больше в гольфе, но он подразумевает аналогичный метод относительно того, что используют другие ответы, но этот использует hashmap для выполнения поиска. В качестве входных данных используются символы> <^ v и все, что не указано для параметра no op. Ввод поступает через аргументы.
GOLFED
UNGOLFED
импорт java.util. *;
Объяснение скоро!
источник
String a[]
чтобыString[]a
и опускать пробел.var
во многих местах, если вы используете Java 10.