Esta pergunta é o segundo de vários desafios do aniversário do Brain-flak, projetados para comemorar o primeiro aniversário do Brain-Flak! Você pode encontrar mais informações sobre o aniversário de Brain-Flak aqui
Desafio
Para esse desafio, você estará gerando todas as seqüências totalmente correspondentes a partir de uma lista de colchetes. Para emprestar a definição de DJMcMayhem de uma sequência totalmente correspondente:
Para o propósito deste desafio, um "suporte" é qualquer um desses caracteres:
()[]{}<>
.Um par de colchetes é considerado "correspondente" se os colchetes de abertura e fechamento estiverem na ordem correta e não tiverem caracteres dentro deles, como
() []{}
Ou se todos os subelementos dentro dele também corresponderem.
[()()()()] {<[]>} (()())
Os subelementos também podem ser aninhados com várias camadas de profundidade.
[(){<><>[()]}<>()] <[{((()))}]>
Uma string é considerada "Totalmente correspondida" se, e somente se, cada par de colchetes tiver o colchete de abertura e fechamento correto na ordem correta.
Entrada
Seu programa ou função fará uma lista de quatro números não negativos em qualquer formato conveniente e consistente. Isso inclui (mas não está limitado a) uma lista de números inteiros, uma sequência delimitada por não dígitos ou argumentos separados. Esses quatro números representam o número de pares correspondentes de cada tipo de colchete. Por exemplo, [1,2,3,4]
representaria:
1 par de
()
2 pares de
{}
3 pares de
[]
e4 pares de
<>
Você pode escolher qual par de colchetes cada entrada corresponde, desde que seja consistente.
Resultado
Você deve gerar todas as seqüências totalmente correspondentes que podem ser formadas a partir desta lista de colchetes sem duplicatas. A saída pode estar em qualquer formato razoável, que inclua a impressão de uma string delimitada sem colchetes em STDOUT ou uma lista de strings como valor de retorno de uma função.
Seu algoritmo deve funcionar para qualquer entrada arbitrária, mas você não precisa se preocupar com limites de tamanho de memória, tempo ou número inteiro (por exemplo, se sua resposta estiver em C, você não receberá 2 33 como entrada).
Isso é código-golfe , então a resposta mais curta em bytes vence.
Exemplo de entrada e saída
Neste exemplo, usarei a mesma ordem de entrada que acima.
Para cada exemplo, a primeira linha será inserida e as seguintes linhas serão a saída
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]
(){}[]<> (){}[<>] (){}<[]> (){}<>[] (){[]}<> (){[]<>} (){[<>]}
(){<[]>} (){<>}[] (){<>[]} ()[{}]<> ()[{}<>] ()[{<>}] ()[]{}<>
()[]{<>} ()[]<{}> ()[]<>{} ()[<{}>] ()[<>{}] ()[<>]{} ()<{}[]>
()<{}>[] ()<{[]}> ()<[{}]> ()<[]{}> ()<[]>{} ()<>{}[] ()<>{[]}
()<>[{}] ()<>[]{} ({})[]<> ({})[<>] ({})<[]> ({})<>[] ({}[])<>
({}[]<>) ({}[<>]) ({}<[]>) ({}<>)[] ({}<>[]) ({[]})<> ({[]}<>)
({[]<>}) ({[<>]}) ({<[]>}) ({<>})[] ({<>}[]) ({<>[]}) ([{}])<>
([{}]<>) ([{}<>]) ([{<>}]) ([]){}<> ([]){<>} ([])<{}> ([])<>{}
([]{})<> ([]{}<>) ([]{<>}) ([]<{}>) ([]<>){} ([]<>{}) ([<{}>])
([<>{}]) ([<>]){} ([<>]{}) (<{}[]>) (<{}>)[] (<{}>[]) (<{[]}>)
(<[{}]>) (<[]{}>) (<[]>){} (<[]>{}) (<>){}[] (<>){[]} (<>)[{}]
(<>)[]{} (<>{})[] (<>{}[]) (<>{[]}) (<>[{}]) (<>[]){} (<>[]{})
{()}[]<> {()}[<>] {()}<[]> {()}<>[] {()[]}<> {()[]<>} {()[<>]}
{()<[]>} {()<>}[] {()<>[]} {([])}<> {([])<>} {([]<>)} {([<>])}
{(<[]>)} {(<>)}[] {(<>)[]} {(<>[])} {}()[]<> {}()[<>] {}()<[]>
{}()<>[] {}([])<> {}([]<>) {}([<>]) {}(<[]>) {}(<>)[] {}(<>[])
{}[()]<> {}[()<>] {}[(<>)] {}[]()<> {}[](<>) {}[]<()> {}[]<>()
{}[<()>] {}[<>()] {}[<>]() {}<()[]> {}<()>[] {}<([])> {}<[()]>
{}<[]()> {}<[]>() {}<>()[] {}<>([]) {}<>[()] {}<>[]() {[()]}<>
{[()]<>} {[()<>]} {[(<>)]} {[]()}<> {[]()<>} {[](<>)} {[]}()<>
{[]}(<>) {[]}<()> {[]}<>() {[]<()>} {[]<>()} {[]<>}() {[<()>]}
{[<>()]} {[<>]()} {[<>]}() {<()[]>} {<()>}[] {<()>[]} {<([])>}
{<[()]>} {<[]()>} {<[]>()} {<[]>}() {<>()}[] {<>()[]} {<>([])}
{<>}()[] {<>}([]) {<>}[()] {<>}[]() {<>[()]} {<>[]()} {<>[]}()
[(){}]<> [(){}<>] [(){<>}] [()]{}<> [()]{<>} [()]<{}> [()]<>{}
[()<{}>] [()<>{}] [()<>]{} [({})]<> [({})<>] [({}<>)] [({<>})]
[(<{}>)] [(<>){}] [(<>)]{} [(<>{})] [{()}]<> [{()}<>] [{()<>}]
[{(<>)}] [{}()]<> [{}()<>] [{}(<>)] [{}]()<> [{}](<>) [{}]<()>
[{}]<>() [{}<()>] [{}<>()] [{}<>]() [{<()>}] [{<>()}] [{<>}()]
[{<>}]() [](){}<> [](){<>} []()<{}> []()<>{} []({})<> []({}<>)
[]({<>}) [](<{}>) [](<>){} [](<>{}) []{()}<> []{()<>} []{(<>)}
[]{}()<> []{}(<>) []{}<()> []{}<>() []{<()>} []{<>()} []{<>}()
[]<(){}> []<()>{} []<({})> []<{()}> []<{}()> []<{}>() []<>(){}
[]<>({}) []<>{()} []<>{}() [<(){}>] [<()>{}] [<()>]{} [<({})>]
[<{()}>] [<{}()>] [<{}>()] [<{}>]() [<>(){}] [<>()]{} [<>({})]
[<>{()}] [<>{}()] [<>{}]() [<>](){} [<>]({}) [<>]{()} [<>]{}()
<(){}[]> <(){}>[] <(){[]}> <()[{}]> <()[]{}> <()[]>{} <()>{}[]
<()>{[]} <()>[{}] <()>[]{} <({})[]> <({})>[] <({}[])> <({[]})>
<([{}])> <([]){}> <([])>{} <([]{})> <{()}[]> <{()}>[] <{()[]}>
<{([])}> <{}()[]> <{}()>[] <{}([])> <{}[()]> <{}[]()> <{}[]>()
<{}>()[] <{}>([]) <{}>[()] <{}>[]() <{[()]}> <{[]()}> <{[]}()>
<{[]}>() <[(){}]> <[()]{}> <[()]>{} <[({})]> <[{()}]> <[{}()]>
<[{}]()> <[{}]>() <[](){}> <[]()>{} <[]({})> <[]{()}> <[]{}()>
<[]{}>() <[]>(){} <[]>({}) <[]>{()} <[]>{}() <>(){}[] <>(){[]}
<>()[{}] <>()[]{} <>({})[] <>({}[]) <>({[]}) <>([{}]) <>([]){}
<>([]{}) <>{()}[] <>{()[]} <>{([])} <>{}()[] <>{}([]) <>{}[()]
<>{}[]() <>{[()]} <>{[]()} <>{[]}() <>[(){}] <>[()]{} <>[({})]
<>[{()}] <>[{}()] <>[{}]() <>[](){} <>[]({}) <>[]{()} <>[]{}()
Respostas:
Haskell , 128 bytes
f
é a função principal, pega uma lista de seInt
retorna uma lista deString
s.Experimente online!
Como funciona
f
transforma sua lista de entrada em uma lista de listas de tuplas, cada uma contendo uma par de colchetes, com cada tipo de colchete em sua própria sub-lista. Por exemplo,[1,2,0,0]
torna-se[[('{','}')],[('[',']'),('[',']')]]
. Em seguida, ele chamag
com a lista transformada.c
pega uma listal
de listas de tupla de colchete restantes e retorna uma lista de possíveis strings a serem sufixadas no que já foi gerado.g l
gera a lista de seqüências de caracteres totalmente correspondentes, configuráveis usando todos os colchetesl
.l#g
para gerar strings começando com algum colchete. Og
próprio parâmetro recursivo é usado como uma continuação de#
, para gerar o que vem após o primeiro subelemento entre colchetes.l
não há colchetes dentro), emg
vez disso[""]
, a lista contém apenas a cadeia vazia. Como[""]
compara menor a todas as listas não vazias produzíveis por#
, podemos fazer isso aplicandomax
.l#c
gera sequências dol
início com pelo menos um subelemento entre colchetes, deixando a continuaçãoc
para determinar o que segue o elemento.b
ee
são um par selecionado de colchetes na tuplax
er
é a lista de tuplas restantes do mesmo tipo de colchete.r:filter(/=x:r)l
él
com a tuplax
removida, ligeiramente reorganizada.?
é chamado para gerar os possíveis subelementos entreb
ee
. Ele obtém sua própria continuaçãomap(e:).c
, que prefixae
cada uma das cadeias de sufixos geradas porc
.#
em si precede a inicialb
a todas as seqüências geradas por?
ec
.l?c
gera as seqüências de caracteres totalmente correspondentes configuráveis usando zero ou mais pares de colchetes del
e, em seguida, deixa a continuaçãoc
para lidar com o que resta. Ac l
parte vai diretamente parac
sem adicionar subelementos, enquantol#(?c)
usa#
para gerar um subelemento e depois chamar(?c)
recursivamente para possíveis outros.fonte
Geléia ,
50 4034 bytes-6 bytes graças a Leaky Nun (ficando reduzido ao trabalho onde eu não podia)
Simples e ineficiente.
Experimente online! (atinge o tempo limite no TIO por [1,1,1,1] - sim, ineficiente.)
Quão?
Remove recursivamente pares de colchetes correspondentes que residem um ao lado do outro até que não mais sejam removidos para cada sequência possível, mantendo essas sequências que se reduzem a nada (portanto, têm todo o conteúdo correspondente).
fonte
œṣ
-F
-µÐL
em um problema um pouco relacionado .Pitão -
83747163 bytesTente
1 : Kc "[] {} () <>") Fd {.ps * VR \ KQJdVldFHK =: JHk)) I! Jd
Além disso, esta versão de 53 bytes graças a Leaky Nun
Aqui
fonte
("\[]""{}""\(\)""<>")
, nós fazemosc"\[] \{} \(\) <>")
(dividimos em espaço em branco); em vez de:@Kd*\\2k
,-@Kd
seguimos por duas barras invertidas; então, em vez de mapearU4
, fazemos*V-R\\KQ
(multiplique duas matrizes em paralelo). A primeira matriz é gerada utilizandoR
, nomeadamente-R\\k
Isto lhe dará uma versão 54-byte05AB1E ,
3332302725 bytesEconomizou 7 bytes graças a Riley .
A ordem de entrada é
[(),<>,[],{}]
Experimente online!
Explicação
fonte
:
vetoriza (você pode pular a maior parte do loop infinito). 2. É 1 bytes mais curto para usarUX
no início eX
quando você precisar da lista de colchetes novamente.:
primeiro, mas temos problemas quando, por exemplo, substituições{}
cria possíveis substituições,()
pois já tentamos substituir todas()
. Bom ponto sobreUX
embora. Também podemos obter outro byte©®
.U
aparecer no topo sempre foi frustrante. Eu não sabia©®
.[([]{})<{[()<()>]}()>{}]
, mas não para[({})<{[()<()>]}()>{}]
. A única diferença é a removida[]
. Vou perguntar sobre isso na TNB.Ruby , 123 bytes
Experimente online! É ineficiente, porém, mesmo entradas como
[1,2,1,1]
o tempo limite ficam on-line. Todos os exemplos listados funcionarão, pelo menos!Explicação
fonte