Este desafío es simplemente devolver una lista de listas de enteros, similar a la función de rango de Python, excepto que cada número sucesivo debe ser tan profundo en las listas.
reglas :
- Crear un programa o una función no anónima
- Debería devolver o imprimir el resultado
- El resultado debe devolverse en una lista (de listas) o matriz (de matrices)
- Si el parámetro es cero, devuelve una lista vacía
- Esto debería ser capaz de manejar un parámetro entero 0 <= n <70.
- (Las soluciones recursivas explotan bastante rápido)
- La función debe ser invocable con solo un parámetro.
- Otro comportamiento es indefinido.
- Este es el código de golf, por lo que gana el código más corto.
Llamada de ejemplo:
rangeList(6)
> [0, [1, [2, [3, [4, [5]]]]]]
Casos de prueba:
0 => []
1 => [0]
2 => [0, [1]]
6 => [0, [1, [2, [3, [4, [5]]]]]]
26 => [0, [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20, [21, [22, [23, [24, [25]]]]]]]]]]]]]]]]]]]]]]]]]]
69 => [0, [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20, [21, [22, [23, [24, [25, [26, [27, [28, [29, [30, [31, [32, [33, [34, [35, [36, [37, [38, [39, [40, [41, [42, [43, [44, [45, [46, [47, [48, [49, [50, [51, [52, [53, [54, [55, [56, [57, [58, [59, [60, [61, [62, [63, [64, [65, [66, [67, [68]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
EDITAR: la respuesta de Isaac es la más corta hasta ahora. Actualizaré la respuesta aceptada si alguien encuentra una más corta en un idioma que existía en la publicación del desafío. ¡Gracias por jugar!
code-golf
array-manipulation
mbomb007
fuente
fuente
import math
en Python, por ejemplo, no creo que pueda ocurrir dentro de una función.Respuestas:
Pyth, 13 bytes
Pruébalo aquí
fuente
APL (
1318)Asumiendo
⎕IO=0
:Explicación:
×⍵:
si⍵
es positivo,∘⊂∘,
: une el operando izquierdo al encerramiento del operando derecho (es decirx ,∘⊂∘, y = [x, [y]]
)/
: reducir⍳⍵
: los números0..⍵-1
⊃
: revelar el resultado⋄
: de lo contrario⍬
: devuelve la lista vacía/
falla⍬
y⍳0
da la lista vacía).Apéndice:
Esta función devuelve una matriz anidada. Sin embargo, es un poco difícil distinguir esto de la salida predeterminada de APL. Separa los elementos de la matriz por espacios, por lo que solo puede distinguir la anidación por espacios dobles. Aquí hay una función que tomará una matriz anidada y devolverá una cadena, formateando la matriz anidada en estilo Python (es decir
[a,[b,[c,...]]]
).fuente
f←
al inicio de su programa a menos que lo modifique para aceptar la entrada del usuario.Haskell, 67 bytes
En Haskell, todos los elementos de una lista deben ser del mismo tipo, por lo que no puedo mezclar enteros con la lista de enteros y tengo que definir un tipo de lista personalizada
L
. La función auxiliar#
construye recursivamente la lista requerida. La función principalp
verifica la lista vacía y llama de#
otra manera.Como los nuevos tipos de datos no se pueden imprimir de forma predeterminada (las reglas solo permiten devolver la lista), agrego un poco más de código para fines de demostración:
Ahora:
fuente
Python, 48 bytes
Usando la multiplicación de listas para manejar el caso especial.
fuente
*(i<n-1)
se puede hacer como[:n+~i]
, ya que es una lista única.Mathematica, 33
fuente
CJam, 16 bytes
Este es un programa completo. Toma entrada a través de STDIN e imprime la matriz final en STDOUT.
Al igual que con la otra entrada de CJam, la
0
entrada se imprimirá""
ya que es la representación de una matriz vacía en CJam.Cómo funciona :
Pruébalo en línea aquí
fuente
JavaScript (ES6) 40
Solución recursiva, bastante robusta, sin golpes. La actualización falla cerca de 6500 con 'demasiada recursividad'
Solución iterativa (45) Sin límites, excepto el uso de memoria
Pruebe F (1000): la consola FireBug no le mostrará más de 190 matrices anidadas, pero están allí
fuente
Java,
88107105104102 bytesBastante largo en comparación con los demás, aunque no puedes hacerlo mucho mejor con Java. Una verificación para determinar si continuar la recursión es todo lo que se necesita.
fuente
import java.util.*;
esto sea autosuficiente (o que califique completamentejava.util.List
yjava.util.Stack
, pero eso es mucho más tiempo). +19 para que sea 107, todavía 7 mejor que la respuesta de Java en la que estaba trabajando: Do!=n
puede sero<n
, y puede cambiar el ternario ao<n?o++:""
.final
encendidoint n
.Python 2, 56 bytes
Sospecho que esto podría jugar más golf.
Pruebas:
fuente
CJam, 17 bytes
Sé que Optimizer ha encontrado 16, pero aquí está lo mejor que puedo hacer:
Este es un bloque, lo más parecido a una función en CJam, que toma un número entero en la pila y deja la matriz anidada deseada.
Use este programa para probarlo , que coloca la entrada en la pila, luego llama a la función e inspecciona la pila. Tenga en cuenta que para
0
, la salida de la pila contendrá""
: esta es la representación nativa de CJam de una matriz vacía.fuente
Ruby 46
Pruébelo en línea: http://ideone.com/uYRVTa
fuente
C # - 100
Recurrencia simple Marque el caso especial cero y marque con una variable, abajo con la otra
C ++ 87
(Visual C ++ 2012)
Este es genial, con lo que quiero decir bizantino, pero es la misma idea básica que el c # uno.
Es una implementación de matriz de estilo C, por lo que no le da una matriz, le da un puntero int, en el que estaba almacenando entradas y otros punteros. De esta manera:,
[0,*] *->[1,#] #-> [2,&] &-> etc
donde los símbolos son pseudocódigo para el valor int de un puntero y el -> es donde apunta en la memoria.Qué excelente implementación fácil de usar de arreglos irregulares estilo c que he ideado (tos), pero mantengo que es lo suficientemente plausible como para estar dentro de las reglas de la pregunta.
Aquí hay muchos operadores ternarios abusadores, y también mucho abuso del elenco implícito de int a bool.
Ejemplo: si dejamos
int *bar = (int*)A(3);
, podemos ver:Que es la charla de puntero para [0, [1, [2]]].
Bien vale. En realidad no tiene que ser horrible. Aquí hay un código de prueba para ejecutar este código c ++:
}
fuente
C++
.Array g(params object[]a)=>a;Array f(int y,int x=0)=>y<1?g():y<2?g(x):g(x,f(y-1,x+1));
Pyth, 15 bytes
Lo que realmente dice, en Python:
fuente
qJ_1
es el mismo que!Q
. Y enJtQ
realidad desperdicia 1 byte.?Y!Qu[HG)_UtQ[tQ
[tQ
a]tQ
, que es equivalente, cambia al orden de operaciones de?
, por lo que puede reemplazar!Q
conQ
. Esto da como resultado?u[HG)_UtQ]tQQY
- 1 byte más guardado.Haskell ,
65 59 4541 bytesEstas listas anidadas tienen la misma estructura de datos que las raíz
Tree
, excepto que también pueden estar vacías. Por lo tanto, podemos usar una lista de ellos, también llamada aForest
para representarlos.Pruébalo en línea!
Explicación
En primer lugar, necesitamos implementar el
Tree
tipo de datos:A partir de ahí, es solo recursión utilizando dos parámetros
m
(contando hacia arriba) yn
hacer un seguimiento de cuándo terminar:Alternativa, 61 bytes
Pruébalo en línea!
Explicación
La función
unfoldForest
toma una lista de valores iniciales y una funciónx -> (y,[x])
. Para cada valor inicialx
, despliega un árbol usando la función, produciendo una tupla(y,xs)
dondey
se convertirá en la raíz yxs
se usará para repetir el procedimiento:fuente
Perl - 44
Agregará una explicación a pedido. Puedes probarlo aquí .
fuente
nil
o el equivalente? Pregunto porque en la página que enlaza con la matriz más interna se ve(3,)
undef
es el equivalente denil
onull
en Perl y no hay un elemento adicional. Perl aplana las matrices, por lo que esto crea referencias de matrices anidadas.JavaScript, 93 bytes
Esto no es ideal, pero podría intentarlo. Intentaré jugar al golf más adelante, aunque por ahora no veo una manera obvia de hacerlo.
fuente
Python, 75 bytes
Esto es solo para mostrar. Es el programa que escribí al crear / diseñar este desafío.
fuente
Python, 44
Recursivamente crea el árbol. Al
[:n]
final es un caso especialn==0
para dar la lista vacía.fuente
and
yor
puedo tener espacios omitidos junto a los enteros, peroelse
no puedo.else
comienza cone
, y cosas como1e6
son literales de números válidos.else
, por ejemplo,x = 1 if y==2else 5
funciona.Joe , 8 bytes
Nota: Esta es una respuesta no competitiva. La primera versión de Joe fue lanzada después de esta pregunta.
¿Qué tenemos aquí?
F:
define una función F que es una cadena de/+,
,M]
yR
. Cuando llamaFn
, primeroRn
se evalúa, devolviendo el rango de 0 a n, exclusivo.M]
ajusta cada elemento a una lista. Entonces la lista se aplica a/+,
.x +, y
vuelvex + [y]
./
Es un pliegue derecho. Por lo tanto,/+,a b c d...
vuelve[a, [b, [c, [d...]]]
.Invocaciones de ejemplo (el código está sangrado por 3, la salida por 0)
fuente
Ruby - Versión recursiva - 52
Versión no recursiva:
666257Salida de muestra (igual para ambas versiones)
La versión no recursiva puede manejar entradas arbitrariamente grandes.
Ambas versiones también aceptan con gracia números negativos
fuente
stack level too deep (SystemStackError)
)PHP 5.4 (67 bytes):
Sé que sé.
Está lejos de ser la respuesta más corta.
¡Pero funciona!
Aquí está:
Puede probarlo aquí: https://ideone.com/42L35E (ignore el error)
Javascript (57 bytes):
Este es el mismo código exacto , excepto que Javascript es exigente con el retorno y he reducido los nombres de las variables:
¿Ver? Mismo código!
ES6 (49 bytes):
Básicamente el mismo código exacto, pero reducido para ES6:
fuente
f=lambda
...But it's pretty standard codegolf for functions that they have to be callable by name (aka, more than once and without typing the entire function again.)
-> nunca escuché hablar de esto, y uso este sitio web durante algo más de un año. Además, este es un argumento no válido ya que puede asignar las funciones a una variable.Javascript (114 bytes):
Todos los demás estaban haciendo recursivos, así que quería probar una solución iterativa. Sin embargo, tengo muchos casos especiales.
Tengo una lista maestra, y luego repito y agrego nuevas listas con nuevos números.
fuente
Lisp común (95 bytes):
fuente
JavaScript,
3537 bytesSolución recursiva
Pruébalo en línea!
fuente
05AB1E , 11 bytes
Pruébelo en línea o verifique todos los casos de prueba .
Alternativa de 11 bytes:
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
05AB1E no tiene bucles que van hacia abajo, por lo que para hacer un bucle en el rango
(input, 0]
tengo que:ݨR
; cree el rango[0, input]
, elimine el último elemento, invierta), y luego repítalo (vy
);[0, input)
(F
) y tome la diferencia absoluta entre el índice de bucle y la entrada-1 (NI<α
).fuente