Sua tarefa é, com um número de entrada p
, encontrar o menor número positivo de bala de canhão da ordem p
NÃO 1.
Definição
Um número de bala de canhão (de ordem p
) é um número que é ambos:
- Um
p
número diagonal ( consulte esta página ). e um
p
número de pirâmide -gonal.- O número da pirâmide
n
th-p
diagonal é a soma dos números do 1º aon
th-p
diagonal.- (por exemplo
4th square pyramid number = 1 + 4 + 9 + 16 = 30
)
- (por exemplo
A figura abaixo representa o número da quarta pirâmide quadrada, como uma pirâmide quadrada.
Para mais informações, visite este link .
- O número da pirâmide
O número da bala de canhão da ordem 3, por exemplo, é 10, porque é:
- O quarto número do triângulo (
1 + 2 + 3 + 4 = 10
) - e o terceiro número da pirâmide triangular. (
1 + 3 + 6 = 10
)
Fórmulas
NOTA: Se você pode encontrar (ou criar) fórmulas mais úteis do que as minhas aqui, por favor poste aqui (ou me envie uma mensagem sobre o assunto do chat).
- Se você estiver interessado, a fórmula do número
n
th-p
diagonal é:
- E o número da pirâmide
n
th-p
diagonal é:
Especificações
p
é garantido ser maior que 2.- O programa deve verificar os valores de uma solução para
p
até (e inclusive)2^16
. Seu programa pode fazer qualquer coisa se nenhuma solução for encontradap
. - Somente índices positivos para
n
.
Casos de teste
3
saídas10
(número do 4º triângulo, número da pirâmide do 3º triângulo)4
saídas4900
(70º número quadrado, 24º número quadrado da pirâmide)
Isso é código-golfe, então a resposta mais curta em bytes vence.
Nota: Se você publicar uma solução, inclua uma descrição de como o código funciona.
Devo começar uma recompensa por uma solução que seja melhor e que não use minhas fórmulas?
n
? Caso contrário, qual é o alcance quen
você usará?n
osn
números das pirâmides -gonal e -gonal não precisam ser definidos.Respostas:
Python 3,
129127 bytesUma função que recebe entrada via argumento e retorna a saída.
Essa é uma força bruta extremamente ingênua e leva muito tempo até para moderadamente grande
p
; o tempo de execução será ridículo para qualquer coisa que se aproxime do máximo especificado parap
of2^16
, mas não há razão para que o programa não funcione, com tempo suficiente.Provavelmente existem maneiras muito mais curtas e rápidas de fazer isso, mas achei que seria bom postar algo para começar.
Como funciona
O valor de retorno
x
é inicializado e2
, em seguida, o programa simplesmente faz um loop sobre todos os números piramidais -gonalp
ep
-onal até a ordemx
. Se os números piramidais -gonalp
e -onal atuaisp
, calculados usando as fórmulas, são iguais entre si e parax
, entãox
deve ser o número relevante da bala de canhão e isso é retornado. Senão,x
é incrementado e o programa tenta novamente o novo valor dex
.Em termos de golfe, um produto cartesiano é usado para recolher os dois loops for-
p
fores para osp
números piramidais -gonal e -onal em um único loop, e as fórmulas foram fatoradas ainda mais para economizar alguns bytes.fonte
JavaScript,
11198 bytesdestroçado
c não é reinicializado no loop interno porque o próximo p [b] é definitivamente maior que o atual g [c] (então temos que seguir em frente de qualquer maneira)
exemplos
fonte
C, 107 bytes
Sem jogar com parâmetros de teste:
Isso usa o fato de que o n-ésimo número p-gonal pode ser definido como
n(1+(p-2)(n-1)/2)
e o número da pirâmide é a soma dos números mencionados acima.Eu acho que pode ser ainda mais jogado, já que não é realmente necessário que a variável
a
seja salva.fonte
i
da sua fórmula está na sua fórmulai
?i
deveria sern
. Eu tinha anotações diferentes espalhadas em minha pesquisa. Eu não posso imaginar o uso de um número imaginário para este problema, e eu definitivamente não pode imaginar usá-lo em C.programa PHP antigo,
115106 bytes+16 para o PHP atual, veja abaixo
<scriptpath>?n=<number>
com PHP <5.4, adicione
register_globals=1
aphp.ini
(+18?)1
por$n=$_GET[n]
. Ou substitua1
por$n=$argv[1]
, executephp -f <filename> <number>
.echo$p
pordie(print$p)
+/- 0 para a função:
laços para sempre se não encontrar nada. Substitua
1
por$p<1e6
para quebrar a 100k ou por$p<$p+1
para repetir até que o número inteiro exceda. (testado com PHP 5.6)exemplos (na função)
saída de exemplos
fonte