¡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
f
es la función principal, toma una lista deInt
sy devuelve una lista deString
s.Pruébalo en línea!
Cómo funciona
f
transforma 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 llamag
con la lista transformada.c
toma una listal
de 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 l
genera la lista de cadenas totalmente coincidentes formables mediante el uso de todos los corchetesl
.l#g
a generar cadenas que comienzan con un paréntesis. Elg
parámetro recursivo se utiliza como continuación por#
para generar lo que viene después del primer subelemento entre corchetes.l
no tiene corchetes dentro), en sug
lugar[""]
, 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#c
genera cadenas desde ell
principio con al menos un subelemento entre corchetes, dejando a la continuaciónc
para determinar qué sigue al elemento.b
ye
son un par de paréntesis seleccionados en la tuplax
, yr
es la lista de tuplas restantes del mismo tipo de paréntesis.r:filter(/=x:r)l
esl
con la tuplax
eliminada, ligeramente reorganizada.?
se llama para generar los subelementos posibles entreb
ye
. Obtiene su propia continuaciónmap(e:).c
, que prefijae
a cada una de las cadenas de sufijo generadas porc
.#
antecede la inicialb
a todas las cadenas generadas por?
yc
.l?c
genera las cadenas totalmente coincidentes formables mediante el uso de cero o más pares de paréntesisl
, y luego deja su continuaciónc
para manejar lo que queda. Lac l
parte va directamente ac
sin 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
-µÐL
en 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-@Kd
dos 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\\k
Esto 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 usarUX
al principio yX
cuando 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 sobreUX
sin embargo. También podemos obtener otro byte©®
.U
aparezca 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