Anhängen oder voranstellen? Hängt davon ab


23

Brain-Flak wird morgen ein Jahr alt! Zu Ehren des Geburtstages veranstalten wir eine Geburtstagsfeier im PPCG-Stil, auf der mehrere Benutzer Fragen zu Brain Flak stellen! Hilf uns zu feiern! :)


Brain-Flak ist eine esoterische Sprache, die ich geschrieben habe, in der alle Befehle Klammern sind und alle Klammern vollständig übereinstimmen müssen. Meine eigene Definition ausleihen :

  • Für die Zwecke dieser Herausforderung ist eine „Klammer“ eines dieser Zeichen: ()[]{}<>.

  • Ein Klammerpaar wird als "übereinstimmend" betrachtet, wenn die öffnende und schließende Klammer in der richtigen Reihenfolge sind und keine Zeichen enthalten, z

    ()
    []{}
    

    Oder wenn jedes Unterelement in ihm auch übereinstimmt.

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

    Unterelemente können auch mehrere Ebenen tief verschachtelt sein.

    [(){<><>[()]}<>()]
    <[{((()))}]>
    
  • Eine Zeichenfolge wird genau dann als "vollständig zugeordnet" betrachtet, wenn:

    1. Jedes einzelne Zeichen ist eine Klammer,

    2. Jedes Klammerpaar hat die richtige Öffnungs- und Schließklammer in der richtigen Reihenfolge

Zur Feier des ersten Geburtstages von brain-flak geht es bei der heutigen Herausforderung darum, einen unausgeglichenen Satz von Klammern zu verwenden und zu bestimmen, welche Arten von Operationen erforderlich sind, um die Gültigkeit von brain-flak zu gewährleisten.

  • Zum Beispiel ((ist es kein gültiger Brain-Flak-Code, aber wenn wir ihn anhängen )), wird er zu einem (())vollständig ausgeglichenen und daher gültigen Brain-Flak. Das macht diese Eingabe anhängbar .

  • Ebenso >}ist es nicht gültig, aber wir können es vorher {<machen {<>}, was gültig ist. Das macht diese Eingabe vorzeigbar .

  • Einige Eingaben sind etwas komplizierter. Zum Beispiel )][({kann nicht nur durch Anhängen oder Voranstellen gültig gemacht werden. Sie kann jedoch durch Voranstellen [(und Anhängen gültig gemacht werden })]. Daher kann diese Eingabe sowohl vorab als auch angehängt werden .

  • Schließlich können einige Eingaben durch eine Kombination von Anhängen oder Voranstellen niemals zu einem gültigen Brain-Flak-Code gemacht werden. Zum Beispiel (>kann nie gültig gemacht werden. (Voranstellen <schafft <(>, und Anfügen )erzeugt (>), von denen keiner gültig sind) Daher dieser Eingang weder appendable oder prependable.

Für die heutige Herausforderung müssen Sie ein Programm oder eine Funktion schreiben, die eine Reihe von Klammern verwendet und feststellt, ob es sich um eine Zeichenfolge handelt

appendable
prependable
both
neither

Sie können auswählen, welche Werte Sie für jeden Fall verwenden. Zum Beispiel ausgeben 1, 2, 3, 4, oder 'a', 'p', 'b', 'n', oder 1, 'foo', 3.1415, -17, oder was auch immer in Ordnung ist. Solange jede Ausgabe unterschiedlich und konsistent ist, ist das in Ordnung. Sie müssen jedoch eindeutig angeben, welcher Ausgang welchem ​​Fall entspricht.

Sie können diesen Wert in einem beliebigen Format zurückgeben (z. B. von einer Funktion zurückkehren, in STDOUT drucken, Argumente ändern, in eine Datei schreiben usw.).

Sie können davon ausgehen, dass die Eingabe niemals gültig oder leer sein wird.

Beispiele

Die folgenden Eingaben können alle vorangestellt werden :

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

Diese sind alle anhängbar :

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

Dies sind alles beide :

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

Und das sind beide nicht :

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

Wie üblich ist dies , daher gelten Standardlücken und die kürzeste Antwort in Bytes gewinnt!


Diese Herausforderung ist bei Brain-Flak besonders schwierig, daher zeigt maximaler Brownie auf jede Antwort, die in Brain-Flak geschrieben ist. :)


1
maximum brownie pointsIch denke, dass das Anbieten maximaler Brownie-Punkte und Cookies das Brain-Flaking dieser Herausforderung mehr als nur zu Brownie-Punkten anregen würde, da es meiner Meinung nach in keiner Sprache trivial ist, geschweige denn zu Brain-Flak. : P
Erik der Outgolfer

Zu Ihrer Information: Alle beiden Tests enden mit offenen Klammern, alle beiden Tests enden nicht mit geschlossenen Klammern.
Jonathan Allan

2
Ich würde argumentieren, dass "beides" der falsche Begriff ist. Ein String wie ][ist nicht anhängbar, da nichts, was Sie anhängen können, ihn gültig machen kann. Ebenso ist es nicht vorzeigbar. Es ist ... "einfügbar"! Sie können es in eine Zeichenfolge einfügen, um den gesamten gültigen Brainflak zu erstellen.
Orlp

Sind beide oder keine Saiten bereits ausbalanciert?
Weizen-Assistent

@wheatwizard Ausgewogene Zeichenfolgen werden nicht als Eingabe angegeben. You can assume that the input will never be valid brain-flak or empty.
DJMcMayhem

Antworten:


6

Jelly , 33 32 37 35 34 Bytes

Fehler gefunden, schreckliche Korrektur +5 Bytes, bessere Korrektur - 2 Bytes, mit einem Trick von Adnan, den ich hier für -1 mehr gesehen habe.

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

Rückgabewerte:

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

(Ungültige Eingabe gibt falsche Ergebnisse zurück, obwohl gültiges Brain-Flack zurückgibt [].)

Probieren Sie es online! - eine Testsuite (druckt zerrissene Darstellungen20aus[2,0]und ignoriert Zeilen, die irgendwelche enthalten-).


5

Retina , 41 40 41 Bytes

1 Byte gespart dank @MartinEnder

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

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

Probieren Sie es online!

  • Vornehm ist 1
  • Anhängbar ist 0
  • Beides ist 10
  • Keiner ist 01

Bearbeitungen

  • Erhielt 1 Byte, um den von @Neil gemeldeten Fehler zu beheben

[]})>]Speichert ein Byte.
Martin Ender

@MartinEnder Ah, es liegt daran, dass Zeichensätze nicht leer sein können, danke!
Kritixi Lithos

Dies funktioniert beispielsweise nicht für alle nicht anhängbaren Eingaben (][). Ich denke , es kann durch Veränderung zu einem Preis von einem Byte festgelegt werden 101zu ...+.
Neil

@Neil Danke, dass du den Fehler bemerkt hast, ich frage mich, ob es solche Fälle Bothauch gibt
Kritixi Lithos

Nein, ich denke 10ist die einzig gültige Kombination für Both.
Neil

3

Batch, 337 Bytes

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

Ausgaben ]für prepend, [für append, ][für beide, []für keine.


3

Haskell , 115 108 Bytes

BEARBEITEN:

  • -7 Bytes: Verwenden Sie mehr Wachen.
(""#)
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

Probieren Sie es online!

Verwenden Sie wie (""#) "))". Die Ergebnisse sind wie folgt angegeben:

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

Wie es funktioniert

  • Die Ausgabecodierung wird so gewählt, dass eine Notwendigkeit zum Voranstellen signalisiert wird, indem das zweite Element des Ergebnisses für den Rest, falls vorhanden, verworfen wird, während eine vollständige Nichtübereinstimmung signalisiert wird, indem alle von ihnen verworfen werden.
  • s#dAnalysiert eine verbleibende Zeichenfolge danhand einer Zeichenfolge / eines Stapels serwarteter schließender Klammern.
    • Die s#""Zeile prüft, ob alle schließenden Klammern am Ende der Zeichenfolge gefunden wurden, andernfalls ist das Anhängen erforderlich.
    • Der erste Zweig s#(c:d)prüft, ob das nächste Zeichen ceine öffnende Klammer ist, und belässt in diesem Fall die entsprechende schließende Klammer für die Rekursion auf dem Stapel.
    • Wenn der Stapel dagegen schließende Klammern enthält, prüft der zweite Zweig, ob der oberste mit dem nächsten Zeichen übereinstimmt, und gibt andernfalls eine leere Liste zurück, anstatt sie zu wiederholen.
    • Schließlich ist der Stapel im letzten Zweig leer, und wir haben eine unübertroffene schließende Klammer, die möglicherweise durch Voranstellen vor dem erneuten Auftreten behoben wird.

2

Japt , 44 Bytes

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

Ausgaben 1für vorab anhängbar, 3für anhängbar, 13für beide und 31für keine.

Online testen! oder Überprüfen Sie alle Testfälle auf einmal.

Wie es funktioniert

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

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

1 => anhängbar,

2 => voranstellen,

12 => beide,

0 => weder

Testfälle


"Solange jede Ausgabe unterschiedlich und konsistent ist , ist das in Ordnung". Dies scheint weder für noch für einen konsistenten Wert zu haben.
Cyoce

@Cyoce Es ist jetzt behoben
Jörg Hülsermann
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.