Uma lista de nulos é uma lista que em nenhum nível contém objetos que não sejam da lista. Ou se você preferir uma definição recursiva
A lista vazia é nula
Uma lista contendo apenas outras listas de cancelamentos é cancelada.
Todas as listas de nulos têm uma profundidade finita.
Aqui estão alguns exemplos de listas de nulos (usando a sintaxe python):
[]
[[]]
[[],[]]
[[[]]]
[[[]],[]]
[[],[[]]]
Aqui estão alguns exemplos de coisas que não são listas nulas:
["a"]
[[...]]
[1]
2
[[],([],[])]
Tarefa
Escreva duas funções separadas (ou programas, se preferir). Um deve usar um número inteiro positivo (você também pode incluir zero, se desejar) como argumento e retornar uma lista de nulos; o outro deve usar uma lista de nulos e retornar um número inteiro. Essas duas funções devem sempre ser inversas uma da outra. Ou seja, se você passar a saída para f
dentro, g
deverá obter a entrada original f
como resultado de g
. Isso significa que o mapeamento deve ser 1: 1, ou seja, para todo número inteiro, pode existir apenas exatamente uma lista de nulos para a qual g
esse número inteiro e para cada lista de nulos deve haver exatamente um número inteiro para o qualf
fornece essa lista de nulos.
Você está essencialmente criando uma Bijeção
Você pode optar por usar uma representação de seqüência de caracteres de uma lista de nulos (com ou sem vírgulas e espaços) em vez do tipo de lista nativa do seu idioma.
Pontuação
Sua pontuação será o comprimento de suas duas funções juntas. Isso é código-golfe, então você deve tentar minimizar essa soma.
Respostas:
Pitão, 27 + 29 = 56 bytes
f
:Suíte de teste
g
:Suíte de teste
O sistema é muito simples: eu gero todas as listas possíveis com não mais que um certo número de
[
's. Em seguida, classifico-as de maneira que as listas que ainda não geraram estejam próximas do fim. Tudo isso é feito pela funçãoy
, idêntica nos dois programas. Está escrito comoEntão, indexo nesta lista
f
e pesquiso nelag
.O número de listas que eu gero é escolhido para ser grande o suficiente para que eu tenha gerado todas as listas possíveis que apareceriam no local ou antes do local desejado na lista de classificação infinita.
Os programas permitem / retornam 0 como uma opção.
fonte
Python 2 , 96 bytes
Experimente online! para testar a bijeção.
Leva listas nulas a números inteiros não negativos. 42 bytes.
Leva números inteiros não negativos para listas nulas. 54 bytes. Uma tentativa mais recursiva deu o mesmo comprimento.
fonte
Java 7, 725 bytes
f(int)
( 325 bytes ):g(String)
( 75 + 325 bytes ):Como o método
g
usa o métodof
para calcular o resultado, percorre a lista de vazios possível até encontrar o igual ao que foi inserido, os bytes def
são contados duas vezes (já que os dois métodos devem ser capazes de executar sem o outro para esse desafio).Explicação:
Em geral, o método
f
simplesmente percorre todas as representações binárias de números inteiros e aumenta um contador toda vez que um válido é encontrado. As strings binárias válidas para esse desafio estão em conformidade com as seguintes regras: Elas começam com a1
e terminam com a0
; eles têm um número igual de 1s e 0s; e toda vez que você remove o primeiro1
e0
valida o que resta novamente, essas duas regras ainda se aplicam. Depois que o contador é igual à entrada, ele converte a String binária em uma lista de vozes da String, substituindo todas1
por[
e all0
with]
.Quanto ao método
g
: Começamos com"[]"
(representando void-list0
) e depois continuamos usando o métodof
enquanto aumentamos um número inteiro, até que ele corresponda à string de entrada.Exemplos de casos de entrada e saída:
Experimente aqui. (OBSERVAÇÃO: é muito lento para os últimos casos de teste. Levará de 10 a 15 segundos para todos eles.)
fonte
[][]
seja uma lista. Talvez eu esteja entendendo mal a maneira como o Java faz o que quer que seja. Adicionando em[...]
torno de todos eles e tendo 0 mapa para[]
deve fazer o truque.K (ngn / k) , 49 bytes
Experimente online!
usa a fórmula do exemplo em Bijeção: listas semelhantes a árvores - números naturais
fonte
JavaScript (Node.js) , 82 bytes
Experimente online!
ideia de xnor
fonte
Python 3 - sinal / abs, 73 bytes
Experimente online!
Implementação direta, suporta números negativos.
O número inteiro
i
é codificado[sign(i), abs(i)]
, ondesign(i)=[] if i > 0 else [[]]
eabs(i)=[[]] * i
, ou seja, uma lista de listas vazias com comprimento abs (i).Python 3 - binário, 126 bytes
Esta é uma versão mais elaborada (e muito mais longa ...), onde o valor absoluto é codificado em uma representação de lista binária.
Experimente online!
fonte
Stax , 33 bytes totais
Esses programas são inversos um do outro. Eles convertem para e de todas as listas de nulos e todos os números inteiros não negativos, de modo que inclui 0. Isso parece ser talvez uma função famosa de algum tipo de álgebra que eu não conheço. Para entender melhor, primeiro implementei os programas como funções em python.
Os programas stax têm o mesmo comportamento.
Inteiro não negativo → Lista de nulos, 15 bytes
Execute e depure
Lista de nulos → Número inteiro não negativo, 18 bytes
Execute e depure
fonte