¡Esta pregunta es el segundo de varios desafíos de cumpleaños de Brain-flak diseñados para celebrar el primer cumpleaños de Brain-Flak! Puede encontrar más información sobre el cumpleaños de Brain-Flak aquí
Desafío
Para este desafío, generará todas las cadenas totalmente coincidentes a partir de una lista de paréntesis. Para tomar prestada la definición de DJMcMayhem de una cadena totalmente coincidente:
Para el propósito de este desafío, un "paréntesis" es cualquiera de estos caracteres:
()[]{}<>.Un par de paréntesis se considera "coincidente" si los paréntesis 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 coincide.
[()()()()] {<[]>} (()())Los subelementos también se pueden anidar en varias capas de profundidad.
[(){<><>[()]}<>()] <[{((()))}]>Una cadena se considera "Totalmente coincidente" si y solo si cada par de corchetes tiene el corchete de apertura y cierre correcto en el orden correcto.
Entrada
Su programa o función tomará una lista de cuatro números no negativos en cualquier formato conveniente y consistente. Esto incluye (pero no se limita a) una lista de enteros, una cadena delimitada sin dígitos o argumentos separados. Estos cuatro números representan el número de pares coincidentes de cada tipo de paréntesis. Por ejemplo, [1,2,3,4]representaría:
1 par de
()2 pares de
{}3 pares de
[]y4 pares de
<>
Puede elegir a qué par de paréntesis corresponde cada entrada, siempre que sea coherente.
Salida
Debe generar todas las cadenas totalmente coincidentes que se pueden formar a partir de esta lista de corchetes sin duplicados. La salida puede estar en cualquier formato razonable que incluya la impresión de una cadena delimitada sin corchetes en STDOUT, o una lista de cadenas como valor de retorno de una función.
Su algoritmo debe funcionar para cualquier entrada arbitraria, pero no necesita preocuparse por los límites de memoria, tiempo o tamaño entero (por ejemplo, si su respuesta está en C, no obtendrá 2 33 como entrada).
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Ejemplo de entrada y salida
Para este ejemplo, usaré el mismo orden de entrada que el anterior.
Para cada ejemplo, se ingresará la primera línea y las siguientes serán la salida.
Example 0:
[0,0,0,0]
Example 1:
[1,0,0,0]
()
Example 2:
[0,2,0,0]
{}{}
{{}}
Example 3:
[0,0,1,1]
[]<>
[<>]
<[]>
<>[]
Example 4:
[0,1,2,0]
{}[][] {}[[]] {[]}[] {[][]} {[[]]}
[{}][] [{}[]] [{[]}] []{}[] []{[]}
[][{}] [][]{} [[{}]] [[]{}] [[]]{}
Example 5:
[1,0,0,3]
()<><><> ()<><<>> ()<<>><> ()<<><>> ()<<<>>> (<>)<><> (<>)<<>>
(<><>)<> (<><><>) (<><<>>) (<<>>)<> (<<>><>) (<<><>>) (<<<>>>)
<()><><> <()><<>> <()<>><> <()<><>> <()<<>>> <(<>)><> <(<>)<>>
<(<><>)> <(<<>>)> <>()<><> <>()<<>> <>(<>)<> <>(<><>) <>(<<>>)
<><()><> <><()<>> <><(<>)> <><>()<> <><>(<>) <><><()> <><><>()
<><<()>> <><<>()> <><<>>() <<()>><> <<()><>> <<()<>>> <<(<>)>>
<<>()><> <<>()<>> <<>(<>)> <<>>()<> <<>>(<>) <<>><()> <<>><>()
<<><()>> <<><>()> <<><>>() <<<()>>> <<<>()>> <<<>>()> <<<>>>()
Example 6:
[1,1,1,1]
(){}[]<> (){}[<>] (){}<[]> (){}<>[] (){[]}<> (){[]<>} (){[<>]}
(){<[]>} (){<>}[] (){<>[]} ()[{}]<> ()[{}<>] ()[{<>}] ()[]{}<>
()[]{<>} ()[]<{}> ()[]<>{} ()[<{}>] ()[<>{}] ()[<>]{} ()<{}[]>
()<{}>[] ()<{[]}> ()<[{}]> ()<[]{}> ()<[]>{} ()<>{}[] ()<>{[]}
()<>[{}] ()<>[]{} ({})[]<> ({})[<>] ({})<[]> ({})<>[] ({}[])<>
({}[]<>) ({}[<>]) ({}<[]>) ({}<>)[] ({}<>[]) ({[]})<> ({[]}<>)
({[]<>}) ({[<>]}) ({<[]>}) ({<>})[] ({<>}[]) ({<>[]}) ([{}])<>
([{}]<>) ([{}<>]) ([{<>}]) ([]){}<> ([]){<>} ([])<{}> ([])<>{}
([]{})<> ([]{}<>) ([]{<>}) ([]<{}>) ([]<>){} ([]<>{}) ([<{}>])
([<>{}]) ([<>]){} ([<>]{}) (<{}[]>) (<{}>)[] (<{}>[]) (<{[]}>)
(<[{}]>) (<[]{}>) (<[]>){} (<[]>{}) (<>){}[] (<>){[]} (<>)[{}]
(<>)[]{} (<>{})[] (<>{}[]) (<>{[]}) (<>[{}]) (<>[]){} (<>[]{})
{()}[]<> {()}[<>] {()}<[]> {()}<>[] {()[]}<> {()[]<>} {()[<>]}
{()<[]>} {()<>}[] {()<>[]} {([])}<> {([])<>} {([]<>)} {([<>])}
{(<[]>)} {(<>)}[] {(<>)[]} {(<>[])} {}()[]<> {}()[<>] {}()<[]>
{}()<>[] {}([])<> {}([]<>) {}([<>]) {}(<[]>) {}(<>)[] {}(<>[])
{}[()]<> {}[()<>] {}[(<>)] {}[]()<> {}[](<>) {}[]<()> {}[]<>()
{}[<()>] {}[<>()] {}[<>]() {}<()[]> {}<()>[] {}<([])> {}<[()]>
{}<[]()> {}<[]>() {}<>()[] {}<>([]) {}<>[()] {}<>[]() {[()]}<>
{[()]<>} {[()<>]} {[(<>)]} {[]()}<> {[]()<>} {[](<>)} {[]}()<>
{[]}(<>) {[]}<()> {[]}<>() {[]<()>} {[]<>()} {[]<>}() {[<()>]}
{[<>()]} {[<>]()} {[<>]}() {<()[]>} {<()>}[] {<()>[]} {<([])>}
{<[()]>} {<[]()>} {<[]>()} {<[]>}() {<>()}[] {<>()[]} {<>([])}
{<>}()[] {<>}([]) {<>}[()] {<>}[]() {<>[()]} {<>[]()} {<>[]}()
[(){}]<> [(){}<>] [(){<>}] [()]{}<> [()]{<>} [()]<{}> [()]<>{}
[()<{}>] [()<>{}] [()<>]{} [({})]<> [({})<>] [({}<>)] [({<>})]
[(<{}>)] [(<>){}] [(<>)]{} [(<>{})] [{()}]<> [{()}<>] [{()<>}]
[{(<>)}] [{}()]<> [{}()<>] [{}(<>)] [{}]()<> [{}](<>) [{}]<()>
[{}]<>() [{}<()>] [{}<>()] [{}<>]() [{<()>}] [{<>()}] [{<>}()]
[{<>}]() [](){}<> [](){<>} []()<{}> []()<>{} []({})<> []({}<>)
[]({<>}) [](<{}>) [](<>){} [](<>{}) []{()}<> []{()<>} []{(<>)}
[]{}()<> []{}(<>) []{}<()> []{}<>() []{<()>} []{<>()} []{<>}()
[]<(){}> []<()>{} []<({})> []<{()}> []<{}()> []<{}>() []<>(){}
[]<>({}) []<>{()} []<>{}() [<(){}>] [<()>{}] [<()>]{} [<({})>]
[<{()}>] [<{}()>] [<{}>()] [<{}>]() [<>(){}] [<>()]{} [<>({})]
[<>{()}] [<>{}()] [<>{}]() [<>](){} [<>]({}) [<>]{()} [<>]{}()
<(){}[]> <(){}>[] <(){[]}> <()[{}]> <()[]{}> <()[]>{} <()>{}[]
<()>{[]} <()>[{}] <()>[]{} <({})[]> <({})>[] <({}[])> <({[]})>
<([{}])> <([]){}> <([])>{} <([]{})> <{()}[]> <{()}>[] <{()[]}>
<{([])}> <{}()[]> <{}()>[] <{}([])> <{}[()]> <{}[]()> <{}[]>()
<{}>()[] <{}>([]) <{}>[()] <{}>[]() <{[()]}> <{[]()}> <{[]}()>
<{[]}>() <[(){}]> <[()]{}> <[()]>{} <[({})]> <[{()}]> <[{}()]>
<[{}]()> <[{}]>() <[](){}> <[]()>{} <[]({})> <[]{()}> <[]{}()>
<[]{}>() <[]>(){} <[]>({}) <[]>{()} <[]>{}() <>(){}[] <>(){[]}
<>()[{}] <>()[]{} <>({})[] <>({}[]) <>({[]}) <>([{}]) <>([]){}
<>([]{}) <>{()}[] <>{()[]} <>{([])} <>{}()[] <>{}([]) <>{}[()]
<>{}[]() <>{[()]} <>{[]()} <>{[]}() <>[(){}] <>[()]{} <>[({})]
<>[{()}] <>[{}()] <>[{}]() <>[](){} <>[]({}) <>[]{()} <>[]{}()

Respuestas:
Haskell , 128 bytes
fes la función principal, toma una lista deIntsy devuelve una lista deStrings.Pruébalo en línea!
Cómo funciona
ftransforma su lista de entrada en una lista de listas de tuplas, cada tupla contiene un par de paréntesis, con cada tipo de paréntesis en su propia sublista. Por ejemplo, se[1,2,0,0]convierte[[('{','}')],[('[',']'),('[',']')]]. Luego llamagcon la lista transformada.ctoma una listalde las listas de tuplas de paréntesis restantes y devuelve una lista de posibles cadenas para que tengan como sufijo lo que ya se ha generado.g lgenera la lista de cadenas totalmente coincidentes formables mediante el uso de todos los corchetesl.l#ga generar cadenas que comienzan con un paréntesis. Elgparámetro recursivo se utiliza como continuación por#para generar lo que viene después del primer subelemento entre corchetes.lno tiene corchetes dentro), en suglugar[""], la lista contiene solo la cadena vacía. Debido a que[""]compara listas más pequeñas con todas las no producibles#, podemos hacerlo aplicandomax.l#cgenera cadenas desde ellprincipio con al menos un subelemento entre corchetes, dejando a la continuacióncpara determinar qué sigue al elemento.byeson un par de paréntesis seleccionados en la tuplax, yres la lista de tuplas restantes del mismo tipo de paréntesis.r:filter(/=x:r)leslcon la tuplaxeliminada, ligeramente reorganizada.?se llama para generar los subelementos posibles entrebye. Obtiene su propia continuaciónmap(e:).c, que prefijaea cada una de las cadenas de sufijo generadas porc.#antecede la inicialba todas las cadenas generadas por?yc.l?cgenera las cadenas totalmente coincidentes formables mediante el uso de cero o más pares de paréntesisl, y luego deja su continuacióncpara manejar lo que queda. Lac lparte va directamente acsin agregar ningún subelemento, mientras que sel#(?c)usa#para generar un subelemento y luego llama(?c)recursivamente para posibles más.fuente
Jalea ,
50 4034 bytes-6 bytes gracias a Leaky Nun (reduciéndome al trabajo donde no podía)
Llano e ineficiente.
Pruébalo en línea!(tiempo de espera en TIO para [1,1,1,1] - sí, ineficiente)
¿Cómo?
Elimina recursivamente pares de corchetes coincidentes que residen uno al lado del otro hasta que no se puedan quitar más por cada posible cadena que se pueda formar, manteniendo tales cadenas que se reducen a nada (por lo tanto, tienen todo el contenido coincidente).
fuente
œṣ...F-µÐLen un problema de alguna manera relacionado .Pyth -
83747163 bytesIntentalo
1 : Kc "[] {} () <>") Fd {.ps * VR \ KQJdVldFHK =: JHk)) I! Jd
Además, esta versión de 53 bytes gracias a Leaky Nun
aquí
fuente
("\[]""{}""\(\)""<>"), lo hacemosc"\[] \{} \(\) <>")(dividir en espacios en blanco); en lugar de:@Kd*\\2k, seguimos-@Kddos barras invertidas; entonces, en lugar de mapearU4, lo hacemos*V-R\\KQ(multiplicamos dos matrices en paralelo). La primera matriz se genera usandoR, a saber,-R\\kEsto le dará una versión de 54 bytes05AB1E ,
3332302725 bytesGuardado 7 bytes gracias a Riley .
El orden de entrada es
[(),<>,[],{}]Pruébalo en línea!
Explicación
fuente
:vectoriza (puede omitir la mayor parte del bucle infinito). 2. Es 1 bytes más corto para usarUXal principio yXcuando necesita la lista de corchetes nuevamente.:primero, pero tenemos problemas cuando, por ejemplo, los reemplazos{}crean posibles reemplazos()ya que ya hemos intentado reemplazar todos(). Buen punto sobreUXsin embargo. También podemos obtener otro byte©®.Uaparezca la cima siempre fue frustrante. No sabía acerca©®.[([]{})<{[()<()>]}()>{}], pero no para[({})<{[()<()>]}()>{}]. La única diferencia es la eliminada[]. Lo preguntaré en TNB.Ruby , 123 bytes
Pruébalo en línea!Sin embargo, es ineficiente, por lo que incluso las entradas como
[1,2,1,1]se agotarán en línea. ¡Todos los ejemplos enumerados funcionarán, al menos!Explicación
fuente