Звертається чи попереджує? Залежить


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, зміна аргументів, запис у файл тощо).

Ви можете припустити, що введення ніколи не буде дійсним або не пустим.

Приклади

Наступні входи попередньо підготовлені :

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

Це всі придатні :

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

Це все обидва :

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

І це все ні :

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

Як завжди, це , тому застосовуються стандартні лазівки, і найкоротша відповідь у байтах виграє!


Цей виклик особливо важкий у мозку, де максимум, тому максимум брауні вказує на будь-яку відповідь, написану на мозку. :)


1
maximum brownie pointsЯ думаю, що пропонування максимум очок браузера та файлів cookie замість цього стимулює Brain-Flaking це завдання більше, ніж просто окуляри брауні, оскільки я не думаю, що це зовсім не банально на будь- якій мові, не кажучи вже про Brain-Flak. : P
Ерік Аутгольфер

FYI: Усі обидва тести закінчуються відкритими дужками, всі обидва тести закінчуються закритими дужками.
Джонатан Аллан

2
Я б заперечував, що "обидва" - це неправильний термін. Рядок , як ][це НЕ appendable, так як ви нічого не можете додати не може зробити його дійсним. Аналогічно, це не попередньо. Це ... "вставні"! Ви можете вставити його в рядок, щоб зробити весь дійсний Brainflak.
orlp

Уже врівноважені рядки або обидва?
Пшеничний майстер

@wheatwizard Збалансовані рядки не будуть надані як вхідні дані. You can assume that the input will never be valid brain-flak or empty.
DJMcMayhem

Відповіді:


6

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

знайдено помилку, жахливе виправлення +5 байт, краще виправлення - 2 байти, використовуючи трюк Adnan's, який я бачив тут ще на -1.

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

Повернені значення:

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

(Неправильний вхід повертає хибні результати, хоча повертається дійсний Brain-flack [].)

Спробуйте в Інтернеті! - тестовий набір (друкує в'язані зображення, тобто20для[2,0]і ігнорує рядки, що містять будь-які-).


5

Сітківка , 41 40 41 байт

1 байт збережено завдяки @MartinEnder

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

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

Спробуйте в Інтернеті!

  • Попередньо є 1
  • Придатним є 0
  • І те й інше 10
  • Жоден 01

Правки

  • Набрав 1 байт, щоб виправити помилку, помічену @Neil

[]})>]зберігає байт.
Мартін Ендер

@MartinEnder О, це тому, що набори символів не можуть бути порожніми, дякую!
Kritixi Lithos

Наприклад, це не працює для всіх непридатних входів (][). Я думаю, що це можна виправити ціною одного байта, змінивши 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%

Виходи ]для [додавання, ][для додавання, для обох, []для жодного.


3

Haskell , 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

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 => ні

Тестові шафи


"Поки кожен результат є чітким і послідовним, це добре". Схоже, це значення не має для жодного.
Cyoce

@Cyoce Це зараз виправлено
Йорг Гюльсерманн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.