Aunque se han planteado desafíos relacionados , este es diferente para justificar su propia pregunta.
Reto
Dado un entero positivo, devuelve la secuencia más larga de enteros impares consecutivos positivos cuya suma es el entero dado. Si no existe tal secuencia, puede informar un error de cualquier manera que tenga sentido para su idioma, incluyendo devolver un valor falso o lanzar una excepción.
Casos de prueba
1 -> [1] 2 -> [] 3 -> [3] 4 -> [1, 3] 5 -> [5] 6 -> [] 9 -> [1, 3, 5] (tenga en cuenta que [9] no es una respuesta válida) 15 -> [3, 5, 7] 104 -> [23, 25, 27, 29] (tenga en cuenta que [51, 53] no es una respuesta válida)
Tanteo
Este es el código de golf , por lo que gana la respuesta más corta en cada idioma.
Respuestas:
Haskell,
6765636258 bytesGuardado 4 bytes gracias a Julian Wolf
Pruébalo en línea!
Puedo comprobar si el número se puede expresar como la diferencia de dos cuadrados:
m^2-n^2
. Entonces puede construir la lista de números impares consecutivos:[2n+1,2n+3...2m-1]
. Tenga en cuenta que debido a quen
se elige el mínimo , se generará la lista más largafuente
x
para ambosn
ym
Python 2 ,
6662 bytesSale con un RuntimeError (profundidad de recursión máxima excedida) si no hay solución.
Pruébalo en línea!
fuente
Jalea ,
1110 bytes-1 byte gracias a Dennis (use la construcción de rango implícita de
Ẇ
- reemplaceRm2Ẇ
conẆḤ’
)Un enlace monádico que devuelve una lista de los sumandos si es posible, o
0
si no.Pruébalo en línea!
¿Cómo?
fuente
ẆḤ’
Guarda un byte.JavaScript (ES7),
87868581 bytesDevuelve una lista de enteros delimitada por comas, o
0
si no existe una solución.¿Cómo?
Primero buscamos el cuadrado perfecto más pequeño s de modo que x = n + s sea otro cuadrado perfecto.
Si s existe, n es la diferencia x - s de 2 cuadrados perfectos, que puede escribirse como la diferencia de 2 secuencias de números impares consecutivos. Luego construimos la lista resultante.
Ejemplo:
Para n = 104 :
Encontramos s = 11² = 121 que satisface x = n + s = 225 = 15²
Luego:
15² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21 + 23 + 25 + 27 + 29
11² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 +
21104 = 15² - 11² = 23 + 25 + 27 + 29
Mostrar fragmento de código
fuente
n^2
siempre es igual a la suma de los primerosn
números impares? Huh, interesante05AB1E ,
98 bytes-1 byte gracias a Emigna
Explicación:
En una entrada no válida, no genera nada.
Pruébalo en línea!
fuente
ʒOQ}
en lugar deDO¹QÏ
guardar un byte.Haskell ,
6160 bytesGracias a @maple_shaft por eliminar 1 byte
Pruébalo en línea!
Utiliza el hecho de que la ejecución más larga siempre será la que comienza con el número más bajo.
Quería hacer algo con aritmética en lugar de fuerza bruta
k
, perofromInteger
parece matarlo.fuente
[1,3..n]
a[1,3..]
r?n=[r,r+2..n]
. Pruébalo en línea!Python , 67 bytes
Pruébalo en línea!
Copié mi respuesta del desafío de suma consecutiva anterior y cambié
+1
a+2
. ¿Quién sabía que el código de golf podría ser tan modular?Una estrategia extrañamente sencilla: busca el intervalo
R
con la suma deseada.R
.Como el extremo inferior del intervalo solo aumenta, se encuentran intervalos más largos antes que los más cortos. Si no se puede encontrar un intervalo posible, termina con IndexError.
fuente
JavaScript (ES6),
6564 bytesDevuelve una matriz si hay una solución, o 0 para ninguna solución.
Este es un campo de golf altamente ineficiente pero solución al problema.
Busca la primera solución usando
a-i
ei=1
, incluso si no funciona en la pila recursiva. Si esa solución no comienzai+2
, entonces buscamos recursivamente la primera solución usandoa
yi+2
.Sin golf
Casos de prueba:
Mostrar fragmento de código
Para tener una idea de cuán ineficiente es esto, la solución
f(104)
requiere 69.535 llamadas recursivas. La pila nunca tiene más de 51 niveles de profundidad, por lo que no hay problema con el desbordamiento de la pila.La solución
f(200)
requiere 8,6 millones de llamadas recursivas, con una pila de 99 niveles de profundidad. (Su solución es[11,13,15,17,19,21,23,25,27,29]
).Aquí hay una representación visual del programa en ejecución:
Mostrar fragmento de código
fuente
Python 2.7,
10910897 bytes11 bytes hacia abajo, gracias a Erik the Outgolfer.
Este es mi primer código de golf!
Cómo funciona
Usé la conocida identidad que
1 + 3 + 5 + ... + (2n - 1) = n²
Toma el caso de
15
En general, si hay x términos a partir de
2n + 1
, comoEs igual a
2nx + x²
Si
N
es el entero de entrada, el problema se reduce a encontrar el máximox
tal queEs una ecuación cuadrática con solución.
La secuencia más larga es una con la más grande
x
. El programa iteran
a partir0
deN
y cuando se encuentra quex
es un número entero, se crea una lista de(2n + 1) + (2n + 3) + (2n + 5) ... (2n + (2x-1))
y lo devuelve.fuente
Python 3,
19081 BytesGracias a @ovs y @ musicman523
fuente
print
falta paréntesisl.append(i)
simplemente usandol+[i]
en la llamada recursiva. Puede eliminarl.pop(0)
mediante el usol[1:]
de la llamada recursiva. Puede eliminar la llamadac
en la parte inferior utilizando argumentos de palabras clave en su lugar. Puede eliminar>0
en la línea 2. Finalmente, puede cambiar sus declaracionesif
yelse
en expresiones, utilizando la forma ternaria, que lo lleva a 92 bytes como una expresión lambda. Pruébalo en línea!i
hasta llegar a un total de 81 bytes .sum(l)>q else
aq<sum(l)else
ahorrar 1 byte.QBIC , 47 bytes
Esto intenta contar todos los números impares de uno hasta que su suma sea
n
. Si pasan
, reinicie el ciclo, aumente de 1 a 3 e intente nuevamente. Salga, imprimiendo 0, si al comienzo del ciclo nuestro número> n
.Explicación
fuente
R , 90 bytes
Pruébalo en línea!
Utiliza una función recursiva que prueba la suma acumulativa de la secuencia de y: x convertida en una secuencia de números impares. y se incrementa en cada recursión hasta que excede x. Se devolverá la primera secuencia que suma al objetivo.
fuente
Python 2 , 89 bytes
Una función sin nombre que toma un número entero positivo
n
, y devuelve el resultado si existe y genera un resultado diferenteIndexError
.Pruébalo en línea!
Crea una lista de todos los números impares relevantes con los
r(1,n+1,2)
que estárange(start=1, stop=n+1, step=2)
; crea todos los sub-cortes relevantes (más algunos vacíos) al dividir eso dei
inclusivo aj
exclusivo con[i:j]
acrossi
en [0, n) usandor(n)
yj
en [0, n] usandor(n+1)
(los vacíos cuandoi>=j
oi
está fuera de los límites); filtros para aquellos con la suma correcta conif sum(v)==n
; devuelve el primer segmento (y, por lo tanto, el más largo) usando[0]
.fuente
Python 2 ,
9190 bytes-1 byte gracias a @CMcAvoy
Pruébalo en línea!
fuente
Pyth, 11 bytes
Pruébalo aquí
fuente
PHP , 73 bytes
ninguna solución es un bucle infinito
Pruébalo en línea!
PHP , 83 bytes
no imprime nada sin solución
cada mod de entrada 4 == 2 no tiene solución
Pruébalo en línea!
fuente
Python 2 ,
122121119115 bytes-1 byte gracias a musicman523. -4 bytes gracias a Step Hen. jaja
Pruébalo en línea!
fuente
range
, ¡ Pruébelo en línea!Python 3 , 93 bytes
Pruébalo en línea!
Lo único que hice fue notar que
(s+e)*(2+e-s)==4*n
es equivalente asum(range(s,e+1,2))==n
, y aunque son del mismo tamaño cuandor=range
, el primero se puede colocar más cerca de laif
declaración.fuente
Python 3 , 185 bytes
Pruébalo en línea!
En cuanto a cómo funciona esto, traté de buscar una solución un poco más elegante que una simple búsqueda de fuerza bruta. Reorganicé la fórmula para la suma de una secuencia aritmética y apliqué la fórmula cuadrática para obtener la expresión
(1-a+((a-1)**2+4*s)**(.5))/2
, que aparece en el código. Lo que calcula la expresión es, dada una suma deseadas
y un primer término para secuencia aritméticaa
, la longitud de la secuencia. Estas longitudes se almacenan en un diccionario como valores para los primeros términos como claves.A continuación, todos los valores no enteros se eliminan del diccionario, ya que representan secuencias no válidas. A partir de ahí, se identifica el valor más grande
max(d.keys(), key=(lambda k: d[k]))
y con la secuencia de números impares en esa posición y en esa longitudlist(range(int(m),int(m+2*d[m]),2))
.Estoy buscando ayuda para jugar golf si ves algo. Estaba más interesado en ver qué tan bien podía hacerlo con un algoritmo no trivial; mi respuesta es casi el doble que la mejor solución de Python.
fuente
Mathematica, 56 bytes
Function
con el primer argumento#
.Table[n,{n,1,#,2}]
calcula la lista de números impares positivos menores o iguales que#
.Subsequences
devuelve todas las subsecuencias de esa lista ordenadas al aumentar la longitud. Luego tomamos la secuencia deCases
coincidenciasx_/;Tr@x==#
, es decir, dex
tal manera que su sumaTr@x
es igual a la entrada#
. Luego tomamos laLast
secuencia.fuente
JavaScript (ES6), 72 bytes
Devuelve una cadena separada por espacios de números impares o arroja entradas no válidas. Versión de 84 bytes que devuelve una matriz (vacía cuando corresponde):
Explicación: Basado libremente en la solución awk de @ Cabbie407 para Sumas de enteros consecutivos, excepto que pude guardar algunos bytes mediante la recursión.
fuente
PHP, 78 bytes
bucle infinito si no hay solución. insertar
?$b>$argn+2?$n=[]:1:0
después$s-$argn
para imprimir matriz vacía en su lugar.Ejecutar
-nR
o probarlo en línea .fuente
C # (.NET Core) , 129 bytes
Emite números en una cadena, espacio delimitado (cualquier otro carácter solo requeriría cambiar el
" "
). La entrada sin solución devuelve una cadena vacía (aunque si se ejecuta para siempre sin error es una forma válida de indicar que no hay solución, se podrían guardar 17 bytes eliminandoif(b==e)return"";
).Algoritmo es:
fuente
(i)=>
comoi=>
C ++, 157 -> 147 bytes
-10 Bytes gracias a DJMcMayhem
devolverá 0 si no hay respuesta, 1 de lo contrario
la última línea que imprime es la respuesta
sin golf:
este es mi primer código de golf ^^
fuente
int v=0;
lugar deint v;....v=0;
y si hizo que su línea Newline delimitada, podría hacerstd::cout<<k<<"\n";
y luego eliminar la segunda línea nueva por completoKotlin, 152 bytes
Pruébelo en línea (espere de 4 a 5 segundos, el compilador es lento)
Sin golf
fuente
Excel VBA, 139 bytes
Sub
rutina que toma la entradan
del tipo entero esperado e informa la secuencia más larga de números impares consecutivos a la celda[A1]
fuente