Contemos...
Cuenta hasta 2 y vuelve a 1
Cuenta hasta 4 y vuelve a 1
Cuenta hasta 6 y vuelve a 1
... ok, lo tienes ...
junta todo esto y obtendrás la siguiente secuencia
{1,2,1,2,3,4,3,2,1,2,3,4,5,6,5,4,3,2,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,2,3...}
Desafío
Dado un entero n>0
para 1 indexado (o n>=0
para 0 indexado), genera el enésimo término de esta secuencia
Casos de prueba
Input->Output
1->1
68->6
668->20
6667->63
10000->84
Reglas
su programa debe poder calcular soluciones de hasta n = 10000 en menos de un minuto
Este es el código de golf , por lo que gana el código más corto en bytes.
Respuestas:
JavaScript (ES7),
59 ... 4443 bytesGuardado 1 byte gracias a Titus
Entrada esperada: 1 indexado.
Inicialmente inspirado por una fórmula para A004738 , que es una secuencia similar. Pero terminé reescribiéndolo por completo.
Casos de prueba
Mostrar fragmento de código
¿Cómo?
La secuencia se puede organizar como un triángulo, con la parte izquierda en orden ascendente y la parte derecha en orden descendente.
A continuación se muestran las primeras 4 filas, que contienen los primeros 32 términos:
Ahora, introduzcamos algunas variables:
Comenzamos con 2 elementos en la parte superior y agregamos 4 elementos en cada nueva fila. Por lo tanto, el número de elementos en la fila r indexada en 0 se puede expresar como:
La posición inicial x indexada 1 de la fila r viene dada por la suma de todos los términos anteriores en esta serie aritmética más uno, lo que conduce a:
Recíprocamente, dada una posición indexada 1 n en la secuencia, la fila correspondiente se puede encontrar con:
o como código JS:
Una vez que conocemos r (n) , restamos la posición inicial x (r) menos uno de n :
Comparamos n con a (r) / 2 + 1 = 2r + 2 para determinar si estamos en la parte ascendente o en la parte descendente:
Si esta expresión es verdadera, devolvemos n . De lo contrario, devolvemos 4 (r + 1) - n . Pero dado que r ya se incrementó en la última declaración, esto se simplifica como:
fuente
Haskell , 37 bytes
Pruébalo en línea!
Indexado a cero. Genera la lista e indexa en ella. ¡Gracias a Ørjan Johansen por guardar 2 bytes!
Haskell , 38 bytes
Pruébalo en línea!
Indexado a cero. Genera la lista e indexa en ella.
Haskell , 39 bytes
Pruébalo en línea!
Indexado a cero. Un método recursivo.
fuente
Python , 46 bytes
Pruébalo en línea!
Cero indexado.
fuente
Casco , 8 bytes
1 indexado. Pruébalo en línea!
Explicación
fuente
Perl 6 , 29 bytes
Pruébalo en línea
Basado en 0
Expandido:
La secuencia interna
1...$+=2...2
producePara que esté basado en 1, agregue
0,
antes del segundo{
o agregue-1
después$_
fuente
R, 64 bytes
Función que toma un argumento
n
. Crea un vector2:n
con incrementos de 2. Para cada uno de estos, se crea el vector1:(x-1)
yx:2
. Esto en total será más largo quen
. Lo tenemosunlist
, para obtener un vector y tomar lan
entrada enésima.fuente
1:n*2
lugar deseq(2,n,2)
? ¡Será más grande de lo que necesitas, pero eso debería estar bien! Además, no creo que esto haya funcionadoseq(2,n,2)
den=1
todos modos.Python 2 , 56 bytes
Pruébalo en línea!
Esto está indexado a 0.
-1 byte gracias a @JustinMariner
Cómo funciona esto
Observamos que el 1º
n
grupo indexado (1, 2, ... 2n ..., 2, 1
) se produce a partir de elementos numerados del 0 indexado2(n-1)^2
a2n^2
.Para encontrar el elemento en el índice
x
, podemos encontrar el número de grupon
quex
está dentro. A partir de eso, calculamos la distancia desde el centro del grupo quex
está. (Esta distancia esabs(2*n**2+2*n+2-x)
).Sin embargo, dado que los elementos disminuyen más lejos del centro de un grupo, restamos la distancia del valor máximo del grupo.
fuente
print 2*n-abs(2*n*n+2*n+1-x)+2
-2*n*n+2*n
puede ser2*n*-~n
y+2+2*n
puede convertirse-~n*2
, lo que nos permite moverlo al principio, lo que ahorra bytes ( 53 bytes )05AB1E , 8 bytes
Código:
Utiliza la codificación 05AB1E . Pruébalo en línea!
Explicación:
fuente
€1
es raro ...JavaScript, 39 bytes
fuente
Gelatina ,
10, 9 bytesPruébalo en línea!
También 1 indexado, y termina bastante rápido.
¡Un byte guardado gracias a @ErikTheOutgolfer!
Explicación:
Hipotéticamente, digamos que input (
a
) es 3.fuente
Ḥ€ŒḄ€Ṗ€Fị@
, por lo que puede usarµ€
para -1 (tres o más mónadas€
al comienzo):ḤŒḄṖµ€Fị@
ḤŒḄṖ
<newline>½ĊÇ€Fị@
para que 12 cumpla con el requisito de 10,000 (ejecutar el código de 9 bytes localmente toma aproximadamente 2:20 en mi i7 y usa 7GB)MATL , 15 bytes
Basado en 1.
Pruébalo en línea!
Esto agota el tiempo para los casos de prueba más grandes en TIO, pero termina a tiempo en mi computadora de escritorio (compilador que se ejecuta en MATLAB R2017a). Para mostrar el tiempo transcurrido, agregue
Z`
al final del código.Explicación
El código genera muchos más términos de los necesarios. Específicamente, calcula
n
"piezas" de la secuencia, donde cada pieza es un conteo ascendente y de regreso a 1.fuente
Casco ,
1210 bytesPruébalo en línea!
1 indexado, funciona bastante rápido
Explicación
fuente
…
Mathematica, 90 bytes
Pruébalo en línea!
fuente
Retina , 62 bytes
Pruébalo en línea! El enlace incluye casos de prueba. La entrada está indexada en 1. La primera etapa es solo conversión decimal a unaria. La segunda etapa encuentra el número cuadrado más alto
s
estrictamente menos de la mitad den
;$1
ess²
, mientras$2
es2s-1
. Calcula dos valores, primero el número de números en la ejecución actual ascendente / descendente, que es4(s+1) = 4s+4 = 2$2+6
, y en segundo lugar, la posición dentro de esa ejecución, que esn-2s² = n-(2$1+1)+1 = n-$&+1
, que solo requiere un1
compensar lo1
utilizado para hacer cumplir la estricta desigualdad. La etapa final cuenta desde esa posición hasta el inicio y el final de la carrera y toma el resultado más bajo y lo convierte a decimal.fuente
Mathematica, 67 bytes
Pruébalo en línea!
fuente
Perl 5 , 43 + 1 (-p) = 44 bytes
Pruébalo en línea!
Estaba trabajando en una fórmula para calcular el enésimo elemento directamente. Luego vi que @ fireflame241 había hecho ese trabajo, y lo jugué en Perl.
# Perl 5 , 50 + 1 (-n) = 51 bytesPruébalo en línea!
Los resultados son 0 indexados.
fuente
Haskell ,
11581 bytesPruébalo en línea!
Aquí hay algo de magia. Sin embargo, probablemente podría ser más corto si usara un enfoque normal.
Explicación
Primero definimos
%
.%
es una función que toma dos variablesx
, yy
. Construye una listascanl(+)y[y+1,y+3..]
y encuentra el primer elemento de esa lista mayor quex
.scanl(+)
solo realiza sumas iterativas, para obtener los números triangulares que haríamosscanl(+)0[1..]
, para obtener los números cuadrados que haríamosscanl(+)0[1,3..]
. Las dos listas en particular que construiremos sonscanl(+)2[3,5..]
yscanl(+)1[2,4..]
estos son los puntos de inflexión del patrón.Ahora definimos la función principal
g
que toma unx
. Six
es uno, lo devolvemos1
porque ese es el primer valor. De lo contrario, verificamos los siguientes dos puntos de inflexión; si la inflexión descendente es mayor1%x>2x
, devolveremos el sucesor o, de log$x-1
contrario, devolveremos el predecesor deg$x-1
.Ok, pero ¿por qué funciona eso?
En primer lugar, "¿Cuál es la forma en que encontramos vértices?". Es importante tener en cuenta la distancia entre vértices consecutivos del mismo tipo. Notarás que las diferencias aumentan en 2 cada vez. Esto tiene sentido porque las bases de los triángulos se ensanchan en 2 cada vez. Podemos hacer una diferencia constante de la lista usando una lista literal como esta
[2,4..]
y usamosscanl(+)
convertir estas listas en nuestras listas de vértices, en función de la ubicación del primer vértice y la primera diferencia.Entonces, ahora que tenemos una forma de encontrar vértices hacia arriba y hacia abajo, podemos usar esa información para obtener los valores. Decimos que el primer valor es, de lo
1
contrario, tenemos que tomar el sucesor o el predecesor. Si el siguiente vértice es ascendente, queremos tomar el predecesor; de lo contrario, tomamos el sucesor.Haskell ,
565146 bytesAquí está mi mejor solución con menos matemáticas y menos bytes.
Pruébalo en línea!
fuente
Pyke , 14 bytes
Pruébalo aquí!
fuente
C # (.NET Core) , 120 bytes
Explicación: bastante simple, el primer bucle anidado sube a nuestro máximo, el segundo vuelve a bajar a 2. La repetición para cada múltiplo de 2.
Pruébalo en línea!
fuente
Ruby ,
7875 bytesGuardado 1 byte gracias a Step Hen
Guardado 1 byte gracias al Sr. Xcoder
Pruébalo en línea!
Espero poder obtener algunos consejos para reducir más el bytecount. Traté de adoptar un enfoque simple.
fuente
c=1 if
se puede jugar al golfc=1if
->n{a=0;b=2;c=1;n.times{if a==b then c=0;b+=2;end;c=1if a==1;a+=c<1?-1:1};a}
Java (OpenJDK 8) , 53 bytes
Pruébalo en línea!
-2 bytes gracias a Nevay.
1 indexado.
TL; DR Dividimos la secuencia en trozos convenientes, encontramos que el trozo
n
está adentro, luego encontramos lanth
posición en el trozo.Aquí, podemos dividir la secuencia como
[[1,2],[1,2,3,4,3,2],[1,2,3,4,5,6,5,4,3,2],...]
, lo que nos da tamaños de fragmentos de4i-2
. Comenzando coni=2
, restamosi
den
, esencialmente moviendo hacia arriba un trozo a la vez. Una vez que satisfacemosn<=i
, sabemosn
que ahora es la posición del valor correcto en el fragmento actual.Luego obtenemos el valor comparándolo
n
coni
el tamaño del fragmento. El punto medio de cada fragmento es igual ai/2+1
; sin
es menor que esto, simplemente regresamosn
. Sin
es mayor, volvemosi-n+2
.Ejemplo
fuente
+1
,return n>i/2?i-n+2:n
es suficiente.Python 2 , 5! bytes (120 bytes: P)
Pruébalo en línea!
Directo, hace la lista y luego toma el elemento input
fuente
Python 3 ,
184156bytesPruébalo en línea!
Golf con generador de Python para evaluación "perezosa"
fuente
QBIC , 47 bytes
Explicación
fuente
Röda , 54 bytes
Pruébalo en línea!
Llamar con:
try f(n)
Esta función devuelve rápidamente la respuesta, pero luego realiza algunos cálculos innecesarios y finalmente se queda sin memoria.
Como la función devuelve la respuesta real poco después de ser llamada (claramente menos de un minuto), creo que esta respuesta es válida.
(En Röda, las funciones pueden devolver valores antes de que salgan debido al paralelismo).
fuente
C # (.NET Core) ,
99 9586 bytesPruébalo en línea!
Función lambda que toma y devuelve un entero. Bucle único que maneja el conteo hacia arriba y hacia abajo.
fuente
PHP, 65 + 1 bytes
Ejecútelo como tubería
-R
o pruébelo en línea (o elimine el comentario de una de las otras versiones).Un puerto de JavaScript recursivo de tsh toma 66 bytes:
La solución de un puerto de Arnauld requiere 62 + 1:
Un puerto golfizado de Java de Xanderhall tiene el código más corto hasta ahora (55 + 1 bytes):
fuente
Pyth ,
1918 bytesPruébalo aquí!
fuente