Добавляет или Предполагает? Зависит

23

Завтра мозгу исполняется год! В честь его дня рождения мы проводим вечеринку по случаю дня рождения в стиле PPCG, на которой несколько пользователей публикуют вопросы, связанные с умом! Помогите нам отпраздновать! :)


Brain-flak - это эзотерический язык, который я написал, где все команды являются скобками, и все скобки должны быть полностью согласованы. Чтобы позаимствовать мое собственное определение :

  • Для этого вызова, «скобка» представляет собой любая из этих символов: ()[]{}<>.

  • Пара скобок считается "совпавшей", если открывающая и закрывающая скобки расположены в правильном порядке и в них нет символов, например

    ()
    []{}
    

    Или если каждый подэлемент внутри него также совпадает.

    [()()()()]
    {<[]>}
    (()())
    

    Субэлементы также могут быть вложены в несколько слоев.

    [(){<><>[()]}<>()]
    <[{((()))}]>
    
  • Строка считается «Полностью сопоставленной», если и только если:

    1. Каждый отдельный символ - это скобка,

    2. Каждая пара скобок имеет правильные открывающую и закрывающую скобки и в правильном порядке

В связи с празднованием первого дня рождения «мозговых штурмов» сегодняшняя задача состоит в том, чтобы взять несбалансированный набор скобок и определить, какие типы операций необходимы для того, чтобы сделать его корректным.

  • Например, ((недопустим код мозгового штурма, но если мы добавим ))к нему, он становится (()), который полностью сбалансирован, и, следовательно, действителен мозговой зенит. Это делает этот вклад доступным .

  • Точно так же >}недействительно, но мы можем предвосхитить {<его, чтобы сделать {<>}, что допустимо. Это делает этот вклад ожидаемым .

  • Некоторые входные данные немного сложнее. Например, )][({нельзя сделать действительным только путем добавления или добавления. Но это можно сделать действительным, [(добавив и добавив })]. Таким образом, этот вход является одновременно prependable и appendable .

  • Наконец, некоторые входные данные никогда не могут быть сделаны действительным кодом мозгового штурма с помощью любой комбинации добавления или добавления. Например, (>никогда не может быть сделано действительным. (Предварительное <создание создает <(>, а добавление )создает (>), ни одно из которых не является действительным). Следовательно, этот ввод не является ни добавляемым, ни добавляемым.

Для сегодняшнего вызова вы должны написать программу или функцию, которая принимает строку в скобках и определяет, является ли строка

appendable
prependable
both
neither

Вы можете выбрать, какие значения вы используете для представления в каждом конкретном случае. Например, вывести 1, 2, 3, 4, или 'a', 'p', 'b', 'n', или 1, 'foo', 3.1415, -17, или как угодно. Пока каждый вывод отличается и согласован , это нормально. Однако вы должны четко указать, какой вывод соответствует какому случаю.

Вы можете вернуть это значение в любом удобном для вас формате (например, возврат из функции, печать в STDOUT, изменение аргументов, запись в файл и т. Д.).

Вы можете предположить, что входные данные никогда не будут действительными или пустыми.

Примеры

Следующие входные данные являются все возможными :

))
(((()()())))}
)>}]
()[]{}<>)

Это все можно добавить :

(({}{})
((((
([]()())(
{<<{

Это все оба :

))((
>()[(()){
>{

И это не все ни :

)(}
{(((()()()))>
[}
((((((((((>
((((((((((<>()]

Как обычно, это , поэтому применяются стандартные лазейки, и выигрывает самый короткий ответ в байтах!


Эта задача особенно трудна в мозговых штурмах, поэтому максимальное количество брауни указывает на любой ответ, написанный в мозговых штурмах. :)

DJMcMayhem
источник
1
maximum brownie pointsЯ думаю, что предлагая максимальное количество очков для брауни и печенье вместо этого поощряет Brain Flaking к этому вызову больше, чем просто очки для брауни, поскольку я не думаю, что это вообще тривиально на любом языке, не говоря уже о Brain-Flak. : P
Эрик Outgolfer
К вашему сведению: оба теста заканчиваются открытыми скобками, все тесты заканчиваются закрытыми скобками.
Джонатан Аллан
2
Я бы сказал, что «оба» - неправильный термин. Строка , как ][это не appendable, так как вы ничего не можете добавить не может сделать его действительным. Точно так же это не предсказуемо. Это ... «вставляемый»! Вы можете вставить его в строку, чтобы сделать весь действительный Brainflak.
Orlp
Уже есть сбалансированные строки как или нет?
Wheat Wizard
@wheatwizard Сбалансированные строки не будут предоставлены в качестве входных данных. You can assume that the input will never be valid brain-flak or empty.
DJMcMayhem

Ответы:

6

Желе , 33 32 37 35 34 байта

найдена ошибка, ужасное исправление +5 байт, лучшее исправление - 2 байта, используя трюк Аднана, который я видел здесь еще на -1.

“({[<“)}]>”Z;@WœṣF¥/µÐLO‘&2µIṀ>0ȯQ

Возвращаемые значения:

prepends [2]
 appends [0]
    both [2,0]
 neither 1

(Неверный ввод возвращает ложные результаты, хотя верный Brain-flack, возвращает [].)

Попробуйте онлайн! - это набор тестов (отпечатки mushed представления, поэтому20для[2,0], и игнорирует строкисодержащие любые-).

Джонатан Аллан
источник
5

Сетчатка , 41 40 41 байт

1 байт сохранен благодаря @MartinEnder

+`\(\)|\[]|{}|<>

[]})>]+
1
\W+
0
...+
01

Попробуйте онлайн!

  • Предполагаемый 1
  • Добавляемый 0
  • И то и другое 10
  • Нет 01

Правки

  • Получил 1 байт, чтобы исправить ошибку, замеченную @Neil
Kritixi Lithos
источник
[]})>]сохраняет байт.
Мартин Эндер
@MartinEnder Ах, это потому, что наборы символов не могут быть пустыми, спасибо!
Критиси Литос
Это не работает для всех не добавляемых элементов, например (][). Я думаю, что это может быть исправлено за счет одного байта путем изменения 101на ...+.
Нил
@Neil Спасибо за заметив ошибку, мне интересно , если есть такие случаи с Bothа
Kritixi Lithos
Нет, я думаю, что 10это единственная действительная комбинация для Both.
Нил
3

Пакетный, 337 байт

@echo off
set/ps=
:g
set "t=%s:<>=%
set "t=%t:()=%
set "t=%t:[]=%
set "t=%t:{}=%
if not "%t%"=="%s%" set "s=%t%"&goto g
set "s=%s:<=[%
set s=%s:>=]%
set s=%s:(=[%
set s=%s:)=]%
set s=%s:{=[%
set s=%s:}=]%
:l
if %s:~,2%==]] set s=%s:~1%&goto l
:r
if %s:~-2%==[[ set s=%s:~,-1%&goto l
if not _%s:~2%==_ set s=[]
echo %s%

Выходы ]для prepend, [для append, ][для обоих, []ни для того, ни для другого.

Нил
источник
3

Хаскелл , 115 108 байт

РЕДАКТИРОВАТЬ:

  • -7 байт: использовать больше охранников.
(""#)
s#""=[s>"",1>0]
s#(c:d)|Just a<-lookup c$zip"([{<"")]}>"=(a:s)#d|(a:b)<-s=[1|a==c]>>b#d|0<1=take 1$s#d

Попробуйте онлайн!

Используйте как (""#) "))". Результаты выдаются как:

[False,True]: needs nothing
[False]: prependable
[True,True]: appendable
[True]: both
[]: neither

Как это работает

  • Выходное кодирование выбирается таким образом, чтобы о необходимости предварительного добавления сообщалось путем удаления второго элемента результата для остатка, если таковой имеется, в то время как полное несоответствие сигнализируется путем удаления всех их.
  • s#d разбирает оставшуюся строку d , учитывая строку / стек sожидаемых закрывающих скобок.
    • s#"" проверках линии , если все закрывающие скобки были найдены в конце строки, в противном случае добавления требуется.
    • Первая ветвь s#(c:d) проверяет, является ли следующий символ cоткрывающей скобкой, и если это так, оставляет соответствующую закрывающую скобку в стеке для рекурсии.
    • В противном случае, если в стеке есть закрывающие скобки, вторая ветвь проверяет, соответствует ли верхняя ветвь следующему символу, а если нет, возвращает пустой список вместо повторяющихся.
    • Наконец, в последней ветви стек пуст, и у нас есть непревзойденная закрывающая скобка, которую можно исправить, добавив перед повторением.
Орджан Йохансен
источник
2

Japt , 44 байта

=Ue"%(%)|%[]|\{}|<>" ®c -1&2|1})f31 |UfD |Ug

Выходы 1для ожидаемых,3 для дополняемого, 13для обоих, и31 ни для одного.

Проверьте это онлайн!или Проверьте все тестовые случаи одновременно.

Как это работает

 =Ue"%(%)|%[]|\{}|<>" ®   c -1&2|1})f31 |UfD |Ug
U=Ue"%(%)|%[]|\{}|<>" mZ{Zc -1&2|1})f31 |UfD |Ug

                    // "(((()()())))}"  "([({}{})"    ">()[(()){"  "((((<>()]"
Ue"%(%)|%[]|\{}|<>" // Recursively remove all instances of "()", "[]", "{}", and "<>" from U.
                    // "}"              "(["          ">[{"        "((((]"
mZ{Zc -1&2|1}       // Replace each char Z with (Z.charCodeAt() - 1) & 2 | 1.
                    // "1"              "33"          "133"        "33331"
U=                  // Save the result in U.
f31 |UfD |Ug        // Match all instances of "31" and "13" (D = 13) and bitwise-OR the results with the first char.
                    // null|null|1      null|null|3   null|13|1    31|null|3
                    // 1                3             13           31
                    // Implicit: output result of last expression
ETHproductions
источник
2

PHP, 137 байт

for($c=1;$c;)$a=preg_replace("#<>|\(\)|\[\]|\{\}#","",$a=&$argn,-1,$c);echo($a=preg_replace(["#[]})>]+#","#[[{(<]+#"],[1,2],$a))<13?$a:0;

1 => добавляемый,

2 => ожидаемый,

12 => и,

0 => ни

Testcases

Йорг Хюльсерманн
источник
«Пока каждый вывод отличается и согласован, это нормально». Это, кажется, не имеет постоянного значения ни для того, ни для другого.
Cyoce
@Cyoce Теперь это исправлено
Йорг Хюльсерманн