(Desafío tomado de un juego multijugador (choque de código) en codingame.com )
El reto
Encontrar el n término -ésimo de la siguiente secuencia: 1, 1, 2, 1, 2, 3, 1, 2, 3, 4...
o, para hacerlo más obvio,{1}, {1,2}, {1,2,3}, {1,2,3,4}...
La secuencia se compone de rangos concatenados de 1 a x , comenzando desde 1, hasta el infinito.
Reglas / IO
La entrada y la salida pueden estar en cualquier formato, siempre que sea distinguible. La entrada puede tomarse de cualquier fuente apropiada: STDIN, archivo, etc.
La entrada puede ser 0 o 1 indexada, y la indexación seleccionada debe mencionarse en la publicación.
Tendrá que manejar al menos hasta un resultado de 255 inclusive (lo que significa que la entrada máxima indexada a 0 es 32640). Cualquier cosa sobre eso debe ser manejada, si su idioma lo admite.
¡Esto es code-golf
para que gane el conteo de bytes más corto!
Casos de prueba (indexación basada en 0)
0 -> 1
1 -> 1
5 -> 3
10 -> 1
59 -> 5
100 -> 10
1001 -> 12
59
,100
, etc)Respuestas:
05AB1E , 5 bytes
El programa está indexado a 0, código:
Explicación:
Utiliza la codificación CP-1252 . Pruébalo en línea!
fuente
GNG¹¾¼QiN
es un enfoque iterativo, pero fue más inteligente.Haskell ,
2726 bytesPruébalo en línea!
Gracias @DanD. por -1 byte!
Esta es una función anónima, creando la secuencia infinita un solo devolver el
n
elemento -ésimo de los mismos:[[1..k]| k<-[1..]]
produce una lista infinita de lista:[[1],[1,2],[1,2,3],[1,2,3,4],...]
. Para concatenarlos, podemos escribir lo[z|k<-[1..],z<-[1..k]]
que resulta[1,1,2,1,2,3,1,2,3,4,...]
y finalmente(...!!)
acepta la entradan
(notación sin sentido) y devuelve eln
enésimo término (basado en 0).fuente
concat
con más comprensión sólo ahorra 1 byte:([z|k<-[1..],z<-[1..k]]!!)
.JavaScript,
2928 bytes-1 byte gracias a Arnauld!
Utiliza la fórmula recursiva indexada en 0 que se encuentra en OEIS.
Cuando se llama con 1 argumento como se esperaba, el valor predeterminado del segundo
m
, seráundefined
. Sin embargo,-~undefined
devuelve 1, lo que nos permite poner en marcha la recursividad sin un explícitom = 1
en la lista de argumentos (¡gracias @Arnauld!)Fragmento de prueba:
Alternativamente, para el mismo recuento de bytes, podemos tener una función curry como esta:
Puede llamar a esto con
f(5)()
: devuelve una función que, cuando se llama, devuelve el resultado, como se describe en esta meta publicación .fuente
Jalea , 5 bytes, 1 indexado
Pruébalo en línea!
Explicación:
fuente
Octava, 39 bytes
1- índice basado
Explicación:
Considere esta secuencia:
si contamos el número de elementos de subsecuencias tenemos
entonces, usando la fórmula de Gauss para un número triangular , podemos formar una fórmula para z:
esa es una ecuación cuadrática si la resolvemos para n tenemos
¡Pruébelo en línea!
fuente
Haskell,
2524 bytesEjemplo de uso:
((!!)$[1..]>>= \x->[1..x]) 10
->1
. Pruébalo en línea! .Asigna la función anónima make-a-list-from-1-to-x
\x->[1..x]
(la función incorporadaenumFromTo 1
es un byte más larga) a la lista infinita[1..]
y concatena las listas resultantes en una sola lista.!!
selecciona el enésimo elemento.Gracias a @flawr por un byte.
fuente
(!!)$[1..]>>= \x->[1..x]
. A veces desearía que hubiera una forma de escribir más breve e inútil\x->[1..x]
:)<$>
que no está dentro del alcance. ¿Conoces algún compilador / intérprete de Haskell en línea que use la versión más reciente? haskell.org solo permite expresiones y no puede crear enlaces al código que ha ingresado.Octava , 39 bytes
Pruébalo en línea!
Esto utiliza un enfoque alternativo.
Por ejemplo,
n=1
estoA=triu(v'+0*v)
crea la matrizAl eliminar todos los elementos cero y agregar las columnas
A(A>0)
, obtenemos la secuencia:Entonces es solo una cuestión de extraer el
n
enésimo término de esa secuencia.fuente
Python ,
3936 bytes-3 bytes gracias a Dennis!
Una lambda recursiva que utiliza indexación basada en 1.
Pruébalo en línea!
Llevamos un registro del tamaño actual de "aumento" usando
m
. Sin
es menor o igual quem
, cabe dentro del "aumento" actual, y así lo devolvemos. Sin embargo, si es más grande quem
, lem
quitamos, que sumamos 1m
y llamamos a la función de forma recursiva (pasando al siguiente aumento).fuente
R, 25 bytes
El índice está basado en 1.
fuente
sequence
respuesta y me alegró verlo.Pyth ,
65 bytes¡1 byte guardado gracias a @TheBikingviking!
Esto usa indexación basada en 0.
Pruébalo en línea!
Explicación
fuente
.n
cons
.Mathematica,
2724 bytes¡Gracias @MartinEnder por 3 bytes!
1 indexado. Esto arroja errores que son seguros de ignorar.
Explicación
fuente
Join@@
es demasiado caro;)((r=Range)@r@#<>1)[[#]]&
StringJoin
no se evalúa ... Me gustabrainf * ck, 78 bytes
Toma entradas (basadas en 0) y salidas como valores de bytes.
Puedes probarlo aquí.
La entrada requiere un
\
número decimal anterior (por ejemplo,\10
para 10). Si la salida es un carácter ASCII imprimible, debería verlo. De lo contrario, presione ver memoria -> volcado final. El valor que se imprimió está en la tercera celda (celda número 2).Explicación:
Celda 0 (ENTRADA): es la entrada y se disminuye mi 1 cada vez a través del bucle.
Celda 1 (RESET): se incrementa en 1 cada vez que es igual a TERM. Para hacer esto, cada vez a través del ciclo sumamos 1 y si no son iguales restamos 1.
Celda 2 (TERM): aumenta en 1 cada ciclo y se establece en 0 si coincide con RESET. Para hacer esto, solo copio el valor de HOLD si esta celda no es igual a RESET.
Celda 3 (IGUAL): se utiliza para verificar si RESET y TERM son iguales.
Celda 4 (RETENER): se usa para copiar los valores de RESET y TERM de nuevo después de la verificación de igualdad.
fuente
Pyke, 6 bytes
Pruébalo aquí!
0 indexado.
fuente
R,
4341 bytesEditar: Encontró un enfoque recursivo más corto utilizando A002262 + 1 (0 indexado):
Versión antigua:
Fórmula 1 indexada de OEIS.
fuente
Perl 6 , 21 bytes
0 indexado. Pruébalo en línea!
Cómo funciona:
Perl 6 , 21 bytes
0 indexado. Pruébalo en línea!
Cómo funciona:
fuente
Ninguna de estas soluciones es tan corta como la de JungHawn Min , pero son enfoques alternativos, que es algo que supongo. Ambas son funciones sin nombre que toman una entrada de entero positivo (1 indexado) y devuelven un entero positivo.
Mathematica, 30 bytes
¡Una fórmula matemática real para esta función! Hecho más legible (en parte mediante la traducción de los caracteres 3-byte
⌈
,√
y⌉
):Ceiling[Sqrt[2 * #] - 1/2]
nos dice a qué sublista se refiere la entrada, de la cual restamos una para decirnos qué sublista termina antes de llegar a la entrada; luego((#^2 + #) / 2 &)
calcula cuántos elementos ocurren en todas las sublistas antes de la que nos interesa, que restamos de la entrada#
para obtener nuestra respuesta. (Algunos notarán la fórmula familiar(#^2 + #) / 2
para el#
número triangular th;Ceiling[Sqrt[2 * #] - 1/2]
es esencialmente la función inversa).Mathematica, 32 bytes
Solución recursiva, básicamente la misma que en la respuesta de Billywob y otras.
fuente
Brain-Flak , 46 bytes
Cero indexado
Pruébalo en línea!
Pila limpia, 48 bytes
Pruébalo en línea!
Explicación
Esta es una versión modificada de la función de módulo . En lugar de utilizar un número constante como divisor, incrementa el divisor cada vez que se sustrae el divisor (una vez por iteración de bucle externo).
Código anotado
fuente
Java 8,
857355 bytesEnfoque recursivo indexado en 0 con la fórmula proporcionada en el OEIS :
Pruébalo aquí
Respuesta anterior (
8556 bytes):Usó la otra fórmula indexada en 0 proporcionada en el OEIS :
Pruébalo aquí
fuente
Perl , 30 bytes
29 bytes de código +
-p
bandera.Pruébalo en línea!
fuente
MATL, 8 bytes
Esta solución utiliza indexación basada en 1
Pruébalo en MATL Online
Explicación
fuente
v
después]
QBIC , 21 bytes, 1 indexado
Explicación:
Enfoque un poco más interesante, pero 10 bytes más:
Este programa calcula continuamente el número total de números en este paréntesis y todos los anteriores (
1 at loop 1, 3 at loop 2, 6 at loop 3 ...
). Cuando ese contador excede el índice N buscado, entonces devuelve X desde el soporte actual, donde X es N menos la cantidad anterior del contador.fuente
Rubí, 30 bytes.
Indexación basada en 1
fuente
R, 37 bytes
Toma información de
n
y crea la secuencia para las primerasn
secuencias. Esto lo hace algo ineficiente en entradas más altas, pero debería estar bien. Luego devuelve lan
entrada -th, 1-indexada.Utiliza un pequeño truco al comenzar la secuencia con
T
, que esTRUE
o1
por defecto.fuente
C11, 48 bytes
Pruébalo en línea!
También funciona en C ++ y Java.
Una alternativa para el mismo conteo de bytes:
fuente
brainfuck, 141 bytes
Sé que soy demasiado tarde para la recompensa, pero solo quería ver cuántos bytes el algoritmo que pensé terminaría siendo.
Este programa está indexado a cero.
Pruébalo en línea
255
, cambie el Tamaño de celda (Bits) a 16 o 32 .\5
para entrada de5
.\999
Explicación:
Esto muestra el programa dividido por pasos, que muestra lo que sucede para la entrada de
5
.#
se colocan en las ubicaciones de volcado de memoria ideales para el intérprete.Probablemente desee usar la casilla de verificación Volcar memoria en char:
#
si ejecuta esta versión. Esto volcará la memoria al golpear#
, permitiéndole ver el valor en la cinta en caso de que sea un carácter no imprimible, o ver qué sucede en cualquier paso que desee. La celda en la que está el puntero estará en negrita.Pruébalo en línea
#
Notas:
>
al comienzo. El número requerido puede variar según el valor de entrada, pero es O (1).fuente
tinylisp (repl), 90 bytes (indexado 0)
O, no compitiendo (usando una función que se confirmó después de que se publicó este desafío), 80 bytes :
La primera línea define una función auxiliar
r
, y la segunda línea es una función sin nombre que toman
y devuelve el enésimo término de la secuencia. He especificado esto como un envío de respuesta porque la respuesta completa automáticamente los paréntesis al final de cada línea, no solo al final del programa. Con esas advertencias, aquí hay una versión modificada para que funcione en Pruébelo en línea , y aquí hay una versión no protegida que se ejecuta contra las entradas 0 a 54.Explicación
Usaré la versión no competitiva aquí. La única diferencia es que la versión oficial tiene que implementar la suma como dos restas.
fuente
C, 54 bytes
No es la solución C más corta, pero tiene el mérito de ejecutarse en tiempo constante (sin bucles, solo matemática). Utiliza indexación basada en cero:
Sin golf:
Prueba con:
fuente
C, 103 bytes
Para un principiante está bien, creo :).
o la forma formateada
fuente
n,c,i,j
como globales, se garantiza que se inicializan a 0, lo que no es cierto para los locales.n
es la entrada o el número n de la secuencia,c
es un contadori
yj
son elementos de bucle;j
será 1, luego 2, luego 3, mientrasi
que será 1, luego 1,2, luego 1,2,3 y así sucesivamente. @ Qwerp-DerpCC , 21 bytes, indexación basada en 0
¡Prueba el programa de cc en línea!
Explicación:
La parte superior de la pila ahora contiene el índice k del mayor número triangular que es <= n.
Este programa de CC se puede convertir en un script bash de tamaño competitivo:
Utilidades Bash + Unix, 28 bytes, indexación basada en 0
¡Prueba el programa bash en línea!
fuente
C,
8144 bytesmétodo iterativo directo, 0 indexado y con un ligero masaje;
Pruébalo en línea!
fuente