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²)하나 1와 n-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.