Diese Frage ist die zweite von mehreren Brain-Flak-Geburtstagsherausforderungen, mit denen Brain-Flaks erster Geburtstag gefeiert werden soll! Weitere Informationen zu Brain-Flaks Geburtstag finden Sie hier
Herausforderung
Für diese Herausforderung generieren Sie alle vollständig übereinstimmenden Zeichenfolgen aus einer Liste von Klammern. So leihen Sie die Definition von DJMcMayhem für eine vollständig übereinstimmende Zeichenfolge aus:
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 nur dann als "vollständig passend" betrachtet, wenn jedes Paar von Klammern die richtige öffnende und schließende Klammer in der richtigen Reihenfolge aufweist.
Eingang
Ihr Programm oder Ihre Funktion erstellt eine Liste mit vier nicht negativen Zahlen in einem beliebigen geeigneten, konsistenten Format. Dies schließt eine Liste von ganzen Zahlen, eine nicht durch Ziffern getrennte Zeichenfolge oder separate Argumente ein (ist jedoch nicht darauf beschränkt). Diese vier Zahlen geben die Anzahl der übereinstimmenden Paare für jeden Klammertyp an. Zum Beispiel [1,2,3,4]
würde darstellen:
1 Paar
()
2 Paare von
{}
3 Paare von
[]
und4 Paar
<>
Sie können auswählen, welchem Klammerpaar jeder Eingang entspricht, solange er konsistent ist.
Ausgabe
Sie sollten alle vollständig übereinstimmenden Zeichenfolgen ausgeben, die aus dieser Liste von Klammern ohne Duplikate gebildet werden können. Die Ausgabe kann in jedem vernünftigen Format erfolgen, einschließlich des Druckens einer Zeichenfolge ohne Klammerbegrenzung nach STDOUT oder einer Liste von Zeichenfolgen als Rückgabewert einer Funktion.
Ihr Algorithmus muss für jede beliebige Eingabe funktionieren, Sie müssen sich jedoch keine Gedanken über Speicher-, Zeit- oder Ganzzahlgrößenbeschränkungen machen (z. B. wenn Ihre Antwort in C ist, erhalten Sie 2 33 nicht als Eingabe).
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Beispiel für Ein- und Ausgabe
Für dieses Beispiel verwende ich die gleiche Eingabereihenfolge wie oben.
Für jedes Beispiel wird die erste Zeile eingegeben und die folgenden Zeilen werden ausgegeben
Example 0:
[0,0,0,0]
Example 1:
[1,0,0,0]
()
Example 2:
[0,2,0,0]
{}{}
{{}}
Example 3:
[0,0,1,1]
[]<>
[<>]
<[]>
<>[]
Example 4:
[0,1,2,0]
{}[][] {}[[]] {[]}[] {[][]} {[[]]}
[{}][] [{}[]] [{[]}] []{}[] []{[]}
[][{}] [][]{} [[{}]] [[]{}] [[]]{}
Example 5:
[1,0,0,3]
()<><><> ()<><<>> ()<<>><> ()<<><>> ()<<<>>> (<>)<><> (<>)<<>>
(<><>)<> (<><><>) (<><<>>) (<<>>)<> (<<>><>) (<<><>>) (<<<>>>)
<()><><> <()><<>> <()<>><> <()<><>> <()<<>>> <(<>)><> <(<>)<>>
<(<><>)> <(<<>>)> <>()<><> <>()<<>> <>(<>)<> <>(<><>) <>(<<>>)
<><()><> <><()<>> <><(<>)> <><>()<> <><>(<>) <><><()> <><><>()
<><<()>> <><<>()> <><<>>() <<()>><> <<()><>> <<()<>>> <<(<>)>>
<<>()><> <<>()<>> <<>(<>)> <<>>()<> <<>>(<>) <<>><()> <<>><>()
<<><()>> <<><>()> <<><>>() <<<()>>> <<<>()>> <<<>>()> <<<>>>()
Example 6:
[1,1,1,1]
(){}[]<> (){}[<>] (){}<[]> (){}<>[] (){[]}<> (){[]<>} (){[<>]}
(){<[]>} (){<>}[] (){<>[]} ()[{}]<> ()[{}<>] ()[{<>}] ()[]{}<>
()[]{<>} ()[]<{}> ()[]<>{} ()[<{}>] ()[<>{}] ()[<>]{} ()<{}[]>
()<{}>[] ()<{[]}> ()<[{}]> ()<[]{}> ()<[]>{} ()<>{}[] ()<>{[]}
()<>[{}] ()<>[]{} ({})[]<> ({})[<>] ({})<[]> ({})<>[] ({}[])<>
({}[]<>) ({}[<>]) ({}<[]>) ({}<>)[] ({}<>[]) ({[]})<> ({[]}<>)
({[]<>}) ({[<>]}) ({<[]>}) ({<>})[] ({<>}[]) ({<>[]}) ([{}])<>
([{}]<>) ([{}<>]) ([{<>}]) ([]){}<> ([]){<>} ([])<{}> ([])<>{}
([]{})<> ([]{}<>) ([]{<>}) ([]<{}>) ([]<>){} ([]<>{}) ([<{}>])
([<>{}]) ([<>]){} ([<>]{}) (<{}[]>) (<{}>)[] (<{}>[]) (<{[]}>)
(<[{}]>) (<[]{}>) (<[]>){} (<[]>{}) (<>){}[] (<>){[]} (<>)[{}]
(<>)[]{} (<>{})[] (<>{}[]) (<>{[]}) (<>[{}]) (<>[]){} (<>[]{})
{()}[]<> {()}[<>] {()}<[]> {()}<>[] {()[]}<> {()[]<>} {()[<>]}
{()<[]>} {()<>}[] {()<>[]} {([])}<> {([])<>} {([]<>)} {([<>])}
{(<[]>)} {(<>)}[] {(<>)[]} {(<>[])} {}()[]<> {}()[<>] {}()<[]>
{}()<>[] {}([])<> {}([]<>) {}([<>]) {}(<[]>) {}(<>)[] {}(<>[])
{}[()]<> {}[()<>] {}[(<>)] {}[]()<> {}[](<>) {}[]<()> {}[]<>()
{}[<()>] {}[<>()] {}[<>]() {}<()[]> {}<()>[] {}<([])> {}<[()]>
{}<[]()> {}<[]>() {}<>()[] {}<>([]) {}<>[()] {}<>[]() {[()]}<>
{[()]<>} {[()<>]} {[(<>)]} {[]()}<> {[]()<>} {[](<>)} {[]}()<>
{[]}(<>) {[]}<()> {[]}<>() {[]<()>} {[]<>()} {[]<>}() {[<()>]}
{[<>()]} {[<>]()} {[<>]}() {<()[]>} {<()>}[] {<()>[]} {<([])>}
{<[()]>} {<[]()>} {<[]>()} {<[]>}() {<>()}[] {<>()[]} {<>([])}
{<>}()[] {<>}([]) {<>}[()] {<>}[]() {<>[()]} {<>[]()} {<>[]}()
[(){}]<> [(){}<>] [(){<>}] [()]{}<> [()]{<>} [()]<{}> [()]<>{}
[()<{}>] [()<>{}] [()<>]{} [({})]<> [({})<>] [({}<>)] [({<>})]
[(<{}>)] [(<>){}] [(<>)]{} [(<>{})] [{()}]<> [{()}<>] [{()<>}]
[{(<>)}] [{}()]<> [{}()<>] [{}(<>)] [{}]()<> [{}](<>) [{}]<()>
[{}]<>() [{}<()>] [{}<>()] [{}<>]() [{<()>}] [{<>()}] [{<>}()]
[{<>}]() [](){}<> [](){<>} []()<{}> []()<>{} []({})<> []({}<>)
[]({<>}) [](<{}>) [](<>){} [](<>{}) []{()}<> []{()<>} []{(<>)}
[]{}()<> []{}(<>) []{}<()> []{}<>() []{<()>} []{<>()} []{<>}()
[]<(){}> []<()>{} []<({})> []<{()}> []<{}()> []<{}>() []<>(){}
[]<>({}) []<>{()} []<>{}() [<(){}>] [<()>{}] [<()>]{} [<({})>]
[<{()}>] [<{}()>] [<{}>()] [<{}>]() [<>(){}] [<>()]{} [<>({})]
[<>{()}] [<>{}()] [<>{}]() [<>](){} [<>]({}) [<>]{()} [<>]{}()
<(){}[]> <(){}>[] <(){[]}> <()[{}]> <()[]{}> <()[]>{} <()>{}[]
<()>{[]} <()>[{}] <()>[]{} <({})[]> <({})>[] <({}[])> <({[]})>
<([{}])> <([]){}> <([])>{} <([]{})> <{()}[]> <{()}>[] <{()[]}>
<{([])}> <{}()[]> <{}()>[] <{}([])> <{}[()]> <{}[]()> <{}[]>()
<{}>()[] <{}>([]) <{}>[()] <{}>[]() <{[()]}> <{[]()}> <{[]}()>
<{[]}>() <[(){}]> <[()]{}> <[()]>{} <[({})]> <[{()}]> <[{}()]>
<[{}]()> <[{}]>() <[](){}> <[]()>{} <[]({})> <[]{()}> <[]{}()>
<[]{}>() <[]>(){} <[]>({}) <[]>{()} <[]>{}() <>(){}[] <>(){[]}
<>()[{}] <>()[]{} <>({})[] <>({}[]) <>({[]}) <>([{}]) <>([]){}
<>([]{}) <>{()}[] <>{()[]} <>{([])} <>{}()[] <>{}([]) <>{}[()]
<>{}[]() <>{[()]} <>{[]()} <>{[]}() <>[(){}] <>[()]{} <>[({})]
<>[{()}] <>[{}()] <>[{}]() <>[](){} <>[]({}) <>[]{()} <>[]{}()
Antworten:
Haskell , 128 Bytes
f
ist die Hauptfunktion, nimmt eine Liste vonInt
s und gibt eine Liste vonString
s zurück.Probieren Sie es online!
Wie es funktioniert
f
transformiert seine Eingabeliste in eine Liste von Tupellisten, wobei jedes Tupel ein Klammerpaar enthält und jeder Klammertyp in einer eigenen Unterliste enthalten ist. ZB[1,2,0,0]
wird[[('{','}')],[('[',']'),('[',']')]]
. Dann ruft esg
mit der transformierten Liste auf.c
eine Listel
der verbleibenden Klammer-Tupellisten und gibt eine Liste der möglichen Zeichenfolgen zurück, die an die bereits generierten Zeichenfolgen angehängt werden sollen.g l
generiert die Liste der vollständig übereinstimmenden Zeichenfolgen, die mithilfe aller Klammern in gebildet werden könnenl
.l#g
Zeichenfolgen generiert, die mit einer eckigen Klammer beginnen. Der rekursiveg
Parameter wird selbst als Fortsetzung von verwendet#
, um zu generieren, was nach dem ersten in eckige Klammern eingeschlossenen Unterelement kommt.l
keine Klammern mehr enthalten sind), wirdg
stattdessen[""]
die Liste zurückgegeben, die nur die leere Zeichenfolge enthält. Da der[""]
Vergleich mit allen nicht leeren Listen, die von erstellt werden können#
, kleiner ist , können wir dies durch Anwenden von tunmax
.l#c
Generiert Zeichenfolgen,l
beginnend mit mindestens einem in eckige Klammern eingeschlossenen Unterelement, undc
legt anschließend fest, was auf das Element folgt.b
unde
sind ein ausgewähltes Paar von Klammern im Tupelx
undr
die Liste der verbleibenden Tupel desselben Klammertyps.r:filter(/=x:r)l
istl
mit dem Tupelx
entfernt, leicht neu angeordnet.?
wird aufgerufen, um die möglichen Unterelemente zwischenb
und zu erzeugene
. Es erhält eine eigene Fortsetzungmap(e:).c
, diee
jedem der von generierten Suffix-Strings vorangestellt wirdc
.#
selbst stellt die Initialeb
allen Zeichenfolgen voran, die von?
und generiert werdenc
.l?c
generiert die vollständig übereinstimmenden Zeichenfolgen, die mithilfe von null oder mehr Klammernpaaren aus formbar sindl
, und überlässt diese dann ihrer Fortsetzungc
, um die verbleibenden Zeichenfolgen zu verarbeiten. Dasc l
Teil geht direkt zu,c
ohne Unterelemente hinzuzufügen, während esl#(?c)
verwendet wird#
, um ein Unterelement zu generieren und dann(?c)
rekursiv nach möglichen weiteren aufzurufen .quelle
Jelly ,
50 4034 Bytes-6 Bytes dank Leaky Nun (immer weniger Arbeit, wo ich nicht konnte)
Einfach und ineffizient.
Probieren Sie es online! (Timeout bei TIO für [1,1,1,1] - ja, ineffizient.)
Wie?
Entfernt rekursiv Paare übereinstimmender Klammern, die direkt nebeneinander stehen, bis für jede mögliche gebildete Zeichenfolge keine weiteren Klammern mehr entfernt werden können. Dabei werden solche Zeichenfolgen beibehalten, die sich auf nichts reduzieren (daher haben sie den gesamten übereinstimmenden Inhalt).
quelle
œṣ
-F
-µÐL
in einem etwas verwandten Problem verwendet .Pyth -
83747163 BytesVersuch es
1 : Kc "[] {} () <>") Fd {.ps * VR \ KQJdVldFHK =: JHk)) I! Jd
Auch diese 53-Byte-Version dank Leaky Nun
Hier
quelle
("\[]""{}""\(\)""<>")
wirc"\[] \{} \(\) <>")
(auf Leerzeichen aufgeteilt); statt:@Kd*\\2k
, haben wir-@Kd
durch zwei Schrägstriche gefolgt; dann machenU4
wir es , anstatt es zu mappen*V-R\\KQ
(multiplizieren Sie zwei Arrays parallel). Das erste Array wird generiert mitR
:-R\\k
Dies gibt Ihnen eine 54-Byte-Version05AB1E ,
3332302725 Bytes7 Bytes gespart dank Riley .
Eingabereihenfolge ist
[(),<>,[],{}]
Probieren Sie es online!
Erläuterung
quelle
:
vektorisiert (Sie können den größten Teil der Endlosschleife überspringen). 2. Es ist 1 Byte kürzer zuUX
Beginn undX
wenn Sie die Liste der Klammern erneut benötigen.:
, aber wir bekommen Probleme, wenn zum Beispiel Ersetzungen auf{}
mögliche Ersetzungen auf erstellt werden()
da wir bereits versucht haben, alle zu ersetzen()
. Guter Punkt überUX
obwohl. Wir können auch ein weiteres Byte mit bekommen©®
.U
die Spitze auftaucht, war immer frustrierend. Ich wusste es nicht©®
.[([]{})<{[()<()>]}()>{}]
, aber nicht für[({})<{[()<()>]}()>{}]
. Der einzige Unterschied ist der entfernte[]
. Ich werde in TNB danach fragen.Ruby , 123 Bytes
Probieren Sie es online! Es ist jedoch ineffizient, so dass selbst Eingaben wie
[1,2,1,1]
eine Zeitüberschreitung im Internet auftreten. Alle aufgeführten Beispiele funktionieren zumindest!Erläuterung
quelle