A forma N-Dimensional mais simples que se pode criar para qualquer dimensão é um Simplex , e esse é um conjunto de pontos N + 1, todos à mesma distância um do outro.
Para 2 dimensões, este é um triângulo equilátero, para 3 dimensões, um tetraedro regular, em 4 dimensões é a 5-célula e assim por diante.
O desafio
Dada uma dimensão Inteira N como entrada, produza pontos Array / List / Stack / Whatever de N Dimensional que representam um Simplex desta dimensão. Ou seja, N + 1 vértices com distância igual e diferente de zero um do outro.
Implementação de referência em Lua
Exemplos
1 -> [[0], [1]]
2 -> [[0, 0], [1, 0], [0.5, 0.866...]]
4 -> [[0, 0, 0, 0], [1, 0, 0, 0], [0.5, 0.866..., 0, 0], [0.5, 0.288..., 0.816..., 0], [0.5, 0.288..., 0.204..., 0.790...]]
Notas
- A entrada é um número em qualquer formato padrão e sempre será um número inteiro maior que 1 e menor que 10
- A codificação é permitida para a entrada de 1, mas nada maior.
- Erro razoável é permitido na saída. Problemas com aritmética ou ponto trigonométrico de ponto flutuante podem ser ignorados.
- Qualquer transformação do simplex dimensional N é permitida, desde que permaneça Regular e Diferente de zero.
- As brechas padrão são proibidas.
- Isso é código-golfe , e o menor número de bytes vence.
code-golf
arithmetic
ATaco
fonte
fonte
Respostas:
Gelatina , 11 bytes
Experimente online!
Obras de gerar a matriz identidade de tamanho N e concatenar com a lista gerada pela repetição N vezes a Singleton √ (N + 1) + 1 , dividido por N .
fonte
Python
7866 bytesCertamente pode ser melhorado,
especialmente ao lidar com n = 1 ''. (Como isso é simples?)Acabei de perceber que não é necessário. Provavelmente ainda pode ser melhorado ^^Experimente online!
[i*[0]+[1]+(n+~i)*[0]for i in range(n)]
cria matriz de identidade. Todos os pontos têm distânciasqrt(2)
um do outro. (graças a Rod por melhorar)Agora precisamos de um
n+1
-ésimo ponto com a mesma distância de todos os outros pontos. Nós temos que escolher(x, x, ... x)
.Distância de
(1, 0, ... )
para(x, x, ... x)
ésqrt((x-1)²+x²+...+x²)
. Se queremos umn
simplex dimensional, isso acaba sendosqrt((x-1)²+(n-1)x²)
, pois temos um1
en-1
0
s no primeiro ponto. Simplifique um pouco:sqrt(x²-2x+1+(n-1)x²) = sqrt(nx²-2x+1)
Queremos que essa distância esteja
sqrt(2)
.sqrt(2) = sqrt(nx²-2x+1)
2 = nx²-2x+1
0 = nx²-2x-1
0 = x²-2/n*x+1/n
Resolvendo esta equação quadrática (uma solução, outra também funciona bem):
x = 1/n+sqrt(1/n²+1/n) = 1/n+sqrt((n+1)/n²) = 1/n+sqrt(n+1)/n = (1+sqrt(n+1))/n
Coloque isso em uma lista
n
vezes, coloque-a em uma lista e junte-se à matriz de identidade.-4 bytes graças a Alex Varga:
Multiplique cada vetor por
n
. Isso altera a criação da matriz de identidade paralambda n:[i*[0]+[n]+(n+~i)*[0]
(mesmo comprimento) e elimina a divisãon
no ponto adicional, tornando-se assimn*[1+(n+1)**.5]
, salvando dois colchetes e o/n
.fonte
Wolfram Language (Mathematica) , 46 bytes
Experimente online!
fonte
APL (Dyalog) ,
2018 bytes1 byte graças a @ngn
Experimente online!
fonte
(∘.=⍨⍳)
->∘.=⍨∘⍳
⌹
, mas eu não consigo descobrir como poderia funcionar ...{÷¯1+4○⍵*.5}⍪⍳∘.=⍳
JavaScript (ES7), 70 bytes
Porta da resposta Python do @ PattuX.
fonte
Wolfram Language (Mathematica), 205 bytes
Função Simplex no Mathematica Começando em
{0,0,...]},{1,0,0,...]}
, Colocando o primeiro ponto na origem, Segundo ponto nox
eixo Terceiro ponto nox,y
plano, Quarto ponto nox,y,z
espaço etc. Essa progressão reutiliza todos os pontos anteriores, adicionando um novo ponto por vez em uma nova dimensãoVerificação
fonte
Oitava , 31 bytes
Economizou 2 bytes graças a Luis Mendo .
Experimente online!
fonte
ones(1,n)
por~~(1:n)
Ruby , 55 bytes
em vez de retornar magnitudes semelhantes para todas as dimensões e usar a fórmula
(1+(n+1)**0.5)/n
I, escalonar por um fator den
para simplificar a fórmula para(1+(n+1)**0.5)
Experimente online!
ungolfed no programa de teste
Uma função lambda tomando
n
como argumento e retornando uma matriz de matrizes.resultado
fonte
Pari / GP , 37 bytes
Experimente online!
fonte
R , 38 bytes
Experimente online!
fonte