Soportes triples equilibrados

19

Un "soporte de triplete" (que inventé para este desafío) es uno de los siguientes:

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

Una cadena de corchetes triples equilibrada (BTBS para abreviar) es una cadena vacía, dos BTBS concatenados o uno de los corchetes ...triples anteriores, cada uno reemplazado por un BTBS.

Su tarea es escribir un programa o función que verifique si una cadena que consta de solo (+)[:]{|}<->está equilibrada. El código más corto gana.

Ejemplos

Su programa debe devolver la verdad para las siguientes cadenas:

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

Su programa debe devolver falsedad para las siguientes cadenas:

:[
<|>
(+(+)
[:][:](+[[:]):]
{|{|{|(+{|{|{|}}}}}+)}[:]{|}
{{||}}
<<->-<->-<->>
[(+):((+)+)+(+(+))]
<<<<<->->->->->->
jimmy23013
fuente
Es (|)valido. No lo creo, pero no estoy seguro
Roman Gräf
@ RomanGräf No, como <|>en los ejemplos falsos.
jimmy23013

Respuestas:

1

Japt, 25 bytes

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

¡Pruébalo en línea!

een cadenas es una función de reemplazo recursivo. El segundo parámetro predeterminado es la cadena vacía, lo que significa que esto elimina recursivamente las coincidencias de la expresión regular de Japt "%(%+%)|%[:]|\{%|}|<->"(en términos regulares /\(\+\)|\[:]|{\|}|<->/). Esto devuelve una cadena vacía para cadenas de triplete balanceadas y una cadena no vacía para cadenas no balanceadas, por lo que el valor de retorno correcto es el NOT lógico de esto.

ETHproducciones
fuente
14

JavaScript (ES6), 77 58 57 56 bytes

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

Casos de prueba

Arnauld
fuente
2
La misma idea en Retina es de 26 bytes (la primera línea lo convierte en un conjunto de pruebas): retina.tryitonline.net/…
Martin Ender
1
Y 39 con el Perl: perl -lpe 's/<->|\(\+\)|{\|}|\[:]//&&redo;$_=!$_'.
Dada
@Dada Eso considerará 0un BTBS. Use este 38 en su lugar:perl -pe 's/<->|\(\+\)|{\|}|\[:]//&&redo;$_=/^$/'
Ton Hospel
@TonHospel No pensé en eso, de hecho ... ¡gracias por señalarlo! (siéntase libre de publicarlo si lo desea, o al menos no se detenga por mí)
Dada
¿Esa mezcla S / s fue un poco confusa, tal vez f=s=>s==(s=s.replace(...))?!s:f(s)?
Neil
5

sed, 28 27 bytes

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

sed no tiene un concepto de verdad / falsedad, así que estoy considerando una cadena vacía de verdad y una cadena no vacía de falsedad. Esto verifica si consideramos el condicional /^$/.

¡Gracias a @Neil por jugar golf en 1 byte!

Pruébalo en línea!

Dennis
fuente
1
Por una vez, BRE es realmente una ventaja .
Dennis
¿Necesita \]o es ]suficiente?
Neil
Yo no. ¡Gracias!
Dennis
4

Python, 77 bytes

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

Utiliza la idea de reemplazo de Arnauld . Genera y evalúa una cadena larga como

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

para alternar entre la sustitución de todos los tipos de soporte. Luego, verifica si el resultado es la cadena vacía.

xnor
fuente
3

Mathematica, 55 bytes

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

Función anónima. Toma una cadena como entrada y devuelve Trueo Falsecomo salida. Utiliza el método estándar para hacer esto.

LegionMammal978
fuente
2

Grime , 39 bytes

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

Pruébalo en línea! Lamentablemente, la versión TIO se queda sin memoria en la mayoría de los casos de prueba.

Explicación

Nada muy lujoso aquí. _es una forma abreviada de todo el patrón, y v*es igual que *, pero con menor prioridad.

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

J, 48 bytes

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

Al igual que los demás, esto también se basa en el método de Arnauld .

Uso

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

Explicación

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
millas
fuente
0

Scala, 96 bytes

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

Esta es básicamente la misma idea que las otras respuestas, pero con un poco de escala scala.

sin robar ideas de otros (188 bytes):

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
fuente
0

Pip , 26 bytes

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

Pruébalo en línea!

Bucles len (a) veces, reemplazando todas las apariciones de corchetes triples vacíos ( "(+)[:]{|}<->"<>3, donde <>está el operador "grupo", => ["(+)"; "[:]"; "{|}"; "<->"]) con una cadena vacía ( x). Esta cantidad de iteraciones es exagerada, pero siempre será más que suficiente para reducir completamente todos los corchetes de triplete correctamente formados a nada. Una vez que se completa el ciclo, sale !a: 0si aes verdadero (todavía tiene algunos caracteres), 1si aes falso (vacío).

DLosc
fuente