Додає або додає? Залежить

DJMcMayhem 04/29/2017. 6 answers, 427 views
code-golf string balanced-string classification brain-flak

Мозковий шмат перетворюється на річний завтра! На честь дня народження, у нас є день народження на тему стилю PPCG, де кілька користувачів повідомляють питання, пов'язані з мозком. Допоможіть нам святкувати! :)


Brain-flak є езотеричною мовою, яку я написав, де всі команди є дужками, і всі дужки повинні бути повністю відповідними. Позиціонувати своє власне визначення :

  • Для цілей цього завдання "кронштейн" - це будь-який з цих символів: ()[]{}<> .

  • Пара дужок вважається "сумісною", якщо відкриваючі та закриваючі дужки знаходяться в правильному порядку і не мають в них символів, наприклад

    ()
    []{} 

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

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

    Підлементи також можуть бути вкладені в кілька шарів глибоко.

    [(){<><>[()]}<>()]<[{((()))}]> 
  • Рядок вважається "Повністю узгоджений" тоді і тільки тоді, коли:

    1. Кожен символ - це кронштейн,

    2. Кожна пара кронштейнів має правильний відкритий і закриваючий кронштейн і в правильному порядку

У святкуванні першого дня народження головного мозку, сьогоднішній виклик полягає в тому, щоб взяти незбалансований набір дужок і визначити, які типи операцій потрібні, щоб зробити це дієвим мозковим флаконом.

  • Наприклад, (( не є коректним мозковим кодом, але якщо ми додаємо )) до неї стає (()) , що є повністю збалансованим, а отже і правильним мозковим флаконом. Це робить цей вхід appendable .

  • Аналогічним чином, >} недійсний, але ми можемо приєднати {< до нього, щоб зробити {<>} , що є дійсним. Це робить цей вхід prependable .

  • Деякі входи трохи складніші. Наприклад, )][({ не може бути чинним суто шляхом додавання або додавання, але це can бути дійсним, додавши [( і доповнення })] . Тому цей вхід є одночасно prependable і prependable .

  • Нарешті, деякі входи ніколи не зможуть стати правильним кодом мозку через будь-яку комбінацію додавання або додавання. Наприклад, (> ніколи не може бути встановлено правильно. (Примітка < створює <(> , і додавання ) створює (>) , і ніхто з них не є дійсним). Таким чином, цей ввід не є придатним або недоступним.

Для сьогоднішнього виклику, ви повинні написати програму або функцію, яка приймає рядок дужок і визначає, чи є рядок

appendable
prependable
both
neither 

Ви можете вибрати, які значення ви використовуєте, щоб представляти для кожного випадку. Наприклад, виводячи 1, 2, 3, 4 або 'a', 'p', 'b', 'n' або 1, 'foo', 3.1415, -17 або все, що добре. Поки кожний вихід є distinct та consistent , це добре. Проте, ви must чітко вказати, який випуск відповідає тому випадку.

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

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

Приклади

Наступні входи є всіма prependable :

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

Все це appendable :

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

Це всі both :

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

І це не всі:

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

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


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

5 Comments
1 Erik the Outgolfer 04/29/2017
Я думаю, що пропонування максимального куточкового пункту та печива призведе до заохочення Brain-Flaking цього виклику більше, ніж просто добрих очок, оскільки я не думаю, що це зовсім ні на що, ні на any мові, не кажучи вже про Brain-Flak. : П.
Jonathan Allan 04/29/2017
FYI: всі обидва тести закінчуються відкритими дужками, всі тести не закінчуються закритими дужками.
1 orlp 04/29/2017
Я б стверджував, що "обидва" - це неправильний термін. Рядок, подібний до ][ not може not доданий, оскільки ніщо, яке ви можете додати, може зробити його дійсним. Точно так само, це не підходить. Це ... "вставка"! Ви можете вставити його в рядок, щоб зробити весь правильний Brainflak.
Funky Computer Man 04/30/2017
Чи є вже збалансовані струни або ні?
DJMcMayhem 04/30/2017
@wheatwizard Збалансовані рядки не будуть вводитися як вхідні дані. You can assume that the input will never be valid brain-flak or empty.

6 Answers


Jonathan Allan 04/29/2017.

Желе , 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 

(Невірний вхід повертає хибні результати, хоча і правильний мозок, повертає [] .)

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


Cows quack 04/29/2017.

Retina , 41 40 41 байт

1 byte saved thanks to @MartinEnder

+`\(\)|\[]|{}|<>[]})>]+
1
\W+
0
...+
01 

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

  • Потрібно 1
  • Придатне значення - 0
  • Обидва - 10
  • Немає 01

Редагування

  • Отримано 1 байт для виправлення помилки, поміченого @Neil
5 comments
Martin Ender♦ 04/29/2017
[]})>] зберігає байт.
Cows quack 04/29/2017
@MartinEnder Ах, це тому, що набори символів не можуть бути порожніми, дякую!
Neil 04/29/2017
Це не працює для всіх непридатних входів, наприклад (][) . Я думаю, що це можна зафіксувати за ціною одного байта, змінивши 101 на ...+ .
Cows quack 04/29/2017
@Нелі Дякуємо, що помітили помилку. Цікаво, чи існують і такі випадки з Both
Neil 04/29/2017
Ні, я думаю, 10 є єдиною дієвою комбінацією для Both .

Neil 04/29/2017.

Пакетний, 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% 

Outputs ] для попереднього додавання, [ для додавання ][ для обох, [] для ні.


Ørjan Johansen 04/29/2017.

Haskell 115 108 байт

EDIT:

  • -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 є відкритим кронштейном, і, якщо так, залишить відповідний закриваючий кронштейн на стек для рекурсії.
    • В іншому випадку, якщо стек містить закриваючі дужки, друга гілка перевіряє, чи верхній збігається з наступним символом, і якщо ні, то повертає порожній список, а не рекурсивно.
    • Нарешті, в останній гілці стек порожній, і у нас є незрівнянний закриваючий кронштейн, який може бути виправлений заздалегідь, перш ніж рекурсивно.

ETHproductions 04/29/2017.

Japt , 44 байти

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

Виходи 1 для prependible, 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 

Jörg Hülsermann 06/04/2017.

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 => prependible

12 => обидва

0 => ні

Тестові шафи

2 comments
Cyoce 06/04/2017
"До тих пір, поки кожен вихід є чітким та consistent, це добре". Це, схоже, не має постійного значення для ніхто.
Jörg Hülsermann 06/04/2017
@Cyoce Теперь виправлено

Related questions

Hot questions

Language

Popular Tags