Dołącza czy przygotowuje? Zależy

23

Mózg ma jutro roczek! Na cześć urodzin organizujemy przyjęcie urodzinowe w stylu PPCG, na którym kilku użytkowników zamieszcza pytania związane z atakiem mózgu! Pomóż nam świętować! :)


Brain-flak to ezoteryczny język, który napisałem, w którym wszystkie polecenia są nawiasami, a wszystkie nawiasy muszą być w pełni dopasowane. Aby pożyczyć własną definicję :

  • Dla celów niniejszego wyzwanie, „uchwyt” jest każdy z tych znaków: ()[]{}<>.

  • Para nawiasów jest uważana za „dopasowaną”, jeśli nawiasy otwierające i zamykające są w odpowiedniej kolejności i nie zawierają w sobie znaków, takich jak

    ()
    []{}
    

    Lub jeśli każdy podelement w nim również jest dopasowany.

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

    Elementy podrzędne mogą być również zagnieżdżone na kilku warstwach.

    [(){<><>[()]}<>()]
    <[{((()))}]>
    
  • Ciąg jest uważany za „w pełni dopasowany”, tylko wtedy, gdy:

    1. Każda postać to nawias,

    2. Każda para wsporników ma prawidłowy wspornik otwierania i zamykania we właściwej kolejności

Aby uczcić pierwsze urodziny uderzenia mózgu, dzisiejsze wyzwanie polega na przyjęciu niezrównoważonego zestawu nawiasów i określeniu, jakie rodzaje operacji są potrzebne, aby było to prawidłowe.

  • Na przykład, ((nie jest poprawnym kodem wyłamywania mózgu, ale jeśli ))do niego dołączymy , staje się (()), który jest w pełni zbalansowany, a zatem prawidłowy wyładowaniem mózgu. To sprawia, że ​​dane wejściowe są dołączalne .

  • Podobnie >}nie jest poprawny, ale możemy {<do tego przystąpić {<>}, aby dokonać , co jest ważne. To sprawia, że ​​dane wejściowe można uzupełnić .

  • Niektóre dane wejściowe są nieco bardziej skomplikowane. Na przykład )][({nie można unieważnić wyłącznie poprzez dołączanie lub dodawanie. Ale można to zrobić, dodając [(i dodając })]. Dlatego też, to wejście jest zarówno prependable i appendable .

  • Wreszcie, niektóre dane wejściowe nigdy nie mogą być poprawnymi kodami uderzeń mózgu za pomocą dowolnej kombinacji dołączania lub dodawania. Na przykład (>nigdy nie można unieważnić. (Wyprzedzanie <tworzy <(>, a dopisywanie )tworzy (>), z których żadne nie jest poprawne) W związku z tym danych wejściowych nie można dodawać ani dodawać.

Na dzisiejsze wyzwanie musisz napisać program lub funkcję, która pobiera ciąg nawiasów i określa, czy jest to ciąg

appendable
prependable
both
neither

Możesz wybrać, jakie wartości reprezentujesz dla każdego przypadku. Na przykład generowanie 1, 2, 3, 4, 'a', 'p', 'b', 'n'lub 1, 'foo', 3.1415, -17, lub cokolwiek innego jest w porządku. Dopóki każde wyjście jest odrębne i spójne , nie ma problemu. ty musi jednak jednoznacznie określić, który odpowiada wyjścia, do którego sprawa.

Możesz zwrócić tę wartość w dowolnym dogodnym formacie (na przykład powrót z funkcji, drukowanie do STDOUT, modyfikowanie argumentów, zapisywanie do pliku itp.).

Możesz założyć, że dane wejściowe nigdy nie będą poprawne lub nie będą puste.

Przykłady

Następujące dane wejściowe są uzupełnialne :

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

Wszystkie są dołączane :

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

Są to oba :

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

I to nie wszystko :

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

Jak zwykle jest to , więc obowiązują standardowe luki i wygrywa najkrótsza odpowiedź w bajtach!


To wyzwanie jest szczególnie trudne w przypadku uderzenia mózgu, więc maksymalna ilość punktów wskazuje na każdą odpowiedź zapisaną w uderzeniu mózgu. :)

DJMcMayhem
źródło
1
maximum brownie pointsMyślę, że oferowanie maksymalnej liczby ciastek i ciasteczek zachęciłoby Baking-Flaking do tego wyzwania bardziej niż tylko punkty ciasteczka, ponieważ nie uważam, że jest to trywialne w jakimkolwiek języku, nie mówiąc już o Brain-Flak. : P
Erik the Outgolfer
FYI: Wszystkie oba testy kończą się nawiasami otwartymi, wszystkie testy nie kończą się nawiasami zamkniętymi.
Jonathan Allan
2
Twierdziłbym, że „oba” to zły termin. Ciąg podobny nie][ jest dołączany, ponieważ nic, co można dołączyć, nie może spowodować jego poprawności. Podobnie nie jest to możliwe do zniesienia. Jest ... „wkładany”! Możesz wstawić go do łańcucha, aby cały prawidłowy Brainflak.
lub
Czy już zbalansowane ciągi są jedno czy drugie?
Kreator pszenicy 30.04.17
@wheatwizard Zrównoważone łańcuchy nie będą podawane jako dane wejściowe. You can assume that the input will never be valid brain-flak or empty.
DJMcMayhem

Odpowiedzi:

6

Galareta , 33 32 37 35 34 bajtów

znaleziono błąd, straszna poprawka +5 bajtów, lepsza poprawka - 2 bajty, używając sztuczki Adnana, którą widziałem tutaj za -1 więcej.

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

Zwracane wartości:

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

(Niepoprawne dane wejściowe zwracają fałszywe wyniki, chociaż zwraca poprawność Brain Flack [].)

Wypróbuj online! - zestaw testowy (kopie mushed reprezentacje, więc20dla[2,0]i ignoruje linii zawierających każdy-).

Jonathan Allan
źródło
5

Retina , 41 40 41 bajtów

1 bajt zapisany dzięki @MartinEnder

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

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

Wypróbuj online!

  • Możliwy do spożycia jest 1
  • Dopuszczalne jest 0
  • Oba są 10
  • Żaden nie jest 01

Edycje

  • Zdobył 1 bajt, aby naprawić błąd zauważony przez @Neil
Kritixi Lithos
źródło
[]})>]zapisuje bajt.
Martin Ender
@MartinEnder Ah, to dlatego, że zestawy znaków nie mogą być puste, dzięki!
Kritixi Lithos
Nie działa to na przykład dla wszystkich niedopuszczalnych danych wejściowych (][). Myślę, że można to naprawić kosztem jednego bajtu, zmieniając 101na ...+.
Neil
@Neil Dzięki za dostrzeżenie błędu, zastanawiam się, czy istnieją takie przypadki Both, jak również
Kritixi Lithos
Nie, myślę, że 10jest to jedyna poprawna kombinacja dla Both.
Neil
3

Partia, 337 bajtów

@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%

Wyjścia ]dla prepend, [dla append, ][dla obu, []dla żadnego.

Neil
źródło
3

Haskell , 115 108 bajtów

EDYTOWAĆ:

  • -7 bajtów: użyj więcej strażników.
(""#)
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

Wypróbuj online!

Użyj jak (""#) "))". Wyniki podano jako:

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

Jak to działa

  • Kodowanie wyjściowe jest wybierane w taki sposób, że potrzeba przyłożenia jest sygnalizowana przez upuszczenie drugiego elementu wyniku na pozostałą część, jeśli w ogóle, podczas gdy całkowite niedopasowanie jest sygnalizowane przez usunięcie wszystkich z nich.
  • s#d analizuje pozostały ciąg d , biorąc pod uwagę ciąg / stoss oczekiwanych nawiasów zamykających.
    • The s#"" kontrole liniowe, jeśli wszystkie klamry zamykające zostały znalezione pod koniec łańcucha, inaczej dołączanie jest potrzebne.
    • Pierwsza gałąź s#(c:d)sprawdza, czy następny znakc jest nawias otwierający, a jeśli tak, pozostawia odpowiedni stos zamykający na stosie do rekurencji.
    • W przeciwnym razie, jeśli stos zawiera nawiasy zamykające, druga gałąź sprawdza, czy górna pasuje do następnego znaku, a jeśli nie, zwraca pustą listę zamiast rekurencji.
    • Na koniec, w ostatniej gałęzi stos jest pusty, a my mamy niedopasowany nawias zamykający, który można naprawić przez dodanie, przed rekursowaniem.
Ørjan Johansen
źródło
2

Japt , 44 bajty

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

Wyjścia 1dla prependable, 3dla appendable, 13dla obu, i31 na nie.

Przetestuj online! lub Zweryfikuj wszystkie przypadki testowe jednocześnie.

Jak to działa

 =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
ETHprodukcje
źródło
2

PHP, 137 bajtów

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

1 => dołączane,

2 => jednorazowe,

12 => oba,

0 => ani

Przypadki testowe

Jörg Hülsermann
źródło
„Dopóki każde wyjście jest odrębne i spójne, nie ma problemu”. Wydaje się, że nie ma to żadnej spójnej wartości.
Cyoce
@Cyoce Jest teraz naprawiony
Jörg Hülsermann