Vous devez écrire un programme ou une fonction qui prend une chaîne de crochets et indique si cette chaîne correspond ou non. Votre programme doit imprimer une valeur de vérité ou de fausseté et IO peut être dans n'importe quel format raisonnable .
Règles et définitions:
Pour les besoins de ce défi, un "crochet" est l’un des caractères suivants
()[]{}<>
:.Une paire de crochets est considérée comme "appariée" si les crochets d’ouverture et de fermeture sont dans le bon ordre et qu’ils ne contiennent aucun caractère, tel que
() []{}
Ou si chaque sous-élément à l'intérieur de celui-ci est également assorti.
[()()()()] {<[]>} (()())
Les sous-éléments peuvent également être imbriqués sur plusieurs couches.
[(){<><>[()]}<>()] <[{((()))}]>
Une chaîne est considérée comme "Complètement compatible" si et seulement si:
Chaque personnage est une parenthèse,
Chaque paire de supports a les supports d’ouverture et de fermeture corrects et dans le bon ordre, et
Chaque support est assorti.
Vous pouvez supposer que l'entrée ne contiendra que de l' ASCII imprimable .
Test IO
Voici quelques entrées qui devraient renvoyer une valeur de vérité:
()
[](){}<>
(((())))
({[<>]})
[{()<>()}[]]
[([]{})<{[()<()>]}()>{}]
Et voici quelques sorties qui devraient renvoyer une valeur de fausseté:
( Has no closing ')'
}{ Wrong order
(<)> Each pair contains only half of a matched element
(()()foobar) Contains invalid characters
[({}<>)> The last bracket should be ']' instead of '>'
(((())) Has 4 opening brackets, but only 3 closing brackets.
Comme d'habitude, c'est du code-golf, donc les échappatoires standard s'appliquent, et la réponse la plus courte en octets l'emporte.
la source
[}
un match? Et si non, où est-il exclu par ces règles?Each pair of brackets has the correct opening and closing bracket and in the right order.
Réponses:
05AB1E , 19 octets
L'entrée est donnée entre guillemets . Code:
De la merde, de nombreux bugs et des fonctionnalités non implémentées ont été trouvés. Explication:
C'est en fait une partie délicate. Voici à quoi cela ressemble dans le pseudocode:
Ceci est couvert par cette partie du code 05AB1E :
Comme vous pouvez le constater, le remplacement est infini (jusqu'à ce que la chaîne ne change plus). Donc, je n'ai pas à m'inquiéter de la définition du remplacement dans une boucle, car cela est déjà intégré. Après ça:
Utilise le codage CP-1252 . Essayez-le en ligne! (légèrement modifié car la version ci-dessus est obsolète).
la source
õ
été ajouté?Flak cérébrale ,
1101, 1085, 981 octetsEssayez-le en ligne!
Il s’agit de 980 octets de code source, et
+1
pour l’-a
indicateur permettant une entrée ASCII (mais une sortie décimale)C'est une réponse que je voulais écrire depuis très très longtemps. Au moins 6 mois. J'attendais de poster ceci parce que je savais que répondre à ce défi serait extrêmement difficile en cas de flak cérébrale. Mais cela en vaut la peine pour une raison très importante: le code source lui-même est une entrée de vérité, ce qui est le but même de ce langage.
Et comme je l'ai écrit ici , cette question m'a inspiré pour écrire cerveau-flak.
Cette réponse a pris environ deux heures pour écrire. J'admets que le jeu est assez médiocre, principalement parce qu'une grande partie du code est répétée pour chaque type de support. Mais je suis surtout étonné d’avoir pu écrire une réponse, surtout que Brain-Flak est
Je vais essayer de jouer au golf plus tard, mais je voulais quand même le faire savoir.
J'ai une explication détaillée, mais elle compte environ 6 000 caractères, je pense donc qu'il ne serait pas sage de coller le tout dans cette réponse. Vous pouvez le lire ici si vous voulez. Je vais ajouter une explication plus courte ici.
L'idée de base est que nous répétions les étapes suivantes pour chaque personnage de la pile:
Nous vérifions chaque caractère pour voir s'il correspond à un support. S'il s'agit d'un crochet d'ouverture, nous plaçons un nombre sur l'autre pile conformément au mappage suivant:
Ensuite, nous vérifions si cela correspond à un crochet de fermeture. Si tel est le cas, nous plaçons le nombre équivalent dans la pile de secours, comme pour les crochets d’ouverture. Ensuite , nous vérifions si les deux premiers nombres sont égaux. S'ils le sont, ils sont tous les deux effondrés et le programme se poursuit normalement. Si ce n'est pas le cas, nous effaçons les deux piles (pour arrêter la boucle) et plaçons une pile sur l'autre pile. Ceci est essentiellement une déclaration "break".
Après avoir vérifié les 8 types de support, nous transmettons la valeur de ce cycle dans la boucle. Puisque nous mettons la plupart du temps à zéro, les seuls extraits qui ont une valeur sont les conditions conditionnelles lorsque nous comparons des parenthèses. Ainsi, si un crochet est apparié, la boucle entière a la valeur 1. Si aucun d'entre eux ne l'a fait, la boucle entière a la valeur 0. Dans ce cas, nous allons effacer les deux piles et appliquer un 0 sur l'autre pile. Encore une fois, cela ressemble à une déclaration "break".
Une fois cette boucle principale lancée, le reste est assez simple. Nous sommes sur la pile principale (vide) et la pile alternative est vide (si les parenthèses ont été comparées) ou non vide si elles ne l'étaient pas. Donc nous courons ceci:
Cela poussera un 0 ou un 1 sur la pile principale et, à la fin du programme, il sera implicitement imprimé.
Merci à @WheatWizard d'avoir mis au point un bon extrait de code "égal à" et "pas logique" et d'avoir mis à jour régulièrement le wiki github avec des exemples utiles.
Merci à @ ASCII-only pour l’écriture d’un méta-transfert d’entiers en ligne qui a grandement contribué à l’écriture de ce programme.
révisions
Suppression de la redondance push pop
Modification de la logique du compteur zéro
la source
Brain-Flak ,
204196190 octetsEssayez-le en ligne!
-8 octets grâce à Wheat Wizard. -6 octets grâce à Jo King.
Explication
Ce programme stocke les codes de caractères de tous les crochets actuels non fermés sur la deuxième pile. Les paires de support
<>
,[]
et{}
chacun ont des codes de caractères qui diffèrent par exactement 2, donc il n'y a pas besoin de vérifier pour eux spécifiquement. La paire()
ne diffère que de 1, nous vérifions donc(
spécifiquement et décrémentons cet octet (incrémentons en fait tous les autres octets) avant de continuer.la source
([{}]<>({}))((){[()](<{}>)}{})
({<>[()]}())
-6 octetsJavaScript (ES6),
5250 octetsSupprimez à plusieurs reprises les crochets jusqu'à ce que le résultat soit identique à l'original, puis renvoyez la valeur false sauf si la chaîne est maintenant vide.
Edit: 2 octets enregistrés grâce à @ edc65.
la source
Rétine, 20 octets
Essayez-le en ligne
la source
CJam,
25242321 octetsMerci à Sp3000 pour la sauvegarde de 2 octets.
Merci à jimmy23013 pour la sauvegarde de 2 octets.
Suite de tests.
Fonctionne essentiellement les mêmes que les autres réponses: nous enlevons à plusieurs reprises
()
,[]
,<>
et{}
de la chaîne et vérifier si nous nous retrouvons avec la chaîne vide. Pour éviter d'avoir à vérifier lorsque nous avons terminé, nous supprimons les paires deN
temps oùN
est la longueur de la chaîne, ce qui est toujours suffisant (puisque chaque itération supprimera au moins deux caractères, sauf si nous avons terminé). Je suis content de voir que cela ne bat pas Retina. :) (Bien que Pyth ou Jelly puisse ...)Il y a une astuce de golf amusante ici: pour obtenir la chaîne,
()<>[]{}
nous utilisons les éléments suivants:Le,
{()<>}
n'est qu'un bloc (c'est-à-dire une fonction), qui contient les autres crochets sous forme de code. Aveca
nous enveloppons le bloc dans un tableau. Le`
stringifie ce tableau, ce qui donne"[{()<>}]"
. Enfin, nous trions la chaîne avec$
, qui réorganise les crochets()<>[]{}
.la source
()<>[]{}`
cela fonctionnerait aussi bien et que vous auriez le même nombre d’octets, non?()<>
y a quatre opérateurs (décrémenter, incrémenter, puis comparer ou troncer selon les opérandes), qui seraient exécutés immédiatement, alors qu'il{}
s'agit d'un bloc (l'équivalent de CJam d'une fonction), c'est-à-dire un morceau de code qui vient d'être poussé sur la pile sans l'évaluer immédiatement. C'est pourquoi j'ai besoin{}
de boucler le()
et<>
, mais utiliser ensuitea
pour tout mettre dans un tableau est plus court que[...]
.Python, 67 octets
Génère et évalue une expression qui ressemble à
et vérifie si le résultat est vide.
Sp3000 a sauvegardé 8 octets en indiquant qu'il
[],(),{}
est possible de créer un sous-lit sans guillemets, car ce sont des objets Python et que deux parenthèses étaient inutiles.la source
Yacc, 119 octets
N'utilise pas regex / replace.
Ungolfed
Compilation
Usage
la source
Pyth,
312524 octetsGolfé jusqu'à 25 octets grâce à FryAmTheEggMan Supprimé 1 octet
Essayez-le ici: suite de tests !
Je suis toujours un débutant Pyth, toute aide est appréciée.
Explication
BTW, félicitations à l'autre réponse Pyth (qui est actuellement de 20 octets)
la source
Vz=:z"<>|\[]|{}|\(\)"k;!z
. Il est particulièrement important de noter que vous n’avez en principe jamais besoin d’utiliserl
si vous n’avez pas besoin du nombre, et=
devine automatiquement la première variable utilisée dans une expression. Faites-moi savoir si vous souhaitez que je vous explique quelque chose d'autre dans le salon Pyth :)l
c'était inutile, c'est bon à savoir. Au début, j'ai déclaré une fonction parce que ma logique était différente et j'ai oublié de la supprimer. Dois-je inclure votre réponse à la mienne? (Je suis un débutant>. <)Pyth, 20 octets
Essayez-le en ligne: Test Suite
Supprime les occurrences de façon répétée
[]
,()
,<>
et{}
par clivage et re-fusion. Vérifie si la chaîne résultante est vide ou non.la source
Javascript ES6, 54 octets
Utilise une implémentation de remplacement récursive. Assez simple.
la source
Regex (saveur PCRE),
4137 octetsJuste une solution standard avec regex récursive.
Merci jimmy23013 pour avoir rasé 4 octets
la source
Perl,
3433 octetsComprend +2 pour
-lp
Exécuter avec entrée sur STDIN:
brackets.pl
:Trouve la première paire de crochets sans rien entre eux et la supprime tant qu'il y en a. Puis vérifie si la dernière chaîne est vide.
la source
s/\(\)|\[]|<>|{}//&&redo;$_=!$_
marcherait pas ? :)Brain-Flak , 204 octets
Essayez-le en ligne!
Pas aussi court que la réponse de Nitroden , mais utilise une approche très différente. Celui-ci parcourt l'entrée de manière répétée, en supprimant les paires de crochets correspondants voisins jusqu'à ce qu'il n'en reste plus. À ce stade, s'il reste quelque chose sur la pile, la chaîne ne correspond pas complètement.
Explication:
la source
Brainfuck, 132 octets
Formaté:
Attend une entrée sans fin de ligne. Imprime
\x00
pour faux et\x01
pour vrai.Essayez-le en ligne.
Approche: Maintenir une pile en commençant par
\x01
, et appuyer sur le support de fermeture correspondant chaque fois qu’un support d’ouverture est rencontré. Avant de vérifier si le caractère actuel est un crochet d’ouverture, commencez par vérifier s’il est égal au crochet de fermeture situé en haut de la pile et, le cas échéant, supprimez-le. S'il ne s'agit ni du support de fermeture approprié ni du support d'ouverture, utilisez le reste de l'entrée tout en déplaçant le pointeur vers la droite. A la fin, vérifiez si le pointeur est à côté de l'initiale\x01
.la source
Grime v0.1, 34 octets
Imprime
1
pour un match et0
pour aucun match. Essayez-le en ligne!Explication
Grime est mon langage de filtrage de motifs 2D conçu pour ce défi . il peut également être utilisé pour faire correspondre des chaînes 1D. Ceci est ma première réponse avec elle. J'ai modifié Grime aujourd'hui, mais seulement pour changer le caractère d'un élément de syntaxe (
`
au lieu de,
), afin que cela n'affecte pas ma partition.la source
Reng v.3.3, 137 octets, sans compétition
Essayez-le ici!
Il y a un peu plus de golf à faire, mais au moins ça marche. J'ai ajouté une commande
ð
pour garder une trace des piles après ce défi afin que cela soit possible / facilement à distance. Je vais expliquer cela un peu plus tôt, mais il garde généralement une trace de toutes les chaînes itérées et cherche des répétitions; s'il y a une répétition, la chaîne est irréductible. Sinon, la chaîne sera réduite à la chaîne / pile vide et sera sortie1
. Sinon, aucune sortie ne sera produite.la source
PowerShell v2 +,
6362 octetsNe peut pas tout à fait attraper JavaScript, mais est actuellement en train de réduire les autres non-esolangs.
Une approche similaire que d' autres réponses: une simple boucle qui continue tant que nous pouvons supprimer l' un des
[]
,()
ou<>
(avec plusieurs caractères étrangers car nous avons besoin pour échapper aux promotions regex). En$b
cours de route, nous nous en servons pour nous rappeler comment notre boucle précédente a$a
été définie. Une variable non initialisée est évidemment différente de$null
la première fois que la boucle est rencontrée .$a
$null
À la fin de la boucle,
$a
est vide ou non, et le booléen-non de cette chaîne est l'unTrue
ou l' autreFalse
.Exemple
la source
C,
121122114 octetsRasé de 8 octets grâce à @xsot!
Utilise une pile.
la source
c%7&2
. En fait, vous n'en avez pas besoink
. Au lieu de cela, vous pouvez simplement incrémenteri
là où vous voudriez le modifier,k
car vous devez vérifier sii
est égal à zéro. Quelque chose comme ceci (code non testé):a[99],i;main(c){for(;read(0,&c,1);c%7&2?i+=a[i--]^c/9:(a[++i]=c/9))i+=!strchr("()[]{}<>",c);putchar(48+!i);}
.a[99],i,k;main(c){for(;read(0,&c,!k);c%7&2?k|=a[i--]^c/9:(a[++i]=c/9))k|=!strchr("()[]{}<>",c);putchar(48+!i*!k);}
a[99],i;main(c){for(;read(0,&c,1);c%7&2?i+=a[i]^c/9?1:-1:(a[++i]=c/9))i+=!strchr("()[]{}<>",c);putchar(48+!i);}
Mais cela ne fonctionne pas encore pour les entrées telles que()))
, car "extraire" de la pile ne remet pas à zéro les valeurs du tableau.Java 7,
156151 octetsJe ne m'attends pas à ce que cela remporte de prix, mais je n'ai pas encore vu de réponse en Java. De plus, j'aime bien me promener dans PPCG et j'aimerais pouvoir voter / commenter d'autres réponses.
L'entrée est donnée en tant que paramètres du programme. Cela suit le même format que beaucoup d'autres réponses ici, en ce sens qu'il préforme un remplacement de regex dans une boucle. A l'origine, je l'ai eu boucle N fois, où N est la longueur de la chaîne d'origine, mais la boucle
Integer.MAX_VALUE
est plus courte:]. Cela devrait être correct carInteger.MAX_VALUE
c'est la longueur maximale d'unString
en Java, donc il y a une hypothèse implicite que la longueur de l'entrée est quelque chose que Java peut gérer. La durée d'exécution est assez mauvaise (cela a pris environ 20 minutes sur mon lappytop) à cause de la boucle, mais je ne voyais aucune restriction à cela.la source
Haskell , 151 octets
Essayez-le en ligne!
la source
(#)
doit être appelée avec la chaîne vide comme second argument, vous devez compter(#"")
dans votre nombre d'octets. Aussi seulementTrue
etFalse
sont considérés comme truthy / falsy, consultez le Guide des règles Golf .a:x#b:y|a==b=x#y
, ramenant ainsi les octets à 113: essayez-le en ligne!Python 2.7, 96 octets
la source
Python 2, 80 octets
la source
Julia, 51 octets
Le moins fou de plusieurs options. Sans surprise, tirer parti de la puissance de regex est le chemin le plus court vers la correspondance de chaînes, mais cela ne s'applique vraiment que si le motif à comparer est régulier. Essayer de faire des motifs PCRE récursifs finit par gonfler la taille du code, soit en vérifiant si la chaîne entière est la correspondance, soit en ancrant les extrémités, puis en créant une construction pour spécifier le corps interne de la récursion regex. Ni de ce qui sont jolies ou propice à coder le golf.
Explication:
La fonction supprime à plusieurs reprises les paires de parenthèses adjacentes de son seul argument et renvoie true si elle peut dériver une chaîne vide de cette façon.
la source
sed,
3936 octets (34 pour le code, 2 pour -r)Essayez-le en ligne!
version sed de ce qui semble être l’approche standard. Requiert des expressions régulières étendues (
sed -r
)3 octets sauvés grâce au charlatan des vaches
la source
a
is:a
etta
économiser des octetsq
de/./
déposer les accolades là aussi. Essayez-le en ligne! C'est à cause de la façonc
dont fonctionne05AB1E, 9 octets
L'entrée est donnée entre guillemets.
Essayez-le en ligne!
Explication:
la source
Clojure, 153 octets
Plus long que même C et Brainfuck répond: o
N'utilise pas de regex, utilise plutôt le premier caractère pour déterminer la balise de fermeture et recherche le premier index où l'équerre est équilibrée (la somme cumulée est égale à zéro). Ensuite, vérifie de manière itérative que ce qui est entre crochets et après est correct.
Il faut voir s'il y a une meilleure approche ...
la source
Lua , 295 octets
Version non-golfée
Essayez-le en ligne!
la source
Japt v2.0a0
-!
, 16 octetsL'essayer
la source
R, 298
L’approche consiste ici à convertir la séquence en code R, puis à l’analyser et à l’évaluer. Si cela donne une erreur, alors revenez
FALSE
.Mais il y a un problème mineur ... Les règles de R pour les supports sont différents,
<
et>
ne sont pas du tout entre parenthèses, et les autres types ont leurs propres règles. Ceci est résolu par une approche révolutionnaire - une fonction de grincement, dont la seule fonction est de signaler une erreur si sa tête et sa queue grincent de différentes manières.Par exemple,
[]
est transformé enS('[', {}, ']')
, où S est défini comme ...Parce que la tête et la queue correspondent, aucune erreur n’est commise.
Quelques autres exemples (la partie gauche est une séquence de crochets et la partie droite est sa transformation en code R valide pouvant être évalué):
Certaines autres séquences de crochets entraîneront des erreurs d'analyse:
Ainsi, la partie restante ne fait qu'attraper les erreurs et renvoie FALSE s'il y en a et VRAI s'il n'y en a pas.
Le code lisible par l'homme:
En l'appliquant à des échantillons de cas:
la source