Para este desafío, una lista se considera válida si y solo si consiste enteramente de enteros y listas válidas (definiciones recursivas \ o /). Para este desafío, dada una lista válida y un número entero, devuelve una lista de todas las profundidades a las que se puede encontrar el número entero.
Ejemplo
Consideremos la lista [1, [2, [3, [1, 2, 3], 4], 1], 1]
y el entero 1
. Entonces, podemos dibujar la lista así:
Depth 0 1 2 3
Num 1
2
3
1
2
3
4
1
1
Notarás que 1
aparece en las profundidades 0, 1, 3
. Por lo tanto, su salida debe estar 0, 1, 3
en algún formato razonable (el orden no importa).
La profundidad puede ser 0 o 1 indexada, pero especifique en su envío cuál es.
Casos de prueba (indexados 0)
Para la lista [1,[2,[3,4],5,[6,7],1],[[[[5,2],4,[5,2]]],6],3]
:
1 -> [0, 1]
2 -> [1, 4]
3 -> [0, 2]
4 -> [2, 3]
5 -> [1, 4]
6 -> [1, 2]
7 -> [2]
Para la lista [[[[[1],0],1],0],1]
:
0 -> 1, 3
1 -> 0, 2, 4
Para la lista [11,22,[33,44]]
:
11 -> [0]
22 -> [0]
33 -> [1]
44 -> [1]
Devuelve una lista vacía si el término de búsqueda no existe en la lista en ninguna parte.
Los valores negativos y cero son válidos en la lista de entrada y el término.
fuente
Respuestas:
Mathematica, 25 bytes
(devuelve salida indexada 1)
Explicación
fuente
Haskell ,
102938076 bytesGracias Bruce Forte por guardar algunos bytes, y Laikoni por guardar algunos más.
Gracias 4castle por guardar 4 bytes.
Haskell no tiene ningún tipo de datos para este tipo de lista, así que hice el mío.
Esta solución es
1-indexed
Pruébalo en línea!
Primero defino (recursivamente) un tipo de datos
T
T
tiene tipoE Int
(elemento único de tipoInt
) oL[L]
(lista de tipoT
).(%)
es una función que toma2
argumentos, de tipoT
, la lista a través de la cual estamos buscando yx
laInt
que estamos buscando.Siempre que
(%)
encuentra algo que es un elemento únicoE n
, comprueba lan
igualdad conx
y devuelve0
si es verdadero.Cuando
(%)
se aplica a unL s
(dondes
tiene tipo[T]
) se ejecuta(%)
en todos los elementoss
e incrementa el resultado (a medida que aumenta la profundidad ya que estamos mirando hacia adentros
), y concatena el resultado.nub
luego elimina los duplicados de la listaNÓTESE BIEN.
import Data.List
es solo paranub
.fuente
E n
yL s
.Python 2 , 68 bytes
Pruébalo en línea!
fuente
Python 2 , 72 bytes
Pruébalo en línea!
fuente
Jalea ,
118 bytesPruébalo en línea!
Cómo funciona
Ejecución de ejemplo
Para argumento izquierdo
W
primero produce la siguiente matriz.ẎÐĿ
concatena repetidamente todos los elementos en la profundidad 1 , reduciendo la profundidad de la matriz en 1 en cada paso. Esto produce el siguiente conjunto de resultados intermedios.Para el argumento correcto 1 ,
ċ€
cuenta las ocurrencias de 1 en cada resultado intermedio.I
ahora lleva todas las diferencias hacia adelante.Las diferencias distintas de cero corresponden a los pasos en los que se agregó al menos otro 1 a la profundidad 1 . Por lo tanto, una diferencia distinta de cero en el índice k indica la presencia de un 1 en la profundidad k .
T
encuentra los índices de todos los elementos de verdad, produciendo el resultado deseado:fuente
R ,
1019592100 bytesPruébalo en línea!
Solución recursiva; es bastante ineficiente en bytes, pero R
lists
es muy molesto trabajar conBásicamente, toma
L
, y para cada elementox
deL
, (que eslist
o unatomic
vector de un elemento), verifica sin
es%in%
x
, luego verifica six
es alist
. Si no es así, entoncesx==n
devolvemos la profundidadd
; de lo contrario, de forma recursiva llamamosf
enx
, incrementandod
.Esto, por supuesto, devuelve a
list
, que nosotrosunlist
yunique
para garantizar la salida correcta (devolviendo un vector de profundidades enteras); devuelveNULL
(una lista vacía) para inválidon
.Aparentemente,
%in%
no busca de forma recursiva a través de lolist
que pensé, así que tengo queunlist(x)
buscar +8 bytes :(fuente
APL (Dyalog) , 39 bytes *
Programa completo Solicita la lista, luego el número. Imprime la lista basada en 1 en STDOUT.
Pruébalo en línea!
⎕
solicitud de lista⊢
rendimiento que (separa0
y⎕
)⎕JSON⍠'Compact'0
convertir a una cadena JSON sangrada con nuevas líneas⎕FMT
convertir a matriz (una línea delimitada por nueva línea por fila)⍞⍷
solicite el número como cadena e indique dónde comienza en ese∨⌿
reducción OR vertical (es decir, en qué columnas comienza)⍸
índices de esos comienzos2÷⍨
reducir a la mitad eso (los niveles están sangrados con dos espacios)⌊
redondear hacia abajo (porque la primera columna de datos es la columna 3)* En Dyalog Classic, contando
⍸
como⎕U2378
y⍠
como⎕OPT
.fuente
PHP , 117 bytes
Pruébalo en línea!
fuente
JavaScript (ES6),
7968 bytesDevuelve un conjunto. Si esto es inaceptable, úselo
&&[...r]
a un costo de 5 bytes.fuente
Jalea ,
1716 bytesUn programa completo que toma dos argumentos de línea de comando de la lista y un elemento para verificar, e imprime la profundidad o las profundidades (si las hay) en las que existe el elemento. Los resultados están indexados en 1.
Pruébalo en línea!
¿Cómo?
fuente
JavaScript (ES6),
7374 bytesExplicación:
Casos de prueba
Mostrar fragmento de código
fuente
e[0]
ser cero, lo que anularía su prueba.e.pop
por una pérdida de un byte.Python 3 ,
1238682 bytesPruébalo en línea!
-37 bytes gracias a Hyper Neutrino y ovs
-4 bytes gracias a Jonathan Frech
fuente
if type(a[i])!=int
por -1 bytel+=[d]
por -5 bytesl+=[d]*(a[i]==n)
con -whatever_number_of_bytes_it_is[]==a[i]*0
para un cheque de tipo más cortoa
lugar de un rango y usegetitem
tanto para - ~ 20 bytesAPL (Dyalog Classic) ,
3130 bytesFunción. El argumento izquierdo
⍺
es la aguja, el argumento derecho⍵
es el pajar.Pruébalo en línea!
fuente
Octava ,
126122bytesPruébalo en línea!
Para facilitar la lectura, reemplacé espacios o
;
's con extremos de línea siempre que sea posible. Explicación del código no golfizado:fuente
Java, 154 + 19 = 173 bytes
Pruébalo en línea
Método sin golf
fuente