Tạo một Simplex N-Dimensional (tứ diện)


12

Hình dạng N-Dimensional đơn giản nhất mà người ta có thể tạo cho bất kỳ kích thước nào là Simplex và đây là một tập hợp các điểm N + 1, tất cả đều cách xa nhau.

Đối với 2 chiều, đây là một tam giác đều, đối với 3 chiều, đây là một tứ diện đều, ở 4 chiều là 5 ô , v.v.

Các thách thức

Cho một số nguyên N là đầu vào, xuất ra một mảng / Danh sách / Ngăn xếp / Bất kể điểm N nào đại diện cho một Simplex của thứ nguyên này. Đó là, các đỉnh N + 1 có khoảng cách bằng nhau và khác không so với nhau.

Tham khảo thực hiện tại Lua

Ví dụ

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

Ghi chú

  • Đầu vào là một số ở bất kỳ định dạng chuẩn nào và sẽ luôn là số nguyên lớn hơn 1 và nhỏ hơn 10
  • Hardcoding được phép cho đầu vào là 1, nhưng không có gì cao hơn.
  • Lỗi hợp lý được cho phép trong đầu ra. Các vấn đề với số học hoặc trig dấu phẩy động có thể bị bỏ qua.
  • Bất kỳ sự biến đổi nào của đơn giản N chiều đều được cho phép, miễn là nó vẫn là Chính quy và khác không.
  • Lỗ hổng tiêu chuẩn bị cấm.
  • Đây là , vì vậy ít byte nhất sẽ thắng.

1
Bạn nhận ra rằng bạn không thể buộc câu trả lời không mã hóa cứng? Cách đơn giản nhất để tránh điều đó là tăng phạm vi đầu vào. Ngoài ra "tiêu chí hợp lệ phải khách quan", hợp lý là không khách quan.
dùng202729

Có vẻ như điều này có thể được giải quyết bằng cách lấy ma trận danh tính cộng thêm một vectơ bổ sung có các mục nhập đều bằng nhau.
xnor

@xnor đã làm điều đó;)
PattuX

Câu trả lời:


4

Thạch , 11 byte

‘½‘÷ẋW
=þ;Ç

Hãy thử trực tuyến!

Công trình bằng cách tạo ra các ma trận sắc kích thước N và concatenating nó với danh sách được tạo ra bằng cách lặp lại N lần singleton √ (N + 1) + 1 , chia cho 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

Python 78 66 byte

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

Chắc chắn có thể được cải thiện, đặc biệt là khi xử lý n = 1```. (Làm thế nào mà ngay cả một đơn giản?) Chỉ cần nhận ra rằng không cần thiết. Có lẽ vẫn có thể được cải thiện ^^

Hãy thử trực tuyến!

[i*[0]+[1]+(n+~i)*[0]for i in range(n)]tạo ma trận danh tính. Tất cả các điểm có khoảng cách sqrt(2)với nhau. (cảm ơn Rod đã cải thiện)

Bây giờ chúng ta cần một n+1điểm thứ với cùng khoảng cách với tất cả các điểm khác. Chúng ta phải lựa chọn (x, x, ... x).

Khoảng cách từ (1, 0, ... )đến (x, x, ... x)sqrt((x-1)²+x²+...+x²). Nếu chúng ta muốn một nchiều đơn giản thì điều này hóa ra là sqrt((x-1)²+(n-1)x²), vì chúng ta có một 1n-1 0s ở điểm đầu tiên. Đơn giản hóa một chút:sqrt(x²-2x+1+(n-1)x²) = sqrt(nx²-2x+1)

Chúng tôi muốn khoảng cách này được sqrt(2).

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

Giải phương trình bậc hai này (một giải pháp, một giải pháp khác cũng hoạt động tốt):

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

Đặt nó trong một danh sách nlần, đặt danh sách đó vào một danh sách và tham gia với ma trận danh tính.


-4 byte nhờ Alex Varga:

Nhân mỗi vectơ với n. Điều này thay đổi việc tạo ma trận danh tính thành lambda n:[i*[0]+[n]+(n+~i)*[0](cùng độ dài) và thoát khỏi phép chia bằng nđiểm bổ sung, do đó, nó trở thành n*[1+(n+1)**.5], lưu hai dấu ngoặc và dấu /n.


Mặc dù không nằm trong phạm vi của thử thách này, nhưng đơn giản 0 chiều cũng là một điều, kinh khủng như điều đó có thể nghe.
ATaco

Sau khi đọc thêm một chút, không phải mọi cặp số khác nhau đều là 1 đơn giản sao?
PattuX

Đúng, đó là sức mạnh khó chịu của những kẻ đơn giản
ATaco


1
66 byte kết hợp các nhận xét trước đó
Alex Varga


2

APL (Dyalog) , 20 18 byte

1 byte nhờ @ngn

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

Hãy thử trực tuyến!


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

@ngn Tôi có golf này vào stand by, tôi đã chờ đợi để xem liệu tôi có thể chơi golf một số byte nữa trước khi tôi đặt này trong vì chỉnh sửa bài viết thực sự là nỗi đau sử dụng điện thoại di động
Uriel

Tôi lấy tự do để chỉnh sửa nó cho bạn. Tôi quá nghi ngờ có thể có một câu trả lời tốt hơn - nó nhắc tôi về nhưng tôi không thể khá tìm ra cách nó có thể làm việc ...
NGN

phân chia ma trận không có kết quả nhưng tôi tìm thấy một hàm tròn thú vị:{÷¯1+4○⍵*.5}⍪⍳∘.=⍳
ngn

@ngn cảm ơn. Tôi đã sử dụng một phiên bản ngầm của giải pháp của bạn cho cùng một số lượng
Uriel

1

JavaScript (ES7), 70 byte

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

Cổng câu trả lời Python của @ PattuX.


1

Ngôn ngữ Wolfram (Mathicala), 205 byte

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

Hàm Simplex trong Mathicala Bắt đầu từ {0,0,...]},{1,0,0,...]}, Đặt điểm đầu tiên tại điểm gốc, Điểm thứ hai trên xtrục Điểm thứ ba trong x,ymặt phẳng, Điểm thứ tư trong x,y,zkhông gian, v.v. Tiến trình này sử dụng lại tất cả các điểm trước đó, thêm một điểm mới tại một chiều mới

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}}

xác minh

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
Chào mừng đến với trang web! 1) Đây là một mã golf, bạn nên đặt mục tiêu làm cho mã của mình càng ngắn càng tốt. 2) Vui lòng sử dụng Markdown để làm cho bài đăng của bạn dễ đọc nhất có thể.
caird coinheringaahing


0

Ruby , 55 byte

thay vì trả lại cường độ tương tự cho tất cả các kích thước và sử dụng công thức (1+(n+1)**0.5)/ntôi mở rộng theo hệ số nđể đơn giản hóa công thức thành(1+(n+1)**0.5)

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

Hãy thử trực tuyến!

vô dụng trong chương trình thử nghiệm

Hàm lambda dùng nlàm đối số và trả về một mảng các mảng.

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

đầu ra

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.