N-Boyutlu Simpleks (Tetrahedron) oluşturma


12

Kişinin herhangi bir boyut için yaratabileceği en basit N-Boyut şekli bir Simplex'tir ve bu, birbirinden eşit mesafede olan bir N + 1 noktası kümesidir.

2 boyut için, bu bir eşkenar üçgen, 3 boyut için, bu normal bir tetrahedron, 4 boyutta 5-Hücre vb.

Meydan okuma

Giriş olarak bir Tamsayı boyutu N verildiğinde, bu boyutun bir Simpleksini temsil eden Boyutsal noktalardan oluşan bir Dizi / Liste / Yığın / Ne olursa olsun çıktı alın. Yani, birbirinden eşit ve sıfır olmayan mesafe olan N + 1 tepe noktaları.

Lua'da referans uygulaması

Örnekler

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

notlar

  • Giriş, herhangi bir standart biçimde bir sayıdır ve her zaman 1'den büyük ve 10'dan küçük bir tam sayı olacaktır
  • 1 girişinde sabit kodlamaya izin verilir, ancak daha yüksek bir değer yoktur.
  • Çıktıda makul hataya izin verilir. Kayan noktalı aritmetik veya trig ile ilgili sorunlar göz ardı edilebilir.
  • N boyutlu simpleksin herhangi bir dönüşümüne, Düzenli ve Sıfırdan farklı kaldığı sürece izin verilir.
  • Standart Loopholes yasaktır.
  • Bu , çok az bayt kazanır.

1
Cevapları sabit kodlara zorlayamayacağınızı biliyor musunuz? Bundan kaçınmanın en basit yolu, girdi aralığını arttırmaktır. Ayrıca "geçerli kriterler objektif olmalıdır", makul objektif değildir.
— user202729

Bu, kimlik matrisi artı girişleri eşit olan bir ekstra vektör alınarak çözülebilir.
— xnor

@xnor bunu yaptı;)
— PattuX

Yanıtlar:


4

Jöle , 11 bayt

‘½‘÷ẋW
=þ;Ç

Çevrimiçi deneyin!

Üreterek İşleri kimlik matrisi büyüklüğü N ve tekrar oluşturulan listesi ile birleştirerek N kez Singleton √ (N + 1) + 1 , bölü 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 Bayt

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

Elbette, özellikle n = 1 '' kullanımında geliştirilebilir . (Bu nasıl bir simpleks?) Sadece bunun gerekli olmadığını fark ettim. Muhtemelen hala geliştirilebilir ^ ^

Çevrimiçi deneyin!

[i*[0]+[1]+(n+~i)*[0]for i in range(n)]kimlik matrisi oluşturur. Tüm noktalar sqrt(2)birbirinden uzaktır. (iyileştirme için Rod'a teşekkürler)

Şimdi n+1diğer tüm noktalara aynı mesafede bir- noktaya ihtiyacımız var . Seçmek zorundayız (x, x, ... x).

Uzaklık (1, 0, ... )için (x, x, ... x)olduğunu sqrt((x-1)²+x²+...+x²). nBoyutsal bir simpleks istiyorsak , ilk noktada sqrt((x-1)²+(n-1)x²)bir 1ve n-1 0s'ye sahip olduğumuz için bu ortaya çıkıyor . Biraz basitleştirin:sqrt(x²-2x+1+(n-1)x²) = sqrt(nx²-2x+1)

Bu mesafenin olmasını istiyoruz sqrt(2).

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

Bu ikinci dereceden denklemi çözmek (bir çözüm, diğeri de iyi çalışır):

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

Bunu bir liste nsüresine koyun, listeyi bir listeye koyun ve kimlik matrisine katılın.


Alex Varga sayesinde -4 bayt:

Her vektörü çarpın n. Bu, kimlik matrisinin oluşturulmasını lambda n:[i*[0]+[n]+(n+~i)*[0](aynı uzunlukta) değiştirir ve nek noktadan bölünmeden kurtulur , böylece n*[1+(n+1)**.5]iki parantez ve /n.


Bu meydan okuma kapsamında olmasa da, 0 boyutlu simpleksler de göründüğü kadar korkunç bir şeydir.
— ATaco

Biraz daha okuduktan sonra, her farklı sayı çifti 1-simpleks değil mi?
— PattuX

Evet, simplekslerin can sıkıcı gücü
— ATaco

1
Sen edebilirsiniz kimlik matrisi oluşturmak için yolu değiştirmek 8 bayt kaydetmek için
— Çubuk

1
Önceki yorumları birleştiren 66 bayt
— Alex Varga


2

APL (Dyalog) , 20 18 bayt

@Ngn sayesinde 1 bayt teşekkürler

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

Çevrimiçi deneyin!


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

@ngn Beklemede bu golf var, ben koymadan önce biraz bayt golf olup olmadığını görmek için bekliyordum çünkü yazı düzenleme mobil kullanarak gerçekten acı
— Uriel

Senin için düzenleme özgürlüğünü aldım. Ben de daha iyi bir cevap olabileceğinden şüpheliyim - hatırlatıyor ⌹ama nasıl çalışabileceğini tam olarak
— anlayamıyorum

matris bölümü sonuç vermedi ancak ilginç bir dairesel işlev buldum:{÷¯1+4○⍵*.5}⍪⍳∘.=⍳
— ngn

@ngn teşekkürler. Aynı sayı için çözümünüzün örtülü bir versiyonunu kullandım
— Uriel

1

JavaScript (ES7), 70 bayt

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

Bağlantı noktası @ PattuX'in Python cevabı.


1

Wolfram Dili (Mathematica), 205 bayt

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'da tek yönlü işlev Başlangıç, Başlangıç {0,0,...]},{1,0,0,...]}noktasını başlangıç ​​noktasına yerleştirme, Eksende ikinci nokta Düzlemde xüçüncü nokta x,y, x,y,zUzayda dördüncü nokta , vb. Bu ilerleme, önceki tüm noktaları yeniden kullanır ve yeni boyutta her seferinde yeni bir nokta ekler.

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

Doğrulama

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
Siteye Hoşgeldiniz! 1) Bu bir kod golf, kodunuzu mümkün olduğunca kısa yapmayı hedeflemelisiniz. 2) Yazınızı mümkün olduğunca okunabilir hale getirmek için lütfen Markdown'u kullanın.
— Caird coinheringaahing


0

Ruby , 55 bayt

tüm boyutlar için benzer büyüklükler döndürmek yerine ve formül (1+(n+1)**0.5)/nI'i kullanarak formülün nbasitleştirilmesi(1+(n+1)**0.5)

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

Çevrimiçi deneyin!

test programında çözülmemiş

Bağımsız ndeğişken olarak alan ve bir dizi dizi döndüren lambda işlevi .

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

çıktı

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.