Anexa o Precede? Depende

DJMcMayhem 04/29/2017. 6 answers, 427 views
code-golf string balanced-string classification brain-flak

Brain-flak cumple un año de edad mañana! En honor a su cumpleaños, tendremos una fiesta de cumpleaños estilo PPCG, donde varios usuarios publicarán preguntas relacionadas con brain-flak. ¡Ayúdanos a celebrar! :)


Brain-flak es un lenguaje esotérico que escribí donde todos los comandos son corchetes y todos los corchetes deben coincidir por completo. Para tomar prestada mi propia definición :

  • A los fines de este desafío, un "corchete" es cualquiera de estos caracteres: ()[]{}<> .

  • Un par de corchetes se considera "coincidente" si los corchetes de apertura y cierre están en el orden correcto y no tienen caracteres dentro de ellos, como

    ()
    []{} 

    O si cada subelemento dentro de él también se corresponde.

    [()()()()]
    {<[]>}
    (()()) 

    Los subelementos también se pueden anidar varias capas de profundidad.

    [(){<><>[()]}<>()]<[{((()))}]> 
  • Una cadena se considera "Completamente coincidente" si y solo si:

    1. Cada personaje es un soporte,

    2. Cada par de soportes tiene el soporte de apertura y cierre correcto y en el orden correcto

Para celebrar el primer cumpleaños de Brain Flak, el desafío de hoy es tomar un par de corchetes desequilibrados y determinar qué tipos de operaciones se necesitan para convertirlo en una falla cerebral válida.

  • Por ejemplo, (( no es un código de brain-flak válido, pero si lo adjuntamos )) , se convierte en (()) , que está completamente equilibrado y, por lo tanto, es válido como brain-flak. Eso hace que esta entrada sea appendable .

  • Del mismo modo, >} no es válido, pero podemos anteponer {< él para hacer {<>} , que es válido. Eso hace que esta entrada sea prependable .

  • Algunas entradas son un poco más complicadas. Por ejemplo, )][({ no se puede hacer válido simplemente añadiendo o anteponiendo. Pero se can hacer válido anteponiendo [( y añadiendo })] . Por lo tanto, esta entrada es a la vez prependable y prependable .

  • Por último, algunas entradas nunca pueden convertirse en código brain-flak válido por ninguna combinación de agregar o anteponer. Por ejemplo, (> nunca puede hacerse válido. (El preenpendir < crea <(> , y anexa ) crea (>) , ninguno de los cuales es válido) Por lo tanto, esta entrada no es appendable o confiable.

Para el desafío de hoy, debe escribir un programa o función que tome una cadena de corchetes y determine si la cadena es

appendable
prependable
both
neither 

Puede elegir qué valores usa para representar para cada caso. Por ejemplo, dar salida a 1, 2, 3, 4 o 'a', 'p', 'b', 'n' , o 1, 'foo', 3.1415, -17 , o lo que sea correcto. Mientras que cada salida sea distinct y consistent , está bien. Sin embargo, must especificar claramente qué salida corresponde a cada caso.

Puede devolver este valor en el formato que sea más conveniente (por ejemplo, regresar de una función, imprimir en STDOUT, modificar argumentos, escribir en un archivo, etc.).

Puede suponer que la entrada nunca será válida como brain-flak o vacía.

Ejemplos

Las siguientes entradas son todas prependable :

))
(((()()())))}
)>}]
()[]{}<>) 

Todos estos son appendable :

(({}{})
((((
([]()())(
{<<{ 

Estos son todos both :

))((
>()[(()){
>{ 

Y estos no son neither los neither :

)(}
{(((()()()))>[}
((((((((((>((((((((((<>()] 

Como de costumbre, esto es , por lo que se aplican vacíos estándar, ¡y la respuesta más corta en bytes gana!


Este desafío es particularmente difícil en brain-flak, por lo que el máximo brownie apunta a todas y cada una de las respuestas escritas en brain-flak. :)

5 Comments
1 Erik the Outgolfer 04/29/2017
maximum brownie points Creo que ofrecer puntos y galletas de brownie máximos alentaría a Brain-Flaking a este reto más que a los puntos de brownie, ya que no creo que sea trivial en any idioma, y ​​mucho menos Brain-Flak. :PAG
Jonathan Allan 04/29/2017
FYI: Las dos pruebas terminan con corchetes abiertos, todas las pruebas terminan con corchetes.
1 orlp 04/29/2017
Yo diría que 'ambos' es el término equivocado. Una cadena como ][ not es apta, ya que nada que pueda agregar puede hacerla válida. Del mismo modo, no es confiable. Es ... ¡insertable! Puede insertarlo en una cadena para hacer todo el Brainflak válido.
Funky Computer Man 04/30/2017
¿Ya hay cadenas balanceadas en ambos o ninguna de las dos?
DJMcMayhem 04/30/2017
@wheatwizard Las cadenas equilibradas no se darán como entrada. You can assume that the input will never be valid brain-flak or empty.

6 Answers


Jonathan Allan 04/29/2017.

Jelly , 33 32 37 35 34 bytes

error encontrado, arreglo horrible +5 bytes, mejor solución - 2 bytes, usando un truco de Adnan que vi aquí por -1 más.

“({[<“)}]>”Z;@WœṣF¥/µÐLO‘&2µIṀ>0ȯQ 

Valores devueltos:

prepends [2]
 appends [0]
    both [2,0]
 neither 1 

(La entrada inválida devuelve resultados espurios, aunque es válido Brain-flack, devuelve [] ).

Try it online! - un conjunto de pruebas (imprime representaciones mushed, por lo que 20 para [2,0] , e ignora las líneas que contienen cualquier - ).


Cows quack 04/29/2017.

Retina , 41 40 41 bytes

1 byte saved thanks to @MartinEnder

+`\(\)|\[]|{}|<>[]})>]+
1
\W+
0
...+
01 

¡Pruébalo en línea!

  • Predependiente es 1
  • Appendable es 0
  • Ambos son 10
  • Ninguno es 01

Edits

  • Obtuve 1 byte para corregir el error detectado por @Neil
5 comments
Martin Ender♦ 04/29/2017
[]})>] guarda un byte.
Cows quack 04/29/2017
@MininEnder ¡Ah, es porque los juegos de caracteres no pueden estar vacíos, gracias!
Neil 04/29/2017
Esto no funciona para todas las entradas no aptas, por ejemplo (][) . Creo que se puede arreglar a un costo de un byte cambiando 101 a ...+ .
Cows quack 04/29/2017
@Neil Gracias por notar el error, me pregunto si hay tales casos con Both también
Neil 04/29/2017
No, creo que 10 es la única combinación válida para Both .

Neil 04/29/2017.

Lote, 337 bytes

@echo off
set/ps=
:g
set "t=%s:<>=%
set "t=%t:()=%
set "t=%t:[]=%
set "t=%t:{}=%
if not "%t%"=="%s%" set "s=%t%"&goto g
set "s=%s:<=[%
set s=%s:>=]%
set s=%s:(=[%
set s=%s:)=]%
set s=%s:{=[%
set s=%s:}=]%
:l
if %s:~,2%==]] set s=%s:~1%&goto l
:r
if %s:~-2%==[[ set s=%s:~,-1%&goto l
if not _%s:~2%==_ set s=[]
echo %s% 

Salidas ] para anteponer, [ para agregar, ][ para ambos, [] para ninguno.


Ørjan Johansen 04/29/2017.

Haskell , 115 108 bytes

EDITAR:

  • -7 bytes: usa más guardias.
 (""#)
s#""=[s>"",1>0]
s#(c:d)|Just a<-lookup c$zip"([{<"")]}>"=(a:s)#d|(a:b)<-s=[1|a==c]>>b#d|0<1=take 1$s#d 

¡Pruébalo en línea!

Use like (""#) "))" . Los resultados se dan como:

 [False,True]: needs nothing
[False]: prependable
[True,True]: appendable
[True]: both
[]: neither 

Cómo funciona

  • La codificación de salida se elige de tal manera que la necesidad de anteponer se señaliza dejando caer el segundo elemento del resultado para el resto, si lo hay, mientras que una falta de coincidencia completa se señala cayendo todos ellos.
  • s#d analiza una cadena d restante, dada una cadena / pila de corchetes de cierre esperados.
    • La línea s#"" comprueba si se han encontrado todos los corchetes de cierre al final de la cadena, de lo contrario se necesita agregarlos.
    • La primera rama de s#(c:d) comprueba si el siguiente carácter c es un corchete de apertura, y si es así deja el corchete de cierre correspondiente en la pila para la recursión.
    • De lo contrario, si la pila contiene corchetes de cierre, la segunda rama verifica si la superior coincide con el siguiente carácter, y si no, devuelve una lista vacía en lugar de recursivo.
    • Por último, en la última rama, la pila está vacía y tenemos un paréntesis de cierre inigualable que puede corregirse antes de recurrir.

ETHproductions 04/29/2017.

Japt , 44 bytes

=Ue"%(%)|%[]|\{}|<>" ®c -1&2|1})f31 |UfD |Ug 

Salidas 1 para prefabricado, 3 para anexable, 13 para ambos y 31 para ninguno.

Pruébalo en línea! o Verifique todos los casos de prueba a la vez.

Cómo funciona

=Ue"%(%)|%[]|\{}|<>" ®   c -1&2|1})f31 |UfD |Ug
U=Ue"%(%)|%[]|\{}|<>" mZ{Zc -1&2|1})f31 |UfD |Ug

                    // "(((()()())))}"  "([({}{})"    ">()[(()){"  "((((<>()]"
Ue"%(%)|%[]|\{}|<>" // Recursively remove all instances of "()", "[]", "{}", and "<>" from U.
                    // "}"              "(["          ">[{"        "((((]"
mZ{Zc -1&2|1}       // Replace each char Z with (Z.charCodeAt() - 1) & 2 | 1.
                    // "1"              "33"          "133"        "33331"
U=                  // Save the result in U.
f31 |UfD |Ug        // Match all instances of "31" and "13" (D = 13) and bitwise-OR the results with the first char.
                    // null|null|1      null|null|3   null|13|1    31|null|3
                    // 1                3             13           31
                    // Implicit: output result of last expression 

Jörg Hülsermann 06/04/2017.

PHP, 137 Bytes

for($c=1;$c;)$a=preg_replace("#<>|\(\)|\[\]|\{\}#","",$a=&$argn,-1,$c);echo($a=preg_replace(["#[]})>]+#","#[[{(<]+#"],[1,2],$a))<13?$a:0; 

1 => apilable,

2 => prependable,

12 => ambos,

0 => ninguno

Casos de prueba

2 comments
Cyoce 06/04/2017
"Siempre que cada salida sea distinta y consistent, está bien". Esto no parece tener un valor constante para ninguno de los dos.
Jörg Hülsermann 06/04/2017
@Cyoce ahora está arreglado

Related questions

Hot questions

Language

Popular Tags