N 차원 심플 렉스 생성 (Tetrahedron)


12

모든 치수에 대해 생성 할 수있는 가장 간단한 N- 치수 모양은 Simplex 이며, 이것은 서로 같은 거리에있는 N + 1 점 세트입니다.

2 차원의 경우 정삼각형, 3 차원의 경우 정사면체, 4 차원의 5- 셀 등입니다.

도전

정수 차원 N을 입력으로 받으면이 차원의 단순을 나타내는 배열 / 목록 / 스택 / 무엇이든 N 차원 점을 출력합니다. 즉, 서로 거리가 같고 0이 아닌 N + 1 꼭지점입니다.

루아에서 참조 구현

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...]]

노트

  • 입력은 표준 형식 의 숫자이며 항상 1보다 크고 10보다 작은 정수입니다.
  • 1의 입력에는 하드 코딩이 허용되지만 더 높은 값은 없습니다.
  • 출력에 합리적인 오류가 허용됩니다. 부동 소수점 산술 또는 삼각법 문제는 무시 될 수 있습니다.
  • N 차원 심플 렉스의 변환은 정규 및 0이 아닌 한 허용됩니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 가장 적은 바이트가 이깁니다.

1
하드 코딩하지 않도록 강제로 답변을 할 수 없다는 것을 알고 있습니까? 이를 피하는 가장 간단한 방법은 입력 범위를 늘리는 것입니다. 또한 "유효한 기준은 객관적이어야한다", 합리적인 것은 객관적이지 않다.
user202729

항등 행렬과 항목이 모두 같은 하나의 여분의 벡터를 가져 와서 해결할 수있는 것처럼 보입니다.
xnor

@xnor that that;)
PattuX

답변:


4

젤리 , 11 바이트

‘½‘÷ẋW
=þ;Ç

온라인으로 사용해보십시오!

생성함으로써 서지 행렬 크기 N을 하고 반복에 의해 생성 된리스트를 연접 N 배 싱글 √ (N + 1) + 1 로 나눈 N .

‘½‘÷ẋW – Helper link (monadic). I'll call the argument N.

‘      – Increment N (N + 1).
 ½     – Square root.
  ‘    – Increment (√(N + 1) + 1).
   ÷   – Divide by N.
    ẋ  – Repeat this singleton list N times.
     W – And wrap that into another list.

––––––––––––––––––––––––––––––––––––––––––

=þ;Ç   – Main link.

=þ     – Outer product of equality.
  ;Ç   – Concatenate with the result given by the helper link applied to the input.

5

파이썬 78 66 바이트

lambda n:[i*[0]+[n]+(n+~i)*[0]for i in range(n)]+[n*[1+(n+1)**.5]]

특히 n = 1을 처리 할 때 분명히 향상 될 수 있습니다 . (어떻게 단순한 것입니까?) 필요하지 않다는 것을 깨달았습니다. 아마 여전히 향상 될 수 있습니다 ^^

온라인으로 사용해보십시오!

[i*[0]+[1]+(n+~i)*[0]for i in range(n)]항등 행렬을 만듭니다. 모든 점은 sqrt(2)서로 거리가 있습니다 . (개선을위한 Rod에 감사합니다)

이제 우리는 n+1다른 모든 점과 같은 거리를 가진-점이 필요합니다 . 우리는 선택해야합니다 (x, x, ... x).

에서 (1, 0, ... )까지의 거리는 (x, x, ... x)입니다 sqrt((x-1)²+x²+...+x²). 우리가 n차원 심플 렉스를 원한다면 이것은 첫 번째 점에 sqrt((x-1)²+(n-1)x²)하나 1n-1 0s 가 있기 때문에로 나타납니다 . 조금 단순화하십시오.sqrt(x²-2x+1+(n-1)x²) = sqrt(nx²-2x+1)

우리는이 거리를 원합니다 sqrt(2).

sqrt(2) = sqrt(nx²-2x+1)
2 = nx²-2x+1
0 = nx²-2x-1
0 = x²-2/n*x+1/n

이 이차 방정식을 해결 (하나의 솔루션, 다른 하나는 잘 작동합니다) :

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

그것을 목록 n시간에 넣고, 그 목록을 목록에 넣고 항등 행렬과 결합하십시오.


Alex Varga 덕분에 -4 바이트 :

각 벡터에을 곱하십시오 n. 이렇게하면 항등 행렬의 생성이 lambda n:[i*[0]+[n]+(n+~i)*[0](같은 길이)로 바뀌고 n추가 지점에서 나눗셈이 제거 되므로 n*[1+(n+1)**.5]두 개의 대괄호와가 저장됩니다 /n.


이 도전의 범위에 속하지는 않지만, 0 차원 심플 렉스도 역시 끔찍한 일입니다.
ATaco

조금 더 읽은 후에, 다른 숫자의 모든 쌍이 1- 단열이 아닌가?
PattuX


1
8 바이트를 절약하기 위해 단위 행렬을 생성하는 방법으로 변경할 수 있습니다
Rod

1
이전 댓글을 결합한 66 바이트
Alex Varga


2

APL (Dyalog) , 20 18 바이트

@ngn 덕분에 1 바이트

∘.=⍨∘⍳⍪1÷¯1+4○*∘.5

온라인으로 사용해보십시오!


(∘.=⍨⍳)->∘.=⍨∘⍳
ngn

@ngn이 골프는 대기 중입니다. 게시물을 수정하는 것은 모바일을 사용하는 것이 정말 고통스럽기 때문에 이것을 추가하기 전에 몇 바이트 더 골프를 할 수 있는지 기다리고있었습니다.
Uriel

나는 당신을 위해 그것을 자유롭게 편집했습니다. 나도 더 나은 대답이 있을지 모른다고 생각한다 – 그것은 나에게 상기시킨다. 그러나 그것이 어떻게 작동 할 수 있는지는 알 수 없다 ...
ngn

행렬 분할은 결실이 없었지만 흥미로운 순환 함수를 찾았습니다.{÷¯1+4○⍵*.5}⍪⍳∘.=⍳
ngn

@ngn 감사합니다. 같은 수의 솔루션의 암묵적인 버전을 사용했습니다
Uriel

1

자바 스크립트 (ES7), 70 바이트

n=>[a=Array(n++).fill((1+n**.5)/--n),...a.map((_,i)=>a.map(_=>+!i--))]

@PattuX의 Python 답변 포트.


1

볼프람 언어 (Mathematica), 205 바이트

f1 = Sqrt[# (# + 1)/2]/# /(# + 1) & ;
f2 = Sqrt[# (# + 1)/2]/# & ;
simplex[k_] := {ConstantArray[0, k]}~Join~Table[
   Table[f1[n], {n, 1, n - 1}]~Join~{f2[n]}~Join~
    ConstantArray[0, k - n],
   {n, k}]

Mathematica의 심플 렉스 함수 {0,0,...]},{1,0,0,...]}시작점, 원점에 첫 번째 점 배치, x축의 두 번째 점 x,y평면의 세 번째 점, x,y,z공간의 네 번째 점 등

simplex[6]={{0, 0, 0, 0, 0, 0}, {1, 0, 0, 0, 0, 0}, {1/2, Sqrt[3]/2, 0, 0, 0, 
  0}, {1/2, 1/(2 Sqrt[3]), Sqrt[2/3], 0, 0, 0}, {1/2, 1/(2 Sqrt[3]), 
  1/(2 Sqrt[6]), Sqrt[5/2]/2, 0, 0}, {1/2, 1/(2 Sqrt[3]), 1/(
  2 Sqrt[6]), 1/(2 Sqrt[10]), Sqrt[3/5], 0}, {1/2, 1/(2 Sqrt[3]), 1/(
  2 Sqrt[6]), 1/(2 Sqrt[10]), 1/(2 Sqrt[15]), Sqrt[7/3]/2}}

확인

In[64]:= EuclideanDistance[simplex[10][[#[[1]]]],simplex[10][[#[[2]]]]] & /@ Permutations[Range[10],{2}]//Simplify
Out[64]= {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}

1
사이트에 오신 것을 환영합니다! 1) 이것은 코드 골프이므로 가능한 한 짧게 코드를 작성해야합니다. 2) 마크 다운 을 사용하여 게시물을 가능한 한 읽을 수있게 만드십시오.
caird coinheringaahing


0

루비 , 55 바이트

모든 차원에 대해 비슷한 크기를 반환하지 않고 수식을 사용하여 수식 을 단순화 (1+(n+1)**0.5)/n하는 요소만큼 확장합니다.n(1+(n+1)**0.5)

->n{(a=[n]+[0]*~-n).map{a=a.rotate}+[[1+(n+1)**0.5]*n]}

온라인으로 사용해보십시오!

테스트 프로그램에서 ungolfed

n인수로 사용하고 배열 배열을 반환하는 람다 함수 .

f=->n{
  (a=[n]+[0]*~-n).map{        #setup an array `a` containing `n` and `n-1` zeros. perform `n` iterations (which happens to be the the size of the array.)
  a=a.rotate}+                #in each iteration rotate `a` and return an array of all possible rotations of array `a`     
  [[1+(n+1)**0.5]*n]          #concatenate an array of n copies of 1+(n+1)**0.5
}

p f[3]                        # call for n=3 and print output

산출

[[0, 0, 3], [0, 3, 0], [3, 0, 0], [3.0, 3.0, 3.0]]


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.