Inspirado en Buscar el "tamaño sin envolver" de una lista .
Defina el tamaño recursivo RS
, de una lista que no contiene listas como su longitud (número de elementos contenidos) y el tamaño recursivo de una lista que contiene listas como la suma de su longitud y el tamaño recursivo de esas listas.
Desafío
Escriba un programa o función que genere el tamaño recursivo de cualquier lista dada en el menor número de bytes posible.
La entrada es una lista y puede contener números, cadenas (si su idioma las tiene) y listas similares.
Por ejemplo:
RS([]) = 0
RS([[]]) = 1
RS([4, 5, 6]) = 3
RS(["four", "five", "six"]) = 3
RS(["[[[[]]]]", "[][][][][]", "][][[[]]][]["]) = 3
RS([[4, 5, 6]]) = 4
RS([["four", "five", "six"]]) = 4
RS([["[[[[]]]]", "[][][][][]", "][][[[]]][]["]]) = 4
RS([[4], [5], [6]]) = 6
RS([["four"], ["five"], ["six"]]) = 6
RS([["[[[[]]]]"], ["[][][][][]"], ["][][[[]]][]["]]) = 6
RS([[[[[[[[[]]]]]]]]]) = 8
RS([[],[],[],[],[],[],[],[]]) = 8
RS([[],[],[[]],[[[[]]]]]) = 8
RS([0,[-1],[2.3,-4.3],[5,[6]],[7,[8,9,[10,11,[12,13,14]]]]]) = 22
Tenga en cuenta que si su idioma no tiene cadenas pero tiene listas de caracteres, los ejemplos que contienen "strings"
arriba podrían ser listas de caracteres y tener resultados más grandes. Como ejemplo:
RS([['f','o','u','r'], ['f','i','v','e'], ['s','i','x']]) = 14
Este es el código de golf , por lo que gana la respuesta más corta en bytes; no es gracioso, como siempre.
Una entrada no listada puede producir cualquier salida.
I / O es tan flexible como de costumbre .
fuente
Respuestas:
Jalea , 8 bytes
Pruébalo en línea!
Cómo funciona
fuente
Python, 42 bytes
Para una no lista, salida 0. Para una lista, envíe su longitud más la suma de las salidas recursivas para sus elementos.
Las listas están por encima de los números y debajo de las cadenas en el pedido de Python 2, lo que requiere
[]<=x<''
. En cambio, verificamosx*0==[]
, mientras que el resultado de0
un número o''
una cadena.fuente
JavaScript (ES6),
3937 bytesGuardado 2 bytes gracias a @ edc65
fuente
f=a=>a.map?a.reduce((s,x)=>s+f(x),0):0
1
allí en alguna parte.f=a=>a.map&&a.map(x=>a-=~f(x),a=0)&&a
.-=~
es 1 char menos que+=1+
y, al convertir un booleano en entero, corta otro carácter. Reutilizandoa
para evitar la variable globalt
Mathematica, 20 bytes
Función anónima. Toma una expresión como entrada y devuelve un número como salida. El carácter Unicode es U + 221E INFINITY para
\[Infinity]
.Level[#,∞]
da una lista de subexpresiones de entrada y lasLength@
cuenta.fuente
Mathematica, 14 bytes
Modificación menor de mi respuesta anterior . Como expliqué allí,
LeafCount
ya se encarga de los valores atómicos anidados, pero también cuenta la lista más externa, que debemos restar del resultado.fuente
Perl, 34 bytes
Una función recursiva! Sí, Perl no solo tiene expresiones regulares sino que también tiene funciones.
Si quieres probarlo, puedes ejecutar algo como:
fuente
Mathematica, 32 bytes
Función recursiva sin nombre. El extracto
#0/@#~Select~ListQ
llama a la función nuevamente en cada elemento de la entrada que es una lista, yTr
resume esos valores. Afortunadamente, Mathematica está bien tomando la longitud de la lista vacía y buscando elementos calificativos de la lista vacía, por lo que no se necesita un caso base.fuente
Haskell, 52 bytes
Ejemplo de uso:
Haskell no admite listas mixtas (por ejemplo, Int y lista de Int), por lo que voy con un tipo de lista personalizada
L
que es un elemento de algún tipo a (->E a
) o una lista de otras L (->N[L a]
). Calcular el RS es una recursión simple donde unE
recuento1
yN
uno más la suma de los tamaños recursivos de sus elementos. Toda la suma está desactivada en 1, así que la resto víapred
.Nota al margen: los tipos y valores exactos de los elementos no son importantes para el algoritmo, por lo que podríamos eliminar el polimorfismo y tratar solo con elementos abstractos
data L=E|N[L]
.fuente
Factor, 105 bytes
Función recursiva g.
Sin golf (un poco):
Verá que no hay llamadas
length
porque, en lugar de usar la longitud incorporada, se implementa a travésdrop 1
de cadenas y no secuencias.fuente
Mathematica, 18 bytes
Sin embargo, otro enfoque de Mathematica. No es tan corto como usar el incorporado,
LeafCount
pero sigue siendo bastante conciso. Esto hace uso delMapAll
operador//@
que llama a una función en cada nodo de una expresión, y usamos esa función para incrementar un contadorc
. Como en elLeafCount
caso, esto da uno más de lo que necesitamos, porque también cuenta el encabezado de la lista externa, por lo que comenzamos el contador desde-1
.fuente
C # (compilador interactivo de Visual C #) , 50 bytes
Pruébalo en línea!
Utiliza la misma técnica que la respuesta Java presentada anteriormente , pero aprovecha LINQ para reducir la longitud de la respuesta.
Explicación:
fuente
05AB1E (heredado),
2217 bytesPruébelo en línea o verifique todos los casos de prueba .
Explicación:
Este desafío plantea múltiples desafíos a superar en 05AB1E:
λ
), solo es útil para secuencias enteras. Aquí hay una respuesta mía como ejemplo de la función recursiva 05AB1E. Debido a eso, tuve que encontrar una alternativa para hacer llamadas recursivas, lo que hice al poner parte del código en una cadena, y ejecutar esa cadena como código 05AB1E de forma recursiva.isList
comando en 05AB1E, por lo que tuve que usar algunas soluciones para verificar esto mediante el ajuste en una lista, el aplanamiento profundo y la verificación de la igualdad.˜
es un aplanamiento profundo que elimina todas las capas y convierte una lista multidimensional en una lista única con todos los valores más internos. (es decir, se[[1,2],[[[3]],4]]
convierte[1,2,3,4]
).Terminé con el código en la parte superior para superar los tres problemas anteriores. Se divide en tres partes principales. Primero tenemos lo siguiente:
La cadena contiene el siguiente código:
Se utiliza un mapa en lugar de un bucle foreach, porque el mapa tiene un implícito
y
y un bucle foreach necesita un explícitoy
. Sincounter_variable
embargo, solo nos preocupamos por el .Y finalmente, después de que todos los mapas y mapas internos estén hechos, nosotros:
fuente
R , 65 bytes
Pruébalo en línea!
Obvia implementación recursiva de la especificación.
fuente
C,
174167152 bytesFunción recursiva
f
, que pierde memoria ( 152 ):Recursivo
f
que no pierde, usando referencias, en 167 :Sin golf:
"¿Cómo?", Preguntas, "¿se puede responder esto en C? Seguramente, no hay matrices administradas en C, y realmente no se pueden tener matrices heterogéneas ..."
"Ajá", respondo, "porque he estado trabajando en un sistema simple de" objetos "para (GNU-ish) C11 e ISO C ++ 11".
El programa de demostración completo para esta función es:
En este momento, vive aquí y necesitarás ese repositorio para usar esto.
También necesitará la biblioteca de hash Fowler-Noll-Vo
libfnv
, compilada para su plataforma. Está en ese repositorio y también puede obtenerlo aquí .Entonces puedes hacer
cc -DNODEBUG size.c path/to/libfnv.a -o size
.La implementación no es necesariamente eficiente:
¡Pero funciona! El último commit a master (que compiló este programa) fue hace 2 días, lo que significa que este envío es válido.
fuente
Axioma 118 bytes
sin golf
resultados
fuente
APL (NARS), 24 caracteres, 48 bytes
Esta sería la traducción literal de 'my' Axiom answer here ... En APL, la lista vacía sería ´⍬´ Zilde, que usted indica con ´ [] ´, ´⊂⍬´ es ´ [[]] ´, ´ 1 2 3´ es ´ [1,2,3] ´ ecc Algunas pruebas:
para imprimir el otro tipo de resultados que propone el ejercicio necesitamos otra función (ambas funciones RS y R deberían estar bien para el ejercicio)
para ver cómo aparecen algunas entradas usamos la función o:
esta impresión de Zilde, y una lista de 8 Zilde:
fuente
Java, 96 bytes
Pruébalo en línea.
Explicación:
fuente
Adjunto , 21 bytes
Pruébalo en línea!
Resulta que el enfoque de C # es bastante corto en Attache.
Alternativas
25 bytes
f[x]:=#x+Sum!f=>IsArray\x
26 bytes
f[x]:=#x+Sum[f=>IsArray\x]
35 bytes
f:=Sum##{If[IsArray@_,1+f@_,1]}=>Id
35 bytes
f:=Sum@Map[{If[IsArray@_,1+f@_,1]}]
37 bytes
f[x]:=Sum[{If[IsArray@_,1+f@_,1]}=>x]
fuente
Clojure,
797751 bytesLa entrada tiene que ser una lista, no un vector. Ambos serían compatibles con el uso
sequential?
.Anterior:
fuente
Python, 72 bytes
fuente
0
yif
,0
yelse
, y)
yfor
.