Il y a quelques questions sur ce site concernant l'équilibrage des supports et la vérification de l'équilibre des supports. Je propose qu'il soit maintenant temps d'utiliser ces supports équilibrés pour quelque chose!
En mathématiques et en programmation, les parenthèses sont comme des bulles, isolant tout à l'intérieur de tout à l'extérieur de sorte que tout ce qui est à l'intérieur puisse faire son travail en paix et tout ce qui est à l'extérieur ne voit qu'un seul objet. Cependant, une chaîne de parenthèses est unidimensionnelle, tandis que les bulles sont généralement au moins bidimensionnelles. Cela signifie que les bulles sont libres de se déplacer les unes les autres tant qu'elles ne se touchent jamais ou ne se croisent pas entre l'intérieur et l'extérieur d'autres bulles.
Défi
L'entrée est une chaîne de crochets assortis d'un seul type, soit ronde ()
, carrée []
, bouclée {}
ou angulaire <>
. C'est à vous de décider quel type vous voulez que votre programme accepte, et un programme qui n'accepte qu'un seul type de parenthèses est accepté. (Bonus imaginaire si votre programme peut gérer l'un d'eux, des points bonus imaginaires massifs s'il peut tous les gérer dans la même entrée.) L'entrée ne peut rien contenir entre les crochets, bien que les espaces de fin soient autorisés.
La sortie est toutes les réorganisations possibles (dans un ordre arbitraire, et y compris l'entrée d'origine) de ces crochets qui donne la même configuration de bulles, sans deux chaînes identiques. Cela signifie qu'avec une entrée de ()()
, la sortie est également juste ()()
, même si ce sont techniquement deux bulles qui pourraient changer de place. Pour le bonus imaginaire massif, une entrée de {}[]()
volonté conduira bien sûr à une sortie de 6 éléments / cordes / lignes différents.
Deux configurations de bulles sont "les mêmes" si vous pouvez les faire l'une dans l'autre en déplaçant les bulles, sans laisser aucune bulle passer de l'intérieur d'une autre bulle à l'extérieur, ou de l'extérieur à l'intérieur. Si vous comparez des parenthèses imbriquées à des arbres (chaque paire correspondante est un nœud, et chaque paire correspondante à l'intérieur est un sous-nœud, et chaque paire correspondante à l'intérieur est à nouveau un sous-nœud de ceux-ci, etc.) où les sous-nœuds d'un nœud donné sont ordonnés , alors une seule configuration de bulles est un arbre où les nœuds ne sont pas ordonnés.
Tout format de sortie raisonnable fera l'affaire, comme renvoyer une liste de chaînes ou une liste de liste de caractères uniques ou une seule chaîne avec une sorte d'espace blanc, ou imprimer vers stdout
ou stderr
avec une forme de caractère d'espace blanc visible (le plus souvent une nouvelle ligne ou un espace) entre chaque réorganisation.
Les espaces de fin pour chaque réorganisation et les éléments de liste / vides de fin et de précédant avant et après la sortie réelle sont autorisés. Vous devez utiliser le même type de parenthèses dans votre sortie que vous acceptez dans votre entrée. Hormis les crochets, les retours à la ligne et les espaces spécifiés ici, et quel que soit le séparateur que vous utilisez, rien ne doit être imprimé (y compris les caractères invisibles / de largeur nulle).
Le score est le nombre d'octets dans le code; le décompte le plus bas pour chaque langue gagne. Vous pouvez noter si vous obtenez un bonus imaginaire, régulier ou massif, mais cela n'affecte pas votre score. Les bonus réels sont trop difficiles à équilibrer correctement.
Exemples d'entrées-sorties
Exemple 1:
Contribution:
()(())
Sortie:
()(())
(())()
Exemple 2:
Contribution:
(()())()()
Sortie:
(()())()()
()(()())()
()()(()())
Exemple 3:
Contribution:
(()(()))()
Sortie:
((())())()
()((())())
(()(()))()
()(()(()))
((()))
dans l'exemple 1? ou()()()
? Il semble que vous manquiez de permutations pour chaque entrée.Réponses:
CJam , 18 octets
Essayez-le en ligne!
-2 grâce à Business Cat .
Reçoit l'entrée sous la forme d'une chaîne contenant uniquement
[]
. Renvoie une liste de permutations (les listes vides sont les mêmes que les chaînes vides dans CJam, donc au lieu de[]
vous obtenez""
).la source
[][]
juste""
? - L'entrée doit-elle être incluse dans un jeu supplémentaire de[]
? Si oui, pourquoi y a-t-il un ensemble supplémentaire de[]
ce qui (peut-être?) Est la sortie pour l'exemple susmentionné? De plus, la question indique "Vous devez utiliser le même type de crochets dans votre sortie que vous acceptez dans votre entrée. Mis à part les crochets, les retours à la ligne et les espaces spécifiés ici, et quel que soit le séparateur que vous utilisez, rien ne doit être imprimé", donc je ' m pas sûr un mélange de[]
et""
est acceptable.[][]
une paire supplémentaire de[]
. Pour les autres, je ne suis pas vraiment sûr qu'ils soient invalides._{{B}%e!}&
place de_!!{{B}%e!}*
&
- ce un court-circuit ou quelque chose?&
exécute le bloc uniquement si l'autre valeur est véridiqueHaskell ,
227210208205 octetsEssayez-le en ligne!
Celui-ci était difficile!
Golfé un peu
Enregistré deux octets grâce à Laikoni
Économisez deux octets grâce à Bruce Forte
Je ne suis pas sûr que cela fonctionne dans tous les cas. Quelques explications:
a!x
ajouter la chaînex
à la dernière liste de chaînes dansa
(un est de type[[String]]
)snd$foldl(\(a,r)x->if x=='('then(a+1,last$(r++[[]]):[r!x|a>0])else(a-1,last$r:[r!x|a>1])
utilise le conditionnel plus court pour exprimer l'idée simple: diviser une chaîne à la racine)(
s. Par exemple,"(()(()))()"
donne["()(())", ""]
.Nous devons traiter chaque partie du fractionnement, puis rassembler et joindre toutes les chaînes pour obtenir la sortie correcte:
h
traite une liste de pièces: il s'appliquev
à la première pièce et combine le résultat au traitement des pièces restantes.v
agrège les résultats pour chaque permutation des pièces et supprime les doublons.Pour ajouter une vue plus large: vous avez essentiellement un arbre (pas binaire) avec des nœuds vides. Laissez
()
. Vous devez produire toutes les permutations des branches pour chaque nœud, mais vous ne pouvez pas prendre une branche d'un nœud et la placer sur un autre nœud. J'ai fait une sorte de première recherche approfondie.la source
init a
.Python 2,
353350331 octetsReçoit une chaîne
()
en entrée et imprime le résultat.Essayez-le ici!
J'ai évité d'utiliser
itertools.permutations
avec l'aide de la réponse de Paolo à cette question .Merci à Business Cat d' avoir trouvé 3 octets, et merci à M. Xcoder pour un incroyable 19 octets!
Explication
()
paire dans la chaîne d'entrée.()
paire.la source
print
et à des endroits commei+1 if
(pourrait êtrei+1if
). Aussi à un endroit que vous avezy[0:i]
, vous pouvez omettre le 0.JavaScript (Firefox 30-57), 222 octets
Prend des
[]
cordes. Explication:la source
Mathematica, 337 octets
Pas pour obtenir des points de golf, mais pour montrer l'utilisation de
Permutations
etDistribute
dans ce problème. Il peut cependant y avoir de meilleures approches.(
seq
: séquence,:alt
alternatives)Prenez l'entrée comme une chaîne, en utilisant des accolades
{
et}
. Génère une chaîne multi-lignes.la source