Nous appelons un groupe de parens le paren ouvert (
, son paren proche correspondant )
et tout ce qu'il contient .
Un groupe ou une chaîne de parens est appelé équilibré entre parenthèses s'il ne contient rien ou seulement 2 groupes de parens équilibrés entre parenthèses.
Par exemple:
The string "(()())()" is parenthesly balanced
( )() Because it contains exactly 2 parenthesly balanced parens groups
()() The left one is parenthesly balanced because it contains 2 parenthesly balanced parens groups (balanced because they are empty). The right one is parenthesly balanced because it contains nothing.
Également:
The string "(()(()))()" is not parenthesly balanced
( )() Because it contains a parens group that is not parenthesly balanced: the left one
()( ) The left one is not balanced because it contains a parens group that is not balanced: the right one
() The right one is not balanced because it only contains one balanced group.
Ainsi, une chaîne ou un groupe de parenthèses équilibré entre parenthèses devrait:
- Ne contient rien du tout.
- Ou contenir seulement et exactement 2 groupes de parens équilibrés entre parenthèses. Il ne doit contenir rien d'autre.
Tâche:
Votre tâche consiste à écrire une fonction ou un programme qui vérifie si une chaîne donnée est équilibrée entre parenthèses ou non.
Contribution:
L'entrée sera une chaîne ou une liste de caractères ou quelque chose de similaire. Vous pouvez supposer que la chaîne ne comprendra que les caractères '('
et ')'
. Vous pouvez également supposer que chaque paren ouvert (
aura son paren proche correspondant )
, alors ne vous inquiétez pas pour les chaînes comme "((("
ou ")("
ou "(())("
...
Note: Comme mentionné par @DigitalTrauma dans son commentaire ci - dessous, il est autorisé à subtitute le ()
combo par d' autres caractères ( par exemple <>
, []
...), si elle est à l' origine du travail supplémentaire pour fuir dans certaines langues
Production:
N'importe quoi pour signaler si la chaîne est équilibrée entre parenthèses ou non (vrai ou faux, 1 ou 0, ...). Veuillez inclure dans votre réponse ce que votre fonction / programme devrait générer.
Exemples:
"" => True
"()()" => True
"()(()())" => True
"(()(()(()())))(()())" => True
"(((((((()())())())())())())())()" => True
"()" => False
"()()()" => False
"(())()" => False
"()(()(())())" => False
"(()())(((((()())()))())())" => False
"()(()()()())" => False
"()(()(()())()())" => False
Les deux derniers exemples ont vraiment fait la différence!
Bonne chance!
la source
"(()())()"
serait représenté comme[0, 0, 1, 0, 1, 1, 0, 1]
. Cela supprimerait la nécessité de convertir l'entrée en code de caractères, puis de la soustraire.Réponses:
Japt v2, 20 octets
Testez-le en ligne!
Tout le monde a mal compris le défi au début et même si chaque paire de parenthèses devait contenir un nombre pair de sous-paires, alors qu'en fait le défi demande en fait 0 ou 2 sous-paires. Voici donc ma réponse révisée, en utilisant la même technique que précédemment.
Nous pouvons toujours résoudre le problème avec le remplacement récursif. Le fait est qu'au lieu de simplement supprimer toutes les occurrences de
()()
, nous devons nous assurer qu'il n'y a rien d'autre dans le même wrapper que le()()
(en d'autres termes, aucun()()()()
ou quelque chose comme ça). Nous pouvons le faire en remplaçant récursivement(()())
par()
.Le nouveau problème est que l'entrée elle-même n'a pas une paire de parenthèses externes (car cela ne ferait pas d'elle une chaîne équilibrée entre parenthèses), nous forçant à l'envelopper dans une paire supplémentaire pour la réduire complètement. Enfin, le résultat final pour les chaînes équilibrées est maintenant à la
()
place de la chaîne vide, nous vérifions donc l'égalité plutôt que de simplement prendre le NON logique de la sortie.la source
sed 4.2.2, 30
Essayez-le en ligne .
Cela renvoie un code de sortie du shell de 1 pour True et de 0 pour False.
la source
Perl 5 -lp,
2422 octetsEssayez-le en ligne! Le lien inclut des cas de test. Edit: sauvé 2 octets grâce à @JoKing. Explication: juste une expression rationnelle récursive. Le groupe de capture externe représente une chaîne équilibrée en tant que
<
suivie d'une chaîne équilibrée facultative suivie de>
deux fois. Notez que la plupart des autres réponses peuvent utiliser()
s mais cela coûte deux octets supplémentaires:Essayez-le en ligne! Le lien inclut des cas de test.
la source
<>
()
s, donc je ne pensais pas que c'était une comparaison juste, mais je vois que la réponse APL de @ ngn utilise également<>
s donc j'ai mis à jour celle-ci.6502 routine de code machine , 48 octets
Attend un pointeur sur une chaîne dans
$fb
/$fc
qui ne devrait contenir que(
et)
. Efface l'indicateur C (Carry) si la chaîne est "équilibrée entre parenthèses", le définit autrement (ce qui est un idiome typique sur le 6502, définissez le portage "en cas d'erreur"). Ne fait rien de sensé sur une entrée invalide.Bien que l'algorithme soit récursif, il ne s'appelle pas lui-même (ce qui nécessiterait plus d'octets et rendrait la position du code dépendante), mais maintient à la place une profondeur de récursivité elle-même et utilise une ramification "simple".
Démontage commenté
Exemple de programme assembleur C64 utilisant la routine:
Démo en ligne
Code dans la syntaxe ca65 :
la source
V ,
21, 20 octetsEssayez-le en ligne! ou Vérifiez tous les cas de test!
Hexdump:
la source
Brachylog , 28 octets
Essayez-le en ligne!
Explication
la source
C (gcc) , 113 octets
Essayez-le en ligne!
Explication
Essayez-le en ligne!
la source
MATL ,
2625 octetsEssayez-le en ligne!
Merci à la réponse de @ETHProductions pour l'idée "remplacer (() ()) par ()" et au commentaire de la question de @JungHwan Min pour l'idée de voir les crochets comme des chiffres binaires.
La sortie est un tableau vide pour la vérité, un nombre positif pour falsey - ce qui, je pense, est autorisé par le commentaire de OP: "Cela pourrait être des catégories. Si ce n'est pas le cas, nous pouvons ajouter
n
à la fin pour +1 octet, pour avoir 0 comme sortie véridique et 1 comme sortie falsey.Avec commentaires:
la source
C # (.NET Core) ,
7871 octetsEssayez-le en ligne!
la source
Haskell ,
8259 octetsEssayez-le en ligne!
Je suppose qu'il peut être joué beaucoup plus loin, car c'est la première fois que je joue au golf à Haskell, donc toutes les astuces ou commentaires sont les bienvenus.
EDIT - Merci @nimi pour avoir économisé 23 octets (plus de 28% de la soumission originale :)
la source
()
toury+1
. Comme les fonctions sans nom sont autorisées, vous pouvez supprimer laf=
,r[0]
est une fonction appropriée. Mettez le cas de baser b[]
à la fin et passez à une fonction d'infixe (par exemple#
), puis vous pouvez l'utiliserb#_=
. Vous pouvez également modifier légèrement votre algorithme en créant la liste pour vérifier0
s et2
s étape par étape au lieu de la transporter autour des appelsr
dans un accumulateurr(x:y:z) ... = x : r (...) a
avec cas de baser b [] = b
. Faites la vérification après l'appel initialr[0]
. En tout 73 octets.foldl
(59 octets): essayez-le en ligne! .JavaScript (ES6), 63 octets
Prend l'entrée comme un tableau de caractères. Renvoie false pour équilibré entre parenthèses, true pour non équilibré entre parenthèses.
Essayez-le en ligne!
Commenté
Récursif, 54 octets
L'utilisation de remplacements récursifs (comme dans la réponse Japt d'ETHproductions ) est cependant beaucoup plus courte.
Prend l'entrée sous forme de chaîne. Renvoie 1 pour équilibré entre parenthèses, 0 pour non équilibré entre parenthèses.
Essayez-le en ligne!
Récursif, 46 octets
Celui-ci lance une erreur de récursivité pour non équilibrée entre parenthèses:
Essayez-le en ligne!
la source
x[k]
est initialement indéfini etx[k]++
donneraitNaN
, alors que-~undefined
donne1
.a[k]
contient initialement un caractère. Mais la même logique s'applique aux chaînes: appliquer l'++
opérateur sur elles donneNaN
, mais les opérateurs au niveau du bit (tels que~
) les forcent à être contraints au0
préalable.Perl 6 ,
43 4137 octetsEssaye-le
Essaye-le
Essaye-le
Étendu:
la source
R , 71 octets
Essayez-le en ligne!
Une autre solution - plus longue - mais intéressante pour l'approche différente
R , 85 octets
Essayez-le en ligne!
Explication:
Prenez la chaîne d'entrée et remplace:
évalue ensuite l'expression résultante. S'il est égal à zéro, il est équilibré, sinon ce n'est pas le cas. L'utilisation de
sum
n'est nécessaire que pour gérer le cas de chaîne vide, car son évaluation revientNULL
.par exemple
la source
f=function(s,r=sub('(()())','()',s,f=T))'if'(r==s,s==''|s=='()()',f(r))
Wolfram Language (Mathematica) , 65 octets
Essayez-le en ligne!
la source
05AB1E ,
181613 octetsPort de @ETHproductions Japt s » réponse fixer le cas de test
()(()()(()())(()()))
.-2 octets grâce à @Adnan .
Sur la base de ce commentaire de l'OP, j'utilise maintenant
()
comme valeur véridique, et rien d'autre comme falsey. Si les deux valeurs doivent être cohérentes au lieu d'une seule, ce serait l'ancienne réponse de 16 octets à la place (…(ÿ)…(()∞„()©:®Q
), en retournant0
pour véridique et1
les cas de test falsey.Essayez-le en ligne ou vérifiez tous les cas de test .
Explication
(Ancienne réponse de 18 octets qui a échoué pour le cas de test
()(()()(()())(()()))
..):Essayez-le en ligne ou vérifiez tous les cas de test .
la source
„()∞õ:g_
.(()()()())
qui devraient renvoyer Falsey. Chaque groupe de parenthèses doit contenir exactement 0 ou 2 groupes internes.'(®')J
par…(ÿ)
.ÿ
existait, mais je ne l'ai jamais utilisé auparavant, alors je l'ai complètement oublié.APL (Dyalog Classic) , 27 octets
Essayez-le en ligne!
la source
Prolog , 46 octets
Essayez-le en ligne!ou Vérifiez tous les cas de test!
Utilise des listes de
l
etr
en entrée, par exemple"()()"
est testé en tant quef([l,r,l,r]).
.Les trois premières lignes sont la grammaire des chaînes valides dans la syntaxe de la grammaire de clause définie de Prolog .
a(A,B).
renvoietrue
quandA
est une liste qui suit la grammaire etB
est vide. Ainsi la fonction principale enf
prendX
et vérifie si ellea(X,[])
est maintenue.la source
Python 2 ,
7371 octetsEssayez-le en ligne!
la source
brainfuck, 50 octets
Formaté:
Attend une chaîne de
(
et)
sans un retour à la ligne de fin, et affiche\x01
vrai et\x00
faux. (Pour plus de lisibilité, vous pouvez par exemple ajouter 48+
s avant la finale.
pour le faire imprimer1
et0
place.)Essayez-le en ligne
Cela maintient une pile avec le nombre de groupes à chaque profondeur, en distinguant les caractères par parité et en vérifiant si le nombre de groupes est dans {0, 2} après chaque parenthèse fermée; si la condition n'est pas remplie, consomme le reste de l'entrée et définit un indicateur; vérifie ensuite à nouveau la condition à la fin du programme.
Si nous sommes autorisés à terminer le flux d'entrée avec un caractère impair, nous pouvons omettre la vérification finale
<[--[>->]]
pour économiser 10 octets. (Si ce\n
n'était même pas gênant, j'aurais peut-être proposé cette variante comme réponse principale.)(Nous pourrions également économiser quelques octets en changeant le format de sortie
\x00
pour vrai et non\x00
pour faux, ce qui semble être autorisé (peut-être accidentellement) par l'énoncé du problème tel qu'il est écrit, mais de toute façon ce ne serait pas très intéressant, et je préfère de ne pas faire ce changement.)la source
Python2,
9594 octetsEssayez-le en ligne!
f () transforme la chaîne en un tuple imbriqué, qu'elle passe à g ().
g () parcourt récursivement le tuple et retourne False si un élément n'a pas exactement 0 ou 2 enfants.
Enregistré un octet en utilisant le formatage de chaîne.
la source
Stax ,
1311 octetsExécuter et déboguer
J'ai enregistré deux octets lorsque j'ai réalisé que les entrées peuvent être implicitement évallées comme des littéraux de tableau. En supprimant les guillemets doubles, l'entrée est simplifiée.
L'idée générale consiste à évaluer l'entrée en tant que littéral de tableau et à mapper récursivement les éléments pour vérifier l'équilibre parethesly. Si l'assertion finale échoue, il y aura ensuite un pop sur une pile vide. Dans stax, l'éclatement avec des piles vides met immédiatement fin au programme.
Déballé, non golfé et commenté, il ressemble à ceci.
Exécutez celui-ci
la source
Java 10,
99969583 octetsPort de ma réponse 05AB1E (retourne également
()
véridique et rien d'autre que falsey).Essayez-le en ligne.
Explication:
return s;
peut êtrereturn"()".equals(s);
si un résultat booléen réel était requis.la source
!s.contains("()()(")