Еще одна проблема разбора Brainfuck, но на этот раз ... другая.
Вы работаете в Infinite Monkeys Incorporated, компании, производящей программы Brainfuck, для решения различных интересных задач (случайно, не менее - в конце концов, компания делает случайные программы). Тем не менее, кажется, что ваши быстрые машины Тьюринга, которые выполняют только Brainfuck, имеют небольшую и дорогую проблему с синтаксическими ошибками - одна проблема, и компьютер взрывается. Вероятно, это недостаток дизайна, но никто не удосужился выяснить, почему это происходит.
Поскольку машины Тьюринга (особенно быстрые) дороги (в конце концов, они имеют бесконечное ОЗУ, которое стоит), было бы лучше убедиться, что в программе нет синтаксических ошибок перед выполнением кода. Ваша компания собирается запустить много кода, поэтому ручная проверка не будет работать. Напишите программу, которая читает STDIN для кода Brainfuck и завершает работу со значением состояния выхода, отличным от 0 (ошибка), если в программе есть какая-либо синтаксическая ошибка (например,
]
это синтаксическая ошибка, потому что нет соответствия[
). Выход с состоянием выхода, установленным на 0, если программа полностью в порядке.Убедитесь, что ваша программа правильно замечает ошибки, связанные с
[]
. Вы бы не хотели, чтобы взорвался другой компьютер? Да, и убедитесь, что оно максимально короткое - ваш начальник платит за короткие программы (потому что он считает, что они быстрые или что-то в этом роде). О, и вам не нужно кодировать в Brainfuck (на самом деле, вы не можете, потому что Brainfuck не поддерживает коды выхода) - ваш код будет запускаться на обычном компьютере.
Итак, как вы видите, ваша задача - проверить, является ли программа Brainfuck «действительной» (с парными []
символами). Обратите внимание, что в программах Brainfuck могут быть другие символы []
, поэтому не отказывайтесь от программы только потому, что в ней есть другие команды. Наименьший код выигрывает, но, вероятно, вам все равно будет важнее голосование против.
источник
GCD(a,b)
вместо0 != a || b
.Ответы:
GolfScript, 18 символов
Этот код успешно выполняется с кодом выхода 0 (и выводит часть мусора в стандартный вывод), если квадратные скобки во входных данных сбалансированы. Если это не так, происходит сбой с ненулевым кодом выхода и выводится сообщение об ошибке в stderr, например:
или
Поскольку в запросе ничего не сказано о выводе в stdout / stderr, я полагаю, что это подходит. В любом случае вы всегда можете перенаправить их на
/dev/null
.Объяснение:
Код
{[]`?)},
удаляет из входных данных все, кроме квадратных скобок, и результат~
оценивается как код GolfScript. Сложность в том, что несбалансированные скобки совершенно законны в GolfScript (и, действительно, мой код содержит одну!), Поэтому нам нужен какой-то другой способ вызвать сбой кода.Хитрость, которую я использую, заключается в том, чтобы оставить копию ввода в нижней части стека, собрать весь стек в массив (используя несбалансированный
]
) и сдвинуть первый элемент. На этом этапе могут произойти три вещи:[
, попытка сдвинуть элемент с пустого массива приведет к сбою интерпретатора (что, в данном случае, именно то, что мы хотим!)]
или закрыт[
), это будет массив.Моя первоначальная запись из 14 символов сравнивала смещенное значение со строкой, которая вылетала бы, если бы это был вложенный массив. К сожалению, оказывается, что сравнение плоского (или, в частности, пустого) массива со строкой также допустимо в GolfScript, поэтому мне пришлось переключиться на такт.
Вместо этого в моем текущем представлении используется метод очень грубой силы, чтобы отличить массивы от строк: он выявляет их и пытается найти первое вхождение
[
(код ASCII 91), которое будет равно нулю тогда и только тогда, когда не уклонено переменная была массивом. Если это так, разделение нуля на себя вызывает желаемый сбой.Ps. Два других 18-символьных решения:
и
Увы, я еще не нашел более короткий способ решить «проблему пустых массивов».
источник
][
(т.е. это терпит неудачу в вашей программе?)[[]
; Я исправил это сейчас, по цене 4 символов, и теперь он проходит все мои тесты.1+
превратит пустой массив в непустой массив, непустой массив в непустой массив, а строку в строку..{[]`?)},~](n<
. Я попробовал ваш1+
, но кажется, что массив должен содержать что-то отличное от числа (предположительно, чтобы интерпретатор зависал при попытке рекурсивного сравнения символа с массивом / строкой). Использованиеn+
также не работает, так как он приводит массив в строку;[n]+
делает работу, но по- прежнему ставит меня в 18 символов.Brainfuck 76 байт
Это выходит из-под контроля, если квадратные скобки не сбалансированы, что приводит к сбою интерпретатора / компилятора bf, и некоторые из них имеют коды выхода, чтобы отразить это.
требует eof = 0, значений переноса и конечного числа ячеек
В Ubuntu вы можете использовать интерпретатор
bf
(sudo apt-get install bf
)источник
Brainfuck
Тьюринг завершен без ввода-вывода, так как вы можете запустить программу, которая вычисляет любые вычисления и посмотреть результат, проверив его память после запуска. BF без ввода / вывода сделает людей менее заинтересованными, так как будет сложно сделать утилиты. Например, я никогда не смог бы сделать мой переводчик LISP .Befunge 98 -
26312019 символовИзбавился от некоторых массивных условных выражений. Теперь программа работает следующим образом:
q
выходит из программы и выводит верхнее значение в качестве значения ошибки. Значение ошибки будет-11, если их слишком много]
, 0, если они сбалансированы, иположительноотрицательным, если их слишком много[
. Если числоположительноотрицательно, то для балансировки программы необходимостолькоабсолютных значений этого числа]
.Редактировать: переключаемое увеличение и уменьшение.
[
используется для увеличения счетчика и]
для его уменьшения. Переключая его, я сохраняю 1 символ, потому что для условия выхода мне нужно только проверить, является ли счетчик положительным, а не отрицательным.Старая версия
Этот код работает следующим образом:
Изменить: понял, что это принятые входные данные, как
][
, теперь он заканчивается всякий раз, когда счет становится отрицательным, используяисточник
[
и]
сделать сравнение с обоими.J (
3835)Объяснение:
1!:1[3
: читать стандартный'[]'=/
: создать матрицу, в которой первая строка является битовой маской[
s во входных данных, а вторая строка -]
s.1 _1*
: умножить первый ряд на 1, а второй на -1.+/
: суммировать столбцы матрицы вместе, давая дельта-отступ на символ+/\
: создайте их общее количество, давая уровень отступа для каждого символа({:+.<./)
: вернуть GCD последнего элемента ({:
) и самого маленького элемента (<./
). Если все скобки совпадают, оба из них должны быть,0
так что это вернет0
. Если фигурные скобки не совпадают, возвращается ненулевое значение.exit
: установите значение выхода на это и выйдите.источник
рубин (64)
ранее (68) это было:
Другое эквивалентное решение использует
не может использовать
size
один, потому что это даст ложные отрицания (!!!), когда общее количество несбалансированных скобок кратно 256источник
=
оператором.0
могут пойти.Perl, 30 символов
Ваш основной Perl рекурсивный регулярное выражение на помощь:
Для тех, кто не знаком с аргументами командной строки, используемыми здесь:
-0
позволяет установить символ конца строки для целей ввода файла; использование-0
без аргумента устанавливает символ конца строки в EOF.-n
автоматически считывает ввод (в данном случае весь файл) в$_
заранее.Если регулярное выражение совпадает, оно возвращает истинное значение, которое сводится к 0 для кода выхода. В противном случае ложное возвращаемое значение дает код выхода 1.
источник
Баш (tr + sed) - 42
Если вы не возражаете против сообщений об ошибках, вы можете удалить последний пробел между
`
и]
получить длину 41.источник
cat
и$()
(также"[]"
можно записать как[]
). Я принял этот ответ, но пока я не увижу улучшения в длине, я не собираюсь повышать это, так как пока короткий, это может быть намного короче для bash.$()
галочкой и сделал"[]"
->[]
вы предложили.Perl (56 символов)
Очевидное решение Perl: рекурсивное регулярное выражение. К сожалению, это довольно многословная конструкция.
источник
Хаскелл (143)
to jgon: использование 2-х охранников кажется более плотным, чем если-то-еще. Кроме того, я не думаю, что ваш проверяет, что скобки в правильном порядке ("] [" проходит)
источник
C
7364 символаБлагодаря предложениям из хлебного ящика (хотя это, вероятно, требует порядка с прямым порядком байтов):
Как это устроено:
i
получает значение 0c
становится неявным int, который получаетargc
(инициализируется 1, но нам все равно, только если старшие биты не установлены)read(0,&c,1)
считывает один символ в младший байт c (на архитектурах с прямым порядком байтов) и возвращает 0 в EOF;i+1 != 0
если кавычка в сбалансированной скобке не равна -1; умножение их вместе работает как (безопасное) логическое И, которое занимает на один символ меньше, чем&&
c==91
оценивает до 1 для'['
иc==93
оценивает до 1 для']'
. (Там может быть какой-то трюк с мелочами, который будет меньше, но я ничего не могу придумать.)return i
выходит с кодом состояния 0, если он сбалансирован, и ненулевым, если это не так. Возвращение -1 технически нарушает POSIX, но на самом деле это никого не волнует.Предыдущая версия:
источник
getchar()
вместо чтения сократит код и позволит вам использовать (неявно)int
вместоchar
своей переменной. Также помните, что глобальные переменные автоматически обнуляются.c;
определяет глобальный int.][
? Я уверен, что это не сбалансировано. Разве вы не должны следить за тем, не станет ли он отрицательным хотя бы один раз?Луа, 56
источник
"^%b[]$"
что это? Вы можете объяснить? Конечно, это не регулярное выражение?^
), сбалансированному набору[
и]
чему угодно inbetween (%b[]
) и концу string ($
).GTB , 55
Пропускает
[]
Используйте,
0
чтобы остановить.источник
МАТЕМАТИКА, 88 символов
источник
s name like
RegularExpression` иStringLength
я никогда не смогу выиграть контекст гольф-кода с Mathematica! :)ToCharacterCode
гораздо дольше, чемord
также ... PS: А как насчет установки кода выхода?Length[StringCases[s,"["|"]"]//.{x___,"[","]",y___}:>{x,y}]
Рубин,
5958Сканирует на открывающую и закрывающую скобки, считая
[
как 1 и]
как -1, и выходит, если количество падает ниже 0.источник
exit 1
вы спросите).Калий , 104 байта
Полностью развернуто (примечание не работает в онлайн-переводчике, так как вход () отключен) здесь
источник
Код машины Тьюринга,
286276 байтОпять же, я использую синтаксис таблицы правил, определенный здесь.
Завершается в состоянии
halt
принять ввод иhalt-err
отклонить его.источник
halt-err
может быть короче, какhalt*
например.Pyth, 25 байт
Попробуйте онлайн!
Перевод Python 3:источник
Хаскелл (
167, 159)Делал это в основном для развлечения, если у кого-нибудь есть какие-либо предложения, как сделать его короче, я был бы рад услышать их, хотя :)
Изменить: Исправлена проблема, указанная мне в комментариях (добавлено 11 байт).
Редактировать 2: Создана вспомогательная функция для тестирования предикатов с использованием сторожей, созданных на основе user13350, с удалением 8 байтов.
источник
][
( указал user13350 )Stax ,
1411 персонажейЗапустите и отладьте его
Кредит @recursive для -3 байта.
ASCII эквивалент:
Удалите все символы, кроме
[]
, затем удалите,[]
пока строка больше не изменится. Вернуть,1
если последняя строка пуста.источник
.[]|&
для фильтрации символов, а затем повторно использовать литерал для 11