Supports triplés équilibrés

19

Un "support triplet" (que j'ai compensé pour ce défi) est l'un des suivants:

(...+...)
[...:...]
{...|...}
<...-...>

Une chaîne de crochets triplet équilibrée (BTBS pour faire court) est soit une chaîne vide, deux BTBS concaténés, soit l'un des crochets de triplet ci-dessus, chacun étant ...remplacé par un BTBS.

Votre tâche consiste à écrire un programme ou une fonction qui vérifie si une chaîne composée uniquement (+)[:]{|}<->est équilibrée. Le code le plus court gagne.

Exemples

Votre programme doit retourner véridique pour les chaînes suivantes:

(+)(+)(+)
[[[:]:]:(+(+))]{<->|<(+)->[:]}(+)
<<<<<<<<<<<<->->->->->->->->->->->->
{|(+[:<-{|(+[:<->])}>])}
[[[:]:[:]]:[[:]:[:]]]
{[:](+)|<->{|}}[(+)<->:{|}(+)]

Votre programme doit renvoyer la falsification pour les chaînes suivantes:

:[
<|>
(+(+)
[:][:](+[[:]):]
{|{|{|(+{|{|{|}}}}}+)}[:]{|}
{{||}}
<<->-<->-<->>
[(+):((+)+)+(+(+))]
<<<<<->->->->->->
jimmy23013
la source
Est (|)valide. Je ne pense pas, mais je ne suis pas sûr
Roman Gräf
@ RomanGräf Non, comme <|>dans les exemples de falsification.
jimmy23013

Réponses:

1

Japt, 25 octets

!Ue"%(%+%)|%[:]|\{%|}|<->

Testez-le en ligne!

eon strings est une fonction de remplacement récursif. Le deuxième paramètre par défaut est la chaîne vide, ce qui signifie que cela supprime récursivement les correspondances de l'expression "%(%+%)|%[:]|\{%|}|<->"régulière Japt (en termes réguliers, /\(\+\)|\[:]|{\|}|<->/). Cela renvoie une chaîne vide pour les chaînes triplet équilibrées et une chaîne non vide pour les chaînes non équilibrées, donc la valeur de retour correcte est le NON logique de cela.

ETHproductions
la source
14

JavaScript (ES6), 77 58 57 56 octets

f=s=>s==(s=s.replace(/\(\+\)|\[:]|{\|}|<->/,''))?!s:f(s)

Cas de test

Arnauld
la source
2
La même idée dans Retina est de 26 octets (la première ligne en fait juste une suite de tests): retina.tryitonline.net/…
Martin Ender
1
Et 39 avec perl: perl -lpe 's/<->|\(\+\)|{\|}|\[:]//&&redo;$_=!$_'.
Dada
@Dada Cela considérera 0un BTBS. Utilisez ce 38 à la place:perl -pe 's/<->|\(\+\)|{\|}|\[:]//&&redo;$_=/^$/'
Ton Hospel
@TonHospel Je n'ai pas pensé à ça, en effet .. merci de l'avoir signalé! (n'hésitez pas à le poster si vous le souhaitez, ou du moins ne vous retenez pas à cause de moi)
Dada
Ce mélange S / S était légèrement déroutant, peut f=s=>s==(s=s.replace(...))?!s:f(s)- être ?
Neil
5

sed, 28 27 octets

:
s#(+)\|\[:]\|{|}\|<->##
t

sed n'a pas de concept de vérité / fausse, donc je considère une chaîne vide véridique et une fausse chaîne non vide. Cela vérifie si nous considérons le conditionnel /^$/.

Merci à @Neil d'avoir joué au golf sur 1 octet!

Essayez-le en ligne!

Dennis
la source
1
Pour une fois, le BRE est en fait un avantage .
Dennis
Avez-vous besoin de \]ou ]suffit-il?
Neil
Je ne. Merci!
Dennis
4

Python, 77 octets

lambda s:eval("s"+".replace('%s','')"*4%('(+)','[:]','{|}','<->')*len(s))==''

Utilise l'idée de remplacement d'Arnauld . Génère et évalue une longue chaîne comme

s.replace('(+)','').replace('[:]','').replace('{|}','').replace('<->','').replace('(+)','').replace('[:]','').replace('{|}','').replace('<->','')

pour basculer entre le remplacement de tous les types de supports. Ensuite, vérifie si le résultat est la chaîne vide.

xnor
la source
3

Mathematica, 55 octets

StringDelete["(+)"|"[:]"|"{|}"|"<->"]~FixedPoint~#==""&

Fonction anonyme. Prend une chaîne en entrée et retourne Trueou Falseen sortie. Utilise la méthode standard pour ce faire.

LegionMammal978
la source
2

Grime , 39 octets

e`\(_\+_\)|\[_\:_\]|\{_\|_\}|\<_\-_\>v*

Essayez-le en ligne! Malheureusement, la version TIO manque de mémoire sur la plupart des cas de test.

Explication

Rien d'extraordinaire ici. _est un raccourci pour l'ensemble du modèle et v*est identique à *, mais avec une priorité inférieure.

e`                                       Match entire input against this pattern:
  \(_\+_\)                               '(', match of _, '+', match of _, ')'
          |                              or
           \[_\:_\]|\{_\|_\}|\<_\-_\>    same for the other bracket types
                                     v*  repeated 0-∞ times
Zgarb
la source
2

J, 48 octets

a:=([:delstring&.>/'(+)';'[:]';'{|}';'<->';])^:_

Semblable aux autres, cela est également basé sur la méthode d'Arnauld .

Usage

   f =: a:=([:delstring&.>/'(+)';'[:]';'{|}';'<->';])^:_
   f '(+)(+)(+)'
1
   f '[[[:]:]:(+(+))]{<->|<(+)->[:]}(+)'
1
   f '<<<<<<<<<<<<->->->->->->->->->->->->'
1
   f '<|>'
0
   f '[:][:](+[[:]):]'
0
   f '{|{|{|(+{|{|{|}}}}}+)}[:]{|}'
0

Explication

a:=([:delstring&.>/'(+)';'[:]';'{|}';'<->';])^:_  Input: string S
   (                                        )^:_  Repeat until convergence
                                         ]          Get S
                 '(+)';'[:]';'{|}';'<->';           Append to ['(+)', '[:]', '{|}', '<->']
    [:delstring&.>/                                 Reduce right-to-left by deleting
                                                    occurrences of each string on the
                                                    left from the right
                                                    Return the final string as the new S
a:=                                               Test if the final value of S is empty
miles
la source
0

Scala, 96 octets

def&(s:String):Any={val t=s.replaceAll(raw"\(\+\)|\[:]|\{\|}|<->","")
if(t==s)t.size<1 else&(t)}

C'est fondamentalement la même idée que les autres réponses, mais avec un passe-partout scala.

sans voler les idées des autres (188 octets):

import scala.util.parsing.combinator._
val a = new RegexParsers{def r:Parser[_]="("~r~"+"~r~")"|"["~r~":"~r~"]"|"{"~r~"|"~r~"}"|"<"~r~"-"~r~">"|""
def!(s:String)= !parseAll(r,s).isEmpty}!_
corvus_192
la source
0

Pip , 26 octets

L#aaR:"(+)[:]{|}<->"<>3x!a

Essayez-le en ligne!

Boucle len (a) fois, remplaçant toutes les occurrences de crochets de triplets vides ( "(+)[:]{|}<->"<>3, où <>est l'opérateur "groupe", => ["(+)"; "[:]"; "{|}"; "<->"]) par une chaîne vide ( x). Ce nombre d'itérations est exagéré, mais ce sera toujours plus que suffisant pour réduire complètement à néant tous les supports de triplets correctement formés. Une fois la boucle terminée, affiche !a: 0si aest véridique (a encore quelques caractères), 1si aest falsey (vide).

DLosc
la source