Ce fut l'un d'une série de défis menant à l'anniversaire de Brain-Flak. En savoir plus ici .
Défi
Pour ce défi, votre objectif sera de trouver la toute première paire de supports correspondants dans une chaîne de ()[]{}<>
supports parfaitement adaptée . 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, comme
() []{}
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
L'entrée consistera en une seule chaîne non vide ou un tableau de caractères contenant uniquement les caractères ()[]{}<>
, et il est garanti qu'elle correspond parfaitement. Vous pouvez prendre l' entrée d'une manière raisonnable qui correspond à nos valeurs par défaut i / o .
Sortie
La sortie de votre programme ou fonction sera l'index de la parenthèse qui ferme la première. Sortie doit être soit 0
ou 1
indexé. Encore une fois, la sortie peut être d'une manière raisonnable qui correspond à nos valeurs par défaut i / o .
Cas de test
Input 0-indexed 1-indexed
() 1 2
(<>) 3 4
<[]{<>}> 7 8
{}{}{}{} 1 2
[[]<>[]] 7 8
C'est le code-golf , le moins d'octets gagne!
Réponses:
V , 4 octets
Essayez-le en ligne!
Contrairement à la plupart des réponses V, cela utilise l'indexation 0. Je suis extrêmement fier de cette réponse et du chemin parcouru par ma langue. Explication:
la source
Brain-Flak ,
685, 155, 151, 137 octetsEssayez-le en ligne!
136 octets de code, plus un octet pour
-a
. Un indexé.530 octets au golf! C'est probablement le plus grand golf que j'ai jamais fait.
14 octets économisés grâce à Riley!
Cela abuse d'une formule de la parenthèse ouvrante / fermante: si vous prenez les valeurs ASCII, incrémentez-les d'une unité et prenez le module de 4, les ouvreurs (
({[<
) obtiendront toujours0
ou1
, tandis que les fermeteurs ()}]>
) obtiendront toujours 2 ou 3.Explication:
la source
n-1&2
/n+1&2
/-n&2
oun%7&2
pour distinguer les parenthèses d'ouverture et de fermeture ...&2
, mais je vais l'examiner.0
/1
et2
/3
... bien que maintenant que je le regarde, vous décrémentez simplement si positif. Un truc sympa aussi :-)(TOS+1)%4
peut être plus court: essayez-le en ligne!05AB1E ,
17 1610 octets-1 grâce à carusocomputing
-6 merci à Adnan pour sa perspicacité étonnante qui "après incrémentation, l'avant-dernier bit est 0 pour une parenthèse d'ouverture et 1 pour une parenthèse de fermeture"
Essayez-le en ligne!
la source
žu
semble utilisable ici.žu8ÝÈÏ
donc, non, pas vraiment lol. Au mieux, ce sera toujours 5 octets. Je pensais plus à la division en paires d'accolades et à la suppression des accolades jusqu'à ce qu'il ne reste plus qu'une paire, incrémenter le compteur de 2 pour chaque paire supprimée. Je ne sais pas si c'est moins cependant. L'essayer atm.Ç>2&<.pO0k
.0
pour une parenthèse ouvrante et1
pour une parenthèse fermante.Vim, 23 octets
Essayez-le en ligne!
Je suis vraiment triste de cette réponse. Cette solution est magnifiquement élégante et courte, mais, par défaut, vim ne prend pas en compte
<
et n'est pas>
compatible, j'ai donc besoin de 13 octets de code standard. Sinon, ce ne serait que de 10 octets.J'aurais posté une réponse V, mais ce ne serait qu'un octet plus court, à savoir passer
Vr
àÒ
, carVr
c'est un idiome vim courant.Ceci est indexé 1 mais pourrait être modifié de manière triviale pour être indexé 0 en changeant le
1
en a0
.la source
Gelée ,
11109 octetsEssayez-le en ligne!
Explication
L'idée ici était de trouver une "formule magique" qui puisse distinguer l'ouverture des crochets de fermeture. J'ai utilisé à l'origine
O%7&2
(c'est-à-dire "prendre le code ASCII, modulo 7, au niveau du bit et 2"), mais @ETHproductions a suggéréO’&2
(qui remplace le modulo 7 par une décrémentation); les deux renvoient 0 pour une sorte de parenthèse et 2 pour l'autre. La soustraction de 1 (’
) transformera ces résultats en -1 et 1.Le reste du code est
+\
.+\
produit une somme cumulée. Si un ensemble de crochets est correctement mis en correspondance, il contiendra le même nombre de -1 et de 1, c'est-à-dire que sa somme cumulée sera 0. Ensuite, nous avons juste besoin de renvoyer l'index du premier 0 dans la liste résultante; nous pouvons le faire aveci0
.la source
b*2%7>3
Rétine ,
2624 octetsEssayez-le en ligne!
Le résultat est basé sur 1.
Explication
Une solution Retina très différente qui est essentiellement basée sur une seule expression régulière (et très lisible ...). Cela utilise une nouvelle technique que j'ai découverte hier pour faire correspondre des chaînes équilibrées à l'aide de groupes d'équilibrage .
Find (
M
) et return (!
) toutes les correspondances de l'expression régulière^.(?<-1>([[({<])*.)*
. Cette expression régulière saute le premier caractère de la chaîne, puis utilise des groupes d'équilibrage pour garder une trace de la profondeur d'imbrication. Toute[({<
augmentation de la profondeur (suivi par groupe1
) et tout autre caractère diminue la profondeur (en principe, la.
permet également de diminuer la profondeur en ouvrant les crochets, mais puisque l'expression régulière est appariée avec avidité, le backtracker ne tentera jamais que ). L'astuce étrange est que le(?<-1>...)
groupe entoure1
qui fonctionne parce que l'éclatement d'un groupe d'équilibrage se produit à la fin du groupe. Cela permet d'économiser deux octets sur l'approche standard sous la forme((open)|(?<-2>close))*
. La correspondance s'arrête nécessairement à la parenthèse qui ferme la première, car nous l'avons ignorée, elle n'est donc pas prise en compte dans la profondeur de pile (et la profondeur de pile ne peut pas devenir négative).La longueur de cette correspondance est l'index de base 0 du support que nous recherchons.
Comptez simplement le nombre de correspondances vides dans cette chaîne. Le regex vide correspond toujours une fois de plus qu'il n'y a de caractères dans la chaîne, donc cela nous donne l'index basé sur 1 de la parenthèse que nous recherchons.
la source
Rétine , 24 octets
Essayez-le en ligne!
Ceci est inspiré par la solution de Martin Ender .
Explication
La première ligne est une expression régulière qui correspond à un caractère suivi d'une chaîne équilibrée allant jusqu'à la fin de la chaîne principale (pour une explication détaillée de la façon dont les groupes d'équilibrage sont utilisés dans cette expression régulière, voir la réponse de Martin). Étant donné que les expressions régulières recherchent des correspondances de gauche à droite, cela trouvera le sous-correctif correct le plus long, c'est-à-dire tout ce qui se trouve après le crochet qui ferme le premier, plus le crochet lui-même.
La ligne suivante est vide, nous remplaçons donc la correspondance par une chaîne vide, ce qui signifie que nous n'avons plus qu'à compter les caractères restants pour obtenir le résultat souhaité (indexé 0).
La dernière ligne vide compte le nombre de correspondances de la chaîne vide dans la chaîne, qui est un de plus que le nombre de caractères de la chaîne, équivalent au résultat indexé 1.
la source
Perl 5 , 28 octets
Enregistré 6 octets en utilisant juste
.
au lieu de[>})\]]
, de la réponse Retina de Martin Ender .27 octets de code +
-p
indicateur.Essayez-le en ligne!
Regex récursif, quelle belle invention.
L'expression régulière recherche une parenthèse ouvrante (
[<{([]
), suivie d' un appel récursif (?0
), suivie d'une parenthèse fermante (.
). Tout cela de manière non-gourmande (+?
) donc il correspond le plus court possible depuis le début. L'index de la fin du match est la réponse, et en l'occurrence, il peut être trouvé dans$+[0]
.la source
JavaScript (ES6),
555352 octets1 octet enregistré grâce à @Adnan
Pour chaque parenthèse ouvrante, prendre son code de code mod 4 nous donne 0 ou 3; pour les parenthèses fermantes, il nous donne 1 ou 2. Par conséquent, nous pouvons distinguer entre parenthèses ouvrantes et fermantes en annulant le code de caractère de la parenthèse (qui retourne les bits et soustrait 1) et en prenant le deuxième bit le moins significatif; c'est-à-dire
n&2
,.la source
n-1&2
, ça-n&2
marche aussi?C,
757256555445 octetsVoyez-le fonctionner en ligne .
Si vous souhaitez que la sortie soit indexée 1 au lieu de 0, remplacez la dernière
0
par1
.la source
Python 2.7 + Numpy,
8579 octetsMa première tentative de code golf:
la source
Brain-Flak , 97 octets (96 pour le code, 1 pour le drapeau)
Courez avec le
-a
drapeau.Essayez-le en ligne!
Explication:
Ça marche, d'accord.
la source
Rétine , 34 octets
Essayez-le en ligne!
Le résultat est basé sur 0.
Explication
Remplacez le premier caractère par un
!
. Cela fait que le support que nous recherchons est inégalé.Convertissez les parenthèses, les crochets et les accolades en crochets angulaires. Étant donné que la chaîne est entièrement compatible, nous ne nous soucions pas du tout des types réels, ce qui économise quelques octets à l'étape suivante.
À plusieurs reprises (
+
) remplacer chaque caractère dans toutes les correspondances<!*>
avec avec!
s. Autrement dit, nous faisons correspondre des paires de crochets qui ne contiennent plus de crochets non traités et les transformons en points d'exclamation supplémentaires. Cela transformera la chaîne entière sauf le crochet de fermeture inégalé en points d'exclamation.Comptez le nombre de points d'exclamation principaux, qui est égal à la position de base 0 du premier point d'exclamation (c'est-à-dire le crochet sans correspondance). Les
\G
ancres correspondent chacune à la précédente, c'est pourquoi cela ne compte pas les!
s après ledit support.la source
(?!(2))
c'est juste(?!2)
. Vous vouliez probablement dire(?(2)(?!))
ou(?2)!)
. Vous avez également oublié de vous échapper]
et la finale+
doit être*
.PHP, 116 octets
Version en ligne
la source
<?php
?Python , 76 octets
Fonction récursive qui utilise l'ordinal 2nd LSB comme indicateur pour l'astuce open vs close utilisée par beaucoup trouvée par Adnan (et probablement d'autres). La queue frappe lorsque la somme cumulée de l'
-1
ouverture et1
de la fermeture atteint zéro. L'index est conservé dans une variable car il est moins cher que l'octetlen(r)
, l'indexation est basée sur 1.Essayez-le en ligne!
la source
Rubis,
3534 octetsBasé sur la réponse Perl5 de Dada . La sortie est indexée 1. Nécessite que l'interpréteur Ruby soit invoqué avec l'
-n
option (implicitewhile gets
boucle ).Edit: c'est aussi
3534 octets, mais c'est un autre point de départ possible pour réduire encore cette réponse.Edit2: Suppression des espaces inutiles après
p
.Edit3: Quelques réponses de 34 octets supplémentaires.
la source
Python 3 ,
59555049 octetsLa sortie est indexée 0. La formule pour déterminer la direction du crochet a été découverte pour la première fois par @ETHProductions et améliorée par @Adnan.
Essayez-le en ligne!
la source
Lot, 172 octets
1 indexé.
<>
s sont bien sûr des caractères spéciaux dans Batch donc non seulement je dois citer partout, mais je ne peux même pas faire d'astuces telles que les faire desgoto
étiquettes.la source
R, 126 octets
la source
C, 127 octets
Essayez en ligne
Sortie
la source