Su tarea es, con un número de entrada p
, encontrar el número de orden de bala de cañón positivo más pequeño p
que NO sea 1.
Definición
Un número de bala de cañón (de orden p
) es un número que es ambos:
- Un
p
número-gonal ( Ver esta página ). y un
p
número de pirámide gonal.- El
n
número de lap
pirámide th- gonal es la suma de los números 1 ° an
th-p
gonal.- (por ejemplo
4th square pyramid number = 1 + 4 + 9 + 16 = 30
)
- (por ejemplo
La siguiente imagen representa el número de la 4ta pirámide cuadrada, como una pirámide cuadrada.
Para más información, visite este enlace .
- El
El número de bala de cañón de orden 3, por ejemplo, es 10, porque es:
- El cuarto número de triángulo (
1 + 2 + 3 + 4 = 10
) - y el tercer número de pirámide triangular. (
1 + 3 + 6 = 10
)
Fórmulas
NOTA: Si puede encontrar (o hacer) fórmulas más útiles que las mías aquí, publíquelas aquí (o envíeme un mensaje sobre el tema de chat de preguntas).
- Si está interesado, la fórmula para el
n
númerop
gonal es:
- Y el
n
número de lap
pirámide th- gonal es:
Especificaciones
p
se garantiza que sea mayor que 2.- El programa debe verificar los valores para una solución de
p
hasta (e incluyendo)2^16
. Su programa puede hacer cualquier cosa si no se encuentran soluciones parap
. - Solo índices positivos para
n
.
Casos de prueba
3
salidas10
(4 ° número de triángulo, 3 ° número de pirámide de triángulo)4
salidas4900
(número cuadrado 70, número piramidal cuadrado 24)
Este es el código de golf, por lo que la respuesta más corta en bytes gana.
Nota: Si publica una solución, incluya una descripción de cómo funciona el código.
¿Debo comenzar una recompensa por una solución que sea mejor y no use mis fórmulas?
n
? Si no, ¿cuál es el rangon
que usará?n
Losn
números de pirámides gonales y gonales no deberían necesitar definición.Respuestas:
Python 3,
129127bytesUna función que toma la entrada a través del argumento y devuelve la salida.
Esta es una fuerza bruta extremadamente ingenua, y lleva mucho tiempo incluso para moderadamente grande
p
; el tiempo de ejecución será ridículo para cualquier cosa que se acerque al máximo dadop
de2^16
, pero no hay ninguna razón por la cual el programa no funcionaría, dado el tiempo suficiente.Probablemente hay formas mucho más cortas y rápidas de hacer esto, pero pensé que sería bueno publicar algo para comenzar esto.
Cómo funciona
El valor de retorno
x
se inicializa en2
, y luego el programa simplemente recorre todos los números piramidalesp
gonales yp
gonales hasta el ordenx
. Si los números piramidales actualesp
-gonales yp
-gonales, calculados usando las fórmulas, son iguales entre sí yx
, entonces,x
debe ser el número de bala de cañón relevante y se devuelve. De lo contrario,x
se incrementa y el programa intenta nuevamente el nuevo valor dex
.En términos de golf, se utiliza un producto cartesiano para colapsar los dos bucles for para los números piramidales
p
gonal yp
gonal en un solo bucle, y las fórmulas se factorizaron aún más para ahorrar unos pocos bytes.fuente
JavaScript,
11198 bytessin golf
c no se reinicializa en el bucle interno porque la siguiente p [b] es definitivamente más grande que la actual g [c] (por lo que tenemos que seguir adelante de todos modos)
ejemplos
fuente
C, 107 bytes
Sin golfista con parámetros de prueba:
Esto utiliza el hecho de que el número n-ésimo p-gonal se puede definir como
n(1+(p-2)(n-1)/2)
y el número de la pirámide es la suma de los números antes mencionados.Creo que se puede jugar más, dado que no es realmente necesario
a
guardar la variable .fuente
i
en tu fórmula el número imaginarioi
?i
se supone que esn
. Tenía una notación diferente llena de basura en mi investigación. No puedo imaginar el uso de un número imaginario para este problema, y definitivamente no puedo imaginar el uso en Cantiguo programa PHP,
115106bytes+16 para PHP actual, ver abajo
<scriptpath>?n=<number>
con PHP <5.4, agregar
register_globals=1
aphp.ini
(+18?)1
con$n=$_GET[n]
. O reemplazar1
con$n=$argv[1]
, correrphp -f <filename> <number>
.echo$p
condie(print$p)
+/- 0 para la función:
bucles para siempre si no encuentra nada. Reemplace
1
con$p<1e6
para romper a 100k o con$p<$p+1
un bucle hasta que el entero se desborde. (probado con PHP 5.6)ejemplos (en función)
ejemplos de salida
fuente