Écrivez un programme ou une fonction qui accepte une chaîne de huit octets contenant l'un de chacun des caractères ()[]{}<>
disposés de manière à ce que les quatre types de parenthèses respectifs correspondent. Par exemple, l' ]<([){}>
entrée n'est pas valide car les crochets ne correspondent pas (bien que tous les autres le soient).
Imprimer ou renvoyer un entier de 0
à 6
qui indique combien des six paires possibles des quatre types de parenthèses sont verrouillées. Les paires de types de parenthèses sont considérées comme verrouillées si exactement une parenthèse d'un type se produit entre les parenthèses de l'autre type. Ainsi , ([)]
et [(])
sont verrouillés , mais ()[]
, []()
, ([])
et [()]
ne sont pas.
Le code le plus court en octets gagne.
Exemples d'entrées / sorties
()[]{}<> : 0
([{<>}]) : 0
<>{[]}() : 0
{<>([])} : 0
<(>)[{}] : 1
<[({)}]> : 1
[{<}]>() : 2
{<>([}]) : 2
<{(>})[] : 3
[(]<){>} : 3
<([>{)}] : 4
(<{[>})] : 4
(<[{)>}] : 5
<{[(>})] : 5
[{<(]}>) : 6
(<{[)>}] : 6
la source
7~f&
? J'aime déjà cette réponse, et je n'ai même pas lu le reste.Python 2, 163 octets
Cela examine la substance entre chaque paire de supports correspondants et compte le nombre de supports individuels gauche ou droit présents. La somme de ces derniers divisée par deux est la sortie.
Je suis sûr qu'il pourrait être joué beaucoup plus par de meilleurs golfeurs que moi.
la source
GNU sed -r, 147
La sortie est unaire selon cette méta-réponse .
Remarque: remplacez-les
\t
par des tabcaractères réels pour obtenir le score correct. Cependant, le programme fonctionnera dans les deux cas avec GNU sed.Essayez-le en ligne .
la source
Perl, 77 octets
76 code + 1 interrupteur
Prend l'entrée de STDIN et le programme doit être redémarré pour chaque entrée.
Explication
y/.../.../
).for$x...
), incrémentez un compteur pour le caractère ($h{$x}++
).length $1
) et supprimez les deux occurrences de ce caractère de la chaîne. Par exemple, si la chaîne était([{([{<<
, il y a deux caractères[
et{
entre les deux(
s. Une fois les(
s traités, la chaîne devient[{[{<<
et nous ajoutons 2 au nombre total ($z
) de crochets de verrouillage.$z
($_=$z
)la source
Pyth, 20 octets
Suite de tests
JmC/CdTz
: Tout d'abord, cela convertit chaque paire de symboles en un seul caractère en mappant chaque caractère d'entrée à son code de caractère (Cd
) divisé par 10 (/ T
), qui est le même pour chaque paire mais différent entre toutes les paires. Le nombre résultant est reconverti en personnage à des fins qui seront révélées plus tard (C
). La liste résultante de caractères est enregistrée dansJ
.lsm@FPcsJd{J
: Maintenant, nous cartographions les caractères uniques dansJ
({J
). Nous commençons par couper la chaîne formée par concaténation enJ
utilisant le caractère courant comme délimiteur (csJd
). Une paire de crochets chevauche la paire actuelle si elle apparaît dans le deuxième groupe et le premier ou le troisième groupe. Pour éviter le double comptage, nous comptons simplement le premier et le deuxième cas de groupe. Donc, nous supprimons le troisième groupe (P
) et prenons l'intersection des groupes restants (@F
). Enfin, nous concaténons les caractères de chevauchement (s
) et imprimons la longueur du resut (l
).la source
Python 3, 107
Librement basé sur ma solution CJam.
la source
Retina ,
128108646255 octetsOù
<empty>
représente une ligne de fin vide. À des fins de comptage, placez chaque ligne dans un fichier distinct et remplacez le\n
par des caractères de saut de ligne réels. Pour plus de commodité, vous pouvez utiliser ce code équivalent avec l'-s
indicateur d'un seul fichier:La sortie est unaire .
Explication
Le premier
(
indique à Retina d'exécuter le code entier dans une boucle jusqu'à ce qu'une itération cesse de changer la chaîne. Dans ce cas, il répétera toujours quatre fois, une fois pour chaque type de support.Cela transforme simplement chaque support de fermeture en support d'ouverture correspondant, afin que nous puissions faire correspondre les supports correspondants avec une simple référence arrière plus tard. (Cette étape devient un no-op après la première itération. Elle est uniquement incluse dans la boucle, car elle
T
nécessitait déjà un backtick, donc l'ajout(
ne coûte qu'un au lieu de deux octets.)Cela remplace la paire de crochets la plus à gauche par des sauts de ligne. Nous utilisons
\D
pour distinguer les parenthèses des1
s que nous ajoutons plus tard dans la boucle pour le comptage. À(.*)
la fin, une seule paire est remplacée (car les correspondances ne peuvent pas se chevaucher).Le regex entier est dans un lookahead, donc cela correspond à une position . Plus précisément, il correspond à une position pour chaque paire de supports qui a été séparée par les autres supports que nous venons de transformer en nouvelles lignes. A
1
est inséré dans chacune de ces positions. Nous pouvons simplement laisser les1
s là, car ils n'affectent aucun des autres regex (car les\D
s garantissent que nous ne les faisons pas correspondre accidentellement).Enfin, nous supprimons les sauts de ligne (c'est-à-dire les espaces réservés pour le type actuel de crochets) - cela signifie que nous avons réduit le problème restant à une chaîne de longueur 6 contenant seulement 3 types de crochets, mais sinon cela fonctionne exactement de la même manière.
À la fin, seuls les
1
s que nous avons insérés seront laissés, et leur montant correspond exactement au nombre de crochets de verrouillage.la source
JavaScript (ES7),
121117octetsSensationnel. C'était amusant. J'ai esquissé une idée de réponse lorsque ce défi est apparu pour la première fois, mais il faisait plus de 150 octets et je ne voulais pas faire l'effort de le jouer au golf. J'ai rencontré cette idée dans mon carnet hier et j'ai décidé de ne pas y penser tant que je ne l'aurais pas entièrement jouée. J'ai fini par écrire deux algorithmes entièrement nouveaux, dont le premier s'est retrouvé plusieurs octets plus court après avoir joué à environ 25 octets avec des tonnes de piratage de bits.
Comment ça marche
Nous avons d' abord définir des variables
a
etb
à0
.a
est un tableau binaire 4 bits dont les paires de parenthèses nous sommes actuellement à l'intérieur, etb
est un tableau binaire de 16 bits dont les paires de parenthèses sont liées ensemble.Ensuite, boucle de nous à travers chaque caractère
c
dansx
, et chaque omble chevalierd
dans'0123'
. Nous déterminons d'abord le type de supportc
avece=c.charCodeAt()/26-1|0
. Les codes de caractères décimaux de chaque type de parenthèse sont les suivants:En divisant par 26, en soustrayant 1 et le plancher, nous les mappons respectivement à 0, 1, 2 et 3.
Ensuite, nous vérifions si ce nombre est égal à la valeur actuelle de
d
. Si c'est le cas, nous entrons ou sortons dud
type de parenthèse e, donc nous retournons led
bita
aveca^=1<<d
. Si ce n'est pas le cas, mais que nous sommes à l'intérieur dud
type de parenthèse e, nous devons retourner lee
bit dans lad
section 4 bits deb
. Cela se fait comme suit:(a>>d&1)
Renvoie led
bit ea
. Si nous sommes à l'intérieur dud
type de parenthèse, cela renvoie 1; sinon, elle renvoie 0. Ensuite, nous la décalons à gauche pard*4+e
bits et XORb
par le résultat. Si nous sommes à l'intérieur dud
type de parenthèse, ce XORs led*4+e
e bit deb
; sinon, cela ne fait rien.À la fin de tout le bouclage,
b
contiendra un nombre de 1 bits égal au double de la valeur de retour souhaitée. Mais nous devons encore déterminer le nombre de bits. C'est là qu'intervient la sous-fonctionf
:Si
y
est 0, cela renvoie simplement 0. Sinon, il prend le dernier bit dey
avecy%2
, puis ajoute à nouveau le résultat de l'exécution de tout sauf du dernier bity
dans la fonction. Par exemple:Nous parcourons
b
cette fonction et divisons le résultat par 2, et voici notre réponse.la source
Oracle SQL 11.2, 206 octets
Non-golfé:
la source