Una lista vacía es una lista que en ningún nivel contiene objetos que no sean de la lista. O si prefieres una definición recursiva
La lista vacía es nula
Una lista que contiene solo otras listas nulas es nula
Todas las listas vacías tienen una profundidad finita.
Aquí hay algunos ejemplos de listas vacías (usando la sintaxis de Python):
[]
[[]]
[[],[]]
[[[]]]
[[[]],[]]
[[],[[]]]
Aquí hay algunos ejemplos de cosas que no son listas nulas:
["a"]
[[...]]
[1]
2
[[],([],[])]
Tarea
Escriba dos funciones separadas (o programas si lo prefiere). Uno debe tomar un entero positivo (también puede incluir cero si lo desea) como argumento y devolver una lista vacía, el otro debe tomar una lista vacía y devolverlo un entero. Estas dos funciones siempre deben ser inversas entre sí. Esto es, si se pasa la salida f
en g
que debe recibir la entrada original de f
como resultado de g
. Esto significa que la asignación debe ser 1: 1, es decir, para cada número entero, solo puede existir exactamente una lista vacía para la que se g
obtiene ese número entero y para cada lista vacía debe haber exactamente un número entero para el que se f
obtiene esa lista vacía.
Básicamente estás creando una Biyección
Puede elegir utilizar una representación de cadena de una lista vacía (con o sin comas y espacios) en lugar del tipo de lista nativa de su idioma.
Tanteo
Su puntaje será la duración de sus dos funciones juntas. Este es el código de golf, por lo que debe intentar minimizar esta suma.
Respuestas:
Pyth, 27 + 29 = 56 bytes
f
:Banco de pruebas
g
:Banco de pruebas
El sistema es muy simple: genero todas las listas posibles con no más de un cierto número de
[
's. Luego, los clasifico de tal manera que las listas que aún no he generado estarían cerca del final. Todo esto lo hace la funcióny
, idéntica en ambos programas. Está escrito comoLuego, indico en esta lista para
f
y busco en ellag
.El número de listas que genero se elige para que sea lo suficientemente grande como para haber generado todas las listas posibles que aparecerían en o antes de la ubicación deseada en la lista ordenada infinita.
Los programas permiten / devuelven 0 como opción.
fuente
Python 2 , 96 bytes
Pruébalo en línea! para probar la biyección.
Lleva las listas nulas a enteros no negativos. 42 bytes.
Toma enteros no negativos para anular listas. 54 bytes. Un intento más recursivo dio la misma duración.
fuente
Java 7, 725 bytes
f(int)
( 325 bytes ):g(String)
( 75 + 325 bytes ):Como el método
g
usa el métodof
para calcular su resultado, recorre la posible lista vacía hasta que encuentra el igual al ingresado, los bytes def
se cuentan dos veces (ya que ambos métodos deberían poder ejecutarse sin el otro para este desafío).Explicación:
En general, el método
f
simplemente recorre todas las representaciones de cadenas binarias de enteros y aumenta un contador cada vez que se encuentra uno válido. Las cadenas binarias válidas para este desafío cumplen con las siguientes reglas: comienzan con a1
y terminan con a0
; tienen el mismo número de 1s y 0s; y cada vez que elimine el primero1
y0
valide lo que queda nuevamente, estas dos reglas aún se aplican. Después de que el contador es igual a la entrada, convierte esa cadena binaria en una lista vacía de cadena, reemplazando todas1
con[
y todas0
con]
.En cuanto al método
g
: comenzamos con"[]"
(que representa la lista vacía0
), y luego continuamos usando el métodof
mientras aumentamos un entero, hasta que coincida con la cadena de entrada.Ejemplos de casos de entrada y salida:
Pruébalo aquí (NOTA: es bastante lento para los últimos casos de prueba. Tomará alrededor de 10-15 segundos para todos ellos).
fuente
[][]
sea una lista. Tal vez estoy malinterpretando la forma en que Java hace lo que sea. Sumar[...]
todos ellos y tener 0 mapas para[]
hacer el truco.K (ngn / k) , 49 bytes
Pruébalo en línea!
usa la fórmula del ejemplo en Bijection: listas tipo árbol - números naturales
fuente
JavaScript (Node.js) , 82 bytes
Pruébalo en línea!
idea de xnor
fuente
Python 3 - signo / abs, 73 bytes
Pruébalo en línea!
Implementación directa, admite números negativos.
El número entero
i
está codificado[sign(i), abs(i)]
, dondesign(i)=[] if i > 0 else [[]]
yabs(i)=[[]] * i
, es decir, una lista de listas vacías con longitud abs (i).Python 3 - binario, 126 bytes
Esta es una versión más elaborada (y mucho más larga ...), donde el valor absoluto se codifica en una representación de lista binaria.
Pruébalo en línea!
fuente
Stax , 33 bytes totales
Estos programas son inversos entre sí. Se convierten desde y hacia todas las listas vacías y todos los enteros no negativos, por lo que eso incluye 0. Esto parece ser una función famosa de algún tipo de álgebra que no conozco. Para entenderlo, primero implementé los programas como funciones en python.
Los programas stax tienen el mismo comportamiento.
Entero no negativo → Lista vacía, 15 bytes
Ejecutar y depurarlo
Lista vacía → Entero no negativo, 18 bytes
Ejecutar y depurarlo
fuente