Supports normaux ( ()
, []
, <>
et {}
) sont agréables et sans ambiguïté, mais quelqu'un a pensé que ce serait une bonne idée d'utiliser des caractères non support comme supports. Ces caractères |
et "
sont ambigus. Par exemple,
""""
correspondre à
(())
ou
()()
C'est impossible à dire.
Les choses commencent à devenir intéressantes lorsque vous mélangez des types de parenthèses ambiguës, par exemple
"|""||""|"
Pourrait être l'un des suivants
([(([]))]),([()[]()]),([()][()])
Tâche
Votre tâche consiste à prendre une chaîne composée de caractères ambigus et à afficher toutes les chaînes équilibrées possibles que l'auteur aurait pu imaginer.
Plus concrètement, vous sortez toutes les cordes équilibrées qui peuvent être remplacées |
par ou [
ou ]
et "
par (
ou )
. Vous ne devez pas sortir deux fois une chaîne équilibrée.
IO
En entrée, vous devez prendre une chaîne composée de |
et "
. Si vous souhaitez sélectionner deux caractères distincts autres que |
et "
pour servir de remplaçants, vous pouvez le faire. Vous devez sortir un conteneur de chaînes équilibrées. Vous pouvez choisir de remplacer []
et ()
dans la sortie avec les deux autres paires de support ( ()
, []
, <>
ou {}
) que vous souhaitez. Votre format de sortie doit être cohérent d'une exécution à l'autre.
Notation
Il s'agit de code-golf donc les réponses seront notées en octets avec moins d'octets mieux.
Cas de test
"" -> ["()"]
"|"| -> []
||| -> []
"""" -> ["(())","()()"]
""|| -> ["()[]"]
"|"||"|" -> ["([([])])"]
"|""||""|" -> ["([(([]))])","([()[]()])","([()][()])"]
la source
Réponses:
Python 2 , 135 octets
Essayez-le en ligne!
Attend l'entrée comme
2002
au lieu de"||"
, et entourée de guillemets.Itère sur les 2 N affectations possibles de "ouvert" et "proche" de la chaîne, créant des chaînes
c
comme:Si
eval
-ing cette chaîne lève une exception, elle est inégalée. Sinon, nous imprimonsc[::2]
en donnant:la source
Rétine ,
595655 octetsEssayez-le en ligne! Malheureusement, le test de deux ensembles de crochets correspondants dépasse le golfiness d'une seule expression régulière .NET, il économise donc 15 octets à vérifier manuellement. Edit: enregistré
34 octets grâce à @ H.PWiz. Explication:Trouvez un
"
et faites deux copies de la ligne, une avec un<
et une avec un>
. Faites-le un"
à la fois, de sorte que chacun"
double le nombre de lignes.De même avec
'
,{
et}
. Ensuite, continuez à remplacer jusqu'à ce que tous les"
s et'
s sur toutes les copies aient été remplacés.Faites un double des crochets, séparés par un
_
.Dans le doublon, supprimez à plusieurs reprises les crochets correspondants, jusqu'à ce qu'il n'en reste plus, auquel cas supprimez-les
_
également.Supprimez toutes les lignes qui ont encore un
_
.Rétine ,
747170 octetsEssayez-le en ligne! Explication: Les deux premières étapes sont les mêmes que ci-dessus. La troisième étape imprime directement le résultat de la correspondance de deux ensembles de supports correspondants. Cela utilise les groupes d'équilibrage de .NET. À chaque étape de la correspondance, l'expression régulière essaie de faire correspondre un personnage, puis regarde en arrière pour une paire de crochets correspondants, puis vérifie que le haut de la pile correspond au crochet ouvert. S'il peut le faire, cela signifie que le support s'équilibre et que le support ouvert est extrait de la pile. Sinon, l'hypothèse est que nous sommes sur un support ouvert qui doit être poussé vers la pile. Si ces hypothèses ne sont pas vérifiées, la pile ne sera pas vide à la fin et la correspondance échouera.
Approche alternative, également
7471 octets:Ici, nous regardons vers l'avant pour
<
...>
ou{
...}
, puis regardons derrière pour pousser le support de fermeture sur la pile. Sinon, nous devons faire correspondre et ouvrir le crochet de fermeture que nous avons capturé plus tôt. Dans cette version, l'expression régulière ne parvient même pas à atteindre la fin de la chaîne, mais certaines chaînes telles que celles qui<<<>
passeraient à travers le filet si nous ne vérifions pas la présence d'une pile vide.la source
|
l'entréeHusk , 19 octets
Essayez-le en ligne! Utilise les caractères
ds
dans l'entrée, les paires de parenthèses correspondantesde
etst
dans la sortie.Explication
L'idée est de générer tous les crochets possibles de l'entrée et de conserver ceux qui se réduisent à la chaîne vide lorsque nous supprimons à plusieurs reprises les crochets adjacents. Il
¨÷₂¨
s'agit d'une chaîne compressée qui se développe en"dest"
, qui a été choisie car elle a une forme compressée courte et se compose de paires de caractères avec des points de code adjacents. Le programme est donc équivalent au suivant.la source
Perl,
565553 octetsComprend
+1
pourn
utilise
[
pour[]
et{
pour{}
Génère toutes les possibilités 2 ^ N, puis utilise perl
eval
pour vérifier si une chaîne comme '+ [+ {}]' est un code valide et si tel est le cas, supprime le+
et imprime le résultatla source
APL (Dyalog Classic) ,
5553 octetsEssayez-le en ligne!
la source
Clean ,
203186179 octetsEssayez-le en ligne!
Utilise uniquement le filtrage de motifs et les compréhensions.
la source
Perl, 56 octets
Comprend
+
pourn
Utilise l'entrée
[
pour la sortie[
ou]
Utilise l'entrée
{
pour la sortie{
ou}
Utilise un regex étendu perl pour faire correspondre les accolades tout en gardant une trace des choix effectués pendant le retour en arrière. Cela peut être beaucoup plus efficace que de générer tous les candidats 2 ^ N car il rejette déjà de nombreuses affectations impossibles à mi-chemin de la chaîne d'entrée
la source
Kotlin ,
240236234 octetsEmbellie
Tester
Modifications
true
->1>0
et== 0
->< 1
la source
C (gcc) , 315 octets
Essayez-le en ligne!
C (gcc) , 334 octets (ancienne version)
Essayez-le en ligne!
Explication (ancienne version)
Essayez-le en ligne!
la source
*s++
à quelques endroits.char S[n],*s=S
est toujours plus court quechars*s=calloc(n,1)