É do conhecimento antigo que todo número inteiro não negativo pode ser reescrito como a soma de quatro números inteiros ao quadrado. Por exemplo, o número 1 pode ser expresso como . Ou, em geral, para qualquer número inteiro não negativo , existem números inteiros tais que
Joseph-Louis Lagrange provou isso na década de 1700 e, portanto, costuma ser chamado de Teorema de Lagrange .
Isso às vezes é discutido em relação aos quaternions - um tipo de número descoberto por William Hamilton nos anos 1800, representado como
Rudolf Lipschitz estudou quaternions com apenas componentes inteiros, chamados quaternions Lipschitz. Usando quadrance, podemos imaginar que todo quaternário de Lipschitz pode ser considerado um amigo nos números inteiros. Por exemplo Quatérnion pode ser pensada como estando associadas com o número inteiro . Além disso, se recuarmos, todo número inteiro pode ser considerado como tendo um amigo nos quaternions de Lipschitz.
Mas há um detalhe interessante do teorema de Lagrange - a soma não é única. Cada número inteiro pode ter vários conjuntos diferentes de quatro quadrados que podem ser somados para criá-lo. Por exemplo, o número 1 pode ser expresso de quatro maneiras, usando números inteiros não negativos (consideremos não negativos para este desafio):
Os summands são sempre quadrados de 0 ou 1, mas podem estar em posições diferentes na expressão.
Para esse desafio, vamos também "classificar" nossas somas mais baixa para mais alta, para eliminar duplicatas, para que possamos considerar, para este exercício, que 1 só tem uma maneira de ser representada como a soma de quatro quadrados:
Outro exemplo é o número 42, que pode ser expresso de quatro maneiras (novamente, considerando apenas as negativas a, b, c, d e eliminando arranjos de componentes duplicados)
E se imaginarmos cada uma dessas maneiras diferentes de expressar um número inteiro como associadas a um quaternion específico? Então poderíamos dizer que o número 42 está associado a esses quatro quaternions:
Se imaginarmos a interpretação padrão de computação gráfica de um quaternion, onde , e são vetores no espaço euclidiano tridimensional e, portanto, os componentes , e do quaternion são coordenadas cartesianas tridimensionais , então podemos imaginar que cada inteiro, através desse processo de pensamento, pode ser associado a um conjunto de coordenadas tridimensionais no espaço. Por exemplo, o número 42 está associado às quatro coordenadas a seguir :
Isso pode ser pensado como uma nuvem de pontos ou um conjunto de pontos no espaço. Agora, uma coisa interessante sobre um conjunto de pontos finitos no espaço é que você sempre pode desenhar uma caixa delimitadora em torno deles - uma caixa grande o suficiente para caber em todos os pontos, mas não maior. Se você imaginar a caixa como uma caixa comum alinhada com os eixos , ela será chamada de caixa delimitadora alinhada ao eixo . A caixa delimitadora também possui um volume calculável determinando sua largura, comprimento e altura e multiplicando-os.
Podemos então imaginar o volume de uma caixa delimitadora para os pontos formados por nossos quaternions. Para o número inteiro 1, temos, usando os critérios deste exercício, um quaternion cuja quadrância é 1, . Esta é uma nuvem de pontos muito simples, possui apenas um ponto, portanto, a caixa delimitadora tem o volume 0. Para o número inteiro 42, no entanto, temos quatro quaternions e, portanto, quatro pontos, em torno dos quais podemos desenhar uma caixa delimitadora. O ponto mínimo da caixa é e o máximo é resultando em uma largura, comprimento e altura de 2, 2 e 2, resultando em um volume de 8.
Digamos que, para um número inteiro , o qvolume seja o volume da caixa delimitadora alinhada ao eixo de todos os pontos 3D formados por quaternions que possuem uma quadrante igual a , onde os componentes do quaternion são não negativos e .
Crie um programa ou função que, dado um número inteiro não negativo , produza o volume q de .
Exemplos:
input -> output
0 -> 0
1 -> 0
31 -> 4
32 -> 0
42 -> 8
137 -> 96
1729 -> 10032
Este é o código-golfe, o menor número de bytes ganha.
fonte
Respostas:
Wolfram Language (Mathematica) ,
6758 bytesExperimente online!
fonte
Geléia , 17 bytes
Experimente online! (muito lento - torná-lo rápido o suficiente para todos os casos de teste com um líder
½
)Quão?
fonte
Haskell ,
132123 bytesExperimente online!
Solução bastante simples. Força bruta de todas as soluções possíveis, iterando sobre todos os valores de 0 a n (excedente de maneira, mas menor por conta). Eu mostro o ponto como uma lista para que possamos usar o
(!)
operador mágico de @ Lynn . Esse operador reduz cada dimensão com a função no lado esquerdo,max!p
retornando uma lista do tamanho 3, que consiste nos máximos ao longo de cada dimensão emin!p
faz o mesmo no mínimo. Em seguida, encontramos o tamanho mínimo em cada dimensão (subtraindo o valor mínimo do máximo porz(-)
) e multiplicando-o.Muito obrigado a @Lynn por tirar 9 bytes com alguma mágica dobrável de zip!
fonte
zipWith
lógica. 123 bytesMarreta 0,2, 12 bytes
Use com o Mathematica 11.2 e esta versão do Sledgehammer, que antecede o desafio. Consulte o histórico de edições para obter uma versão que funciona na versão 0.3, que possui uma GUI e gera uma expressão do Mathematica.
Isso empurra a entrada para a pilha e chama a sequência de comandos
que é equivalente a avaliar o seguinte código Wolfram derivado da minha resposta no idioma Wolfram :
Experimente online!
fonte
Python 2 , 138 bytes
Experimente online!
Gera recursivamente os quaterniões classificados de forma inversa com a norma especificada e, em seguida, leva o produto entre o máximo e o mínimo de todos os valores possíveis nos três primeiros índices.
itertools
poderia ter tido uma chance se não usasse nomes ridiculamente longos comoitertools.combinations_with_replacement
Python 2 , 161 bytes
Experimente online!
É por isso que
itertools
nunca é a resposta .fonte
JavaScript (ES6),
148143 bytesExperimente online!
Comentado
Inicializamos uma matrizr com 3 matrizes vazias.
Para cada valor válido dex , definiremos como 1 o valor em x + 1 na primeira matriz. O mesmo vale paray e z com a segunda e a terceira matrizes, respectivamente.
As dimensões da caixa delimitadora serão deduzidas da distância entre a primeira e a última entrada definida como1 nessas matrizes.
Passo 1
Preencherr , usamos a função recursiva g .
Passo 2
Agora podemos calcular o produtop das dimensões.
fonte
C # (compilador interativo do Visual C #) , 229 bytes
Experimente online!
fonte
05AB1E , 18 bytes
Experimente online!
Resposta da geléia do porto de Jonathan Allan .
fonte
Haskell , 108 bytes
Experimente online! (atinge o tempo limite nos casos de teste maiores)
Há algumas otimizações estranhas aqui. Para calcular
maximum l-minimum l
a listal
de elementos em uma determinada posição, fica mais curto no contexto convertê-los ao máximo negando o segundo termo:maximum l+maximum(map((-1)*))l
ou equivalentesum[maximum$map(b*)l||b<-[-1,1]]
.Para multiplicar as três dimensões, é mais curto escrever o produto
f n=n%0*n%1*n%2
do que usar qualquer tipo de loop. Aquin%i
está a diferença entre o mínimo e o máximo dosi
valores da quinta coordenada, que são extraídos com a indexação!!i
.Para gerar as quatro tuplas válidas, tomamos listas de quatro números
[0..n]
cujos quadrados somamn
e estão em ordem decrescente. Verificamos a ordem inversa det
comscanr1 max t==t
, que verifica se o máximo de execução reversa é ele próprio, pois Haskell não possui uma classificação interna sem uma importação dispendiosa. Tentei várias maneiras de gerar recursivamente as quatro tuplas, como nas minhas respostas em Python, mas elas eram todas mais longas que essa maneira de gerar e filtrar de força bruta.fonte