Cette question est la deuxième de plusieurs défis d'anniversaire de Brain-flak conçus pour célébrer le premier anniversaire de Brain-Flak! Vous pouvez trouver plus d'informations sur l'anniversaire de Brain-Flak ici
Défi
Pour ce défi, vous allez générer toutes les chaînes parfaitement adaptées à partir d'une liste de crochets. Pour emprunter la définition de DJMcMayhem d'une chaîne entièrement appariée:
Aux fins de ce défi, un « support » est l' un de ces caractères:
()[]{}<>
.Une paire de crochets est considérée comme "assortie" si les crochets d'ouverture et de fermeture sont dans le bon ordre et ne contiennent aucun caractère à l'intérieur d'eux, tels que
() []{}
Ou si chaque sous-élément à l'intérieur est également mis en correspondance.
[()()()()] {<[]>} (()())
Les sous-éléments peuvent également être imbriqués plusieurs couches en profondeur.
[(){<><>[()]}<>()] <[{((()))}]>
Une chaîne est considérée comme "entièrement mise en correspondance" si et seulement si chaque paire de supports a le support d'ouverture et de fermeture correct dans le bon ordre.
Contribution
Votre programme ou fonction prendra une liste de quatre nombres non négatifs dans n'importe quel format pratique et cohérent. Cela inclut (mais sans s'y limiter) une liste d'entiers, une chaîne non délimitée par des chiffres ou des arguments séparés. Ces quatre nombres représentent le nombre de paires appariées de chaque type de support. Par exemple, [1,2,3,4]
représenterait:
1 paire de
()
2 paires de
{}
3 paires de
[]
et4 paires de
<>
Vous pouvez choisir à quelle paire de parenthèses chaque entrée correspond tant qu'elle est cohérente.
Production
Vous devez sortir toutes les chaînes entièrement correspondantes qui peuvent être formées à partir de cette liste de crochets sans doublons. La sortie peut être dans n'importe quel format raisonnable qui inclut l'impression d'une chaîne non délimitée par des crochets sur STDOUT, ou une liste de chaînes comme valeur de retour d'une fonction.
Votre algorithme doit fonctionner pour toute entrée arbitraire, mais vous n'avez pas à vous soucier de la mémoire, du temps ou des limites de taille entières (par exemple, si votre réponse est en C, vous n'obtiendrez pas 2 33 en entrée).
C'est du code-golf , donc la réponse la plus courte en octets l'emporte.
Exemple d'entrée et de sortie
Pour ces exemples, j'utiliserai le même ordre d'entrée que ci-dessus.
Pour chaque exemple, la première ligne sera entrée et les lignes suivantes seront la sortie
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]
(){}[]<> (){}[<>] (){}<[]> (){}<>[] (){[]}<> (){[]<>} (){[<>]}
(){<[]>} (){<>}[] (){<>[]} ()[{}]<> ()[{}<>] ()[{<>}] ()[]{}<>
()[]{<>} ()[]<{}> ()[]<>{} ()[<{}>] ()[<>{}] ()[<>]{} ()<{}[]>
()<{}>[] ()<{[]}> ()<[{}]> ()<[]{}> ()<[]>{} ()<>{}[] ()<>{[]}
()<>[{}] ()<>[]{} ({})[]<> ({})[<>] ({})<[]> ({})<>[] ({}[])<>
({}[]<>) ({}[<>]) ({}<[]>) ({}<>)[] ({}<>[]) ({[]})<> ({[]}<>)
({[]<>}) ({[<>]}) ({<[]>}) ({<>})[] ({<>}[]) ({<>[]}) ([{}])<>
([{}]<>) ([{}<>]) ([{<>}]) ([]){}<> ([]){<>} ([])<{}> ([])<>{}
([]{})<> ([]{}<>) ([]{<>}) ([]<{}>) ([]<>){} ([]<>{}) ([<{}>])
([<>{}]) ([<>]){} ([<>]{}) (<{}[]>) (<{}>)[] (<{}>[]) (<{[]}>)
(<[{}]>) (<[]{}>) (<[]>){} (<[]>{}) (<>){}[] (<>){[]} (<>)[{}]
(<>)[]{} (<>{})[] (<>{}[]) (<>{[]}) (<>[{}]) (<>[]){} (<>[]{})
{()}[]<> {()}[<>] {()}<[]> {()}<>[] {()[]}<> {()[]<>} {()[<>]}
{()<[]>} {()<>}[] {()<>[]} {([])}<> {([])<>} {([]<>)} {([<>])}
{(<[]>)} {(<>)}[] {(<>)[]} {(<>[])} {}()[]<> {}()[<>] {}()<[]>
{}()<>[] {}([])<> {}([]<>) {}([<>]) {}(<[]>) {}(<>)[] {}(<>[])
{}[()]<> {}[()<>] {}[(<>)] {}[]()<> {}[](<>) {}[]<()> {}[]<>()
{}[<()>] {}[<>()] {}[<>]() {}<()[]> {}<()>[] {}<([])> {}<[()]>
{}<[]()> {}<[]>() {}<>()[] {}<>([]) {}<>[()] {}<>[]() {[()]}<>
{[()]<>} {[()<>]} {[(<>)]} {[]()}<> {[]()<>} {[](<>)} {[]}()<>
{[]}(<>) {[]}<()> {[]}<>() {[]<()>} {[]<>()} {[]<>}() {[<()>]}
{[<>()]} {[<>]()} {[<>]}() {<()[]>} {<()>}[] {<()>[]} {<([])>}
{<[()]>} {<[]()>} {<[]>()} {<[]>}() {<>()}[] {<>()[]} {<>([])}
{<>}()[] {<>}([]) {<>}[()] {<>}[]() {<>[()]} {<>[]()} {<>[]}()
[(){}]<> [(){}<>] [(){<>}] [()]{}<> [()]{<>} [()]<{}> [()]<>{}
[()<{}>] [()<>{}] [()<>]{} [({})]<> [({})<>] [({}<>)] [({<>})]
[(<{}>)] [(<>){}] [(<>)]{} [(<>{})] [{()}]<> [{()}<>] [{()<>}]
[{(<>)}] [{}()]<> [{}()<>] [{}(<>)] [{}]()<> [{}](<>) [{}]<()>
[{}]<>() [{}<()>] [{}<>()] [{}<>]() [{<()>}] [{<>()}] [{<>}()]
[{<>}]() [](){}<> [](){<>} []()<{}> []()<>{} []({})<> []({}<>)
[]({<>}) [](<{}>) [](<>){} [](<>{}) []{()}<> []{()<>} []{(<>)}
[]{}()<> []{}(<>) []{}<()> []{}<>() []{<()>} []{<>()} []{<>}()
[]<(){}> []<()>{} []<({})> []<{()}> []<{}()> []<{}>() []<>(){}
[]<>({}) []<>{()} []<>{}() [<(){}>] [<()>{}] [<()>]{} [<({})>]
[<{()}>] [<{}()>] [<{}>()] [<{}>]() [<>(){}] [<>()]{} [<>({})]
[<>{()}] [<>{}()] [<>{}]() [<>](){} [<>]({}) [<>]{()} [<>]{}()
<(){}[]> <(){}>[] <(){[]}> <()[{}]> <()[]{}> <()[]>{} <()>{}[]
<()>{[]} <()>[{}] <()>[]{} <({})[]> <({})>[] <({}[])> <({[]})>
<([{}])> <([]){}> <([])>{} <([]{})> <{()}[]> <{()}>[] <{()[]}>
<{([])}> <{}()[]> <{}()>[] <{}([])> <{}[()]> <{}[]()> <{}[]>()
<{}>()[] <{}>([]) <{}>[()] <{}>[]() <{[()]}> <{[]()}> <{[]}()>
<{[]}>() <[(){}]> <[()]{}> <[()]>{} <[({})]> <[{()}]> <[{}()]>
<[{}]()> <[{}]>() <[](){}> <[]()>{} <[]({})> <[]{()}> <[]{}()>
<[]{}>() <[]>(){} <[]>({}) <[]>{()} <[]>{}() <>(){}[] <>(){[]}
<>()[{}] <>()[]{} <>({})[] <>({}[]) <>({[]}) <>([{}]) <>([]){}
<>([]{}) <>{()}[] <>{()[]} <>{([])} <>{}()[] <>{}([]) <>{}[()]
<>{}[]() <>{[()]} <>{[]()} <>{[]}() <>[(){}] <>[()]{} <>[({})]
<>[{()}] <>[{}()] <>[{}]() <>[](){} <>[]({}) <>[]{()} <>[]{}()
Réponses:
Haskell , 128 octets
f
est la fonction principale, elle prend une liste deInt
s et retourne une liste deString
s.Essayez-le en ligne!
Comment ça fonctionne
f
transforme sa liste d'entrée en une liste de listes de tuples, chaque tuple contenant une paire de parenthèses, avec chaque type de parenthèse dans sa propre sous-liste. Par exemple,[1,2,0,0]
devient[[('{','}')],[('[',']'),('[',']')]]
. Ensuite, il appelleg
avec la liste transformée.c
prend une listel
des listes de tuple de parenthèses restantes et renvoie une liste de chaînes possibles à suffixer à ce qui a déjà été généré.g l
génère la liste des chaînes entièrement mises en correspondance pouvant être formées à l'aide de tous les crochets del
.l#g
pour générer des chaînes commençant par une parenthèse. Leg
paramètre récursif est lui-même utilisé comme suite par#
, pour générer ce qui vient après le premier sous-élément entre crochets.l
il n'y a plus de crochets à l'intérieur)g
retourne à la place[""]
, la liste contenant uniquement la chaîne vide. Étant donné que la[""]
comparaison est plus petite que toutes les listes non vides pouvant être produites par#
, nous pouvons le faire en appliquantmax
.l#c
génère des chaînes à partir dul
début avec au moins un sous-élément entre crochets, laissant à la suitec
élément de déterminer ce qui suit l'élément.b
ete
sont une paire sélectionnée de parenthèses dans le tuplex
, etr
est la liste des tuples restants du même type de parenthèse.r:filter(/=x:r)l
estl
avec le tuplex
retiré, légèrement réarrangé.?
est appelé pour générer les sous-éléments possibles entreb
ete
. Il obtient sa propre continuationmap(e:).c
, qui préfixee
chacune des chaînes de suffixes générées parc
.#
lui-même ajoute l'initialeb
à toutes les chaînes générées par?
etc
.l?c
génère les chaînes entièrement appariées pouvant être formées en utilisant zéro ou plusieurs paires de crochets del
, puis laisse à sa suitec
pour gérer ce qui reste. Lac l
partie passe directement àc
sans ajouter de sous-éléments, tandis qu'elle estl#(?c)
utilisée#
pour générer un sous-élément, puis appeler(?c)
récursivement pour d'autres possibles.la source
Gelée ,
50 4034 octets-6 octets grâce à Leaky Nun (se réduire au travail là où je ne pouvais pas)
Simple et inefficace.
Essayez-le en ligne!(expiration à TIO pour [1,1,1,1] - oui, inefficace.)
Comment?
Supprime récursivement des paires de crochets correspondants qui résident juste à côté les uns des autres jusqu'à ce qu'il n'y ait plus de suppression pour chaque chaîne possible que l'on peut former, en gardant ces chaînes qui se réduisent à rien (donc ont tout le contenu correspondant).
la source
œṣ
-F
-µÐL
dans un problème quelque peu connexe .Pyth -
83747163 octetsEssayez-le
1 : Kc "[] {} () <>") Fd {.ps * VR \ KQJdVldFHK =: JHk)) I! Jd
Aussi, cette version de 53 octets grâce à Leaky Nun
Ici
la source
("\[]""{}""\(\)""<>")
, nous le faisonsc"\[] \{} \(\) <>")
(divisé sur un espace blanc); au lieu de:@Kd*\\2k
, nous avons-@Kd
suivi de deux barres obliques inverses; puis, au lieu de mapperU4
, nous faisons*V-R\\KQ
(multiplier deux tableaux en parallèle). Le premier tableau est généré en utilisantR
, à savoir-R\\k
Cela vous donnera une version de 54 octets05AB1E ,
3332302725 octetsEnregistré 7 octets grâce à Riley .
L'ordre d'entrée est
[(),<>,[],{}]
Essayez-le en ligne!
Explication
la source
:
vectorise (vous pouvez sauter la plupart de la boucle infinie). 2. Il est plus court de 1 octet à utiliserUX
au début etX
lorsque vous avez à nouveau besoin de la liste des crochets.:
abord, mais nous rencontrons des problèmes lorsque, par exemple, les remplacements sur{}
créent des remplacements possibles,()
car nous avons déjà essayé de tout remplacer()
. Bon pointUX
cependant. Nous pouvons également obtenir un autre octet©®
.U
le sommet apparaisse était toujours frustrant. Je n'en savais rien©®
.[([]{})<{[()<()>]}()>{}]
, mais pas pour[({})<{[()<()>]}()>{}]
. La seule différence est la suppression[]
. Je vais poser des questions à ce sujet dans TNB.Rubis , 123 octets
Essayez-le en ligne! Cependant, il est inefficace, même les entrées comme celles-
[1,2,1,1]
ci expireront en ligne. Tous les exemples énumérés fonctionneront, au moins!Explication
la source