Створіть N-мірний симплекс (тетраедр)


12

Найпростіша N-мірна форма, яку можна створити для будь-якого виміру, - це Simplex , і це набір N + 1 точок, які всі рівні на відстані від одного.

Для 2-х вимірів це рівносторонній трикутник, для 3-х вимірів - це звичайний тетраедр, у 4-х вимірах - 5-комірка тощо.

Змагання

Враховуючи вхідний розмір N, виведіть масив / список / стек / незалежно від N розмірних точок, які представляють симплекс цього виміру. Тобто вершини 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 розмірного симплекса, доки воно залишається регулярним і ненульовим.
  • Стандартні лазівки заборонені.
  • Це , тому виграє найменше байтів.

1
Ви розумієте, що не можете змусити відповісти на не жорсткий код? Найпростіший спосіб уникнути цього - збільшити діапазон введення. Також "дійсні критерії повинні бути об'єктивними", розумні не об'єктивні.
користувач202729

Схоже, це можна вирішити, взявши матрицю ідентичності плюс один додатковий вектор, записи якого всі рівні.
xnor

@xnor зробив це;)
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)один від одного. (спасибі Роду за вдосконалення)

Тепер нам потрібна 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разів, поставте цей список у список та приєднайтеся до матриці ідентичності.


-4 байти завдяки Алексу Варзі:

Помножте кожен вектор на n. Це змінює створення матриці ідентичності на lambda n:[i*[0]+[n]+(n+~i)*[0](однакової довжини) і позбавляється від поділу за nдопомогою додаткової точки, і це стає n*[1+(n+1)**.5], зберігаючи дві дужки та /n.


Хоча це не стосується цього виклику, 0 розмірних симплекси - це теж річ, настільки жахлива, як це може здатися.
Атако

Прочитавши трохи більше, чи не кожна пара різних чисел є 1-симплекс?
PattuX

Так, така прикрою силою симплекси
Атако


1
66 байт, що поєднують попередні коментарі
Алекс Варга


2

APL (Dyalog) , 20 18 байт

1 байт завдяки @ngn

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

Спробуйте в Інтернеті!


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

@ngn У мене цей гольф у режимі очікування, я чекав, чи зможу я пограти ще кілька байтів, перш ніж поставити це, тому що редагування публікацій справді болить за допомогою мобільного
Уріель

Я взяв на себе сміливість відредагувати це для вас. Я теж підозрюю, що може бути кращої відповіді - це мені нагадує, але я не можу
точно

матричний поділ був безрезультатним, але я виявив цікаву функцію {÷¯1+4○⍵*.5}⍪⍳∘.=⍳
кругообігу

@ngn спасибі Я використовував мовчазну версію вашого рішення для того ж рахунку
Уріель

1

JavaScript (ES7), 70 байт

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

Порт відповіді Python @ PattuX.


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) Будь ласка, використовуйте Markdown, щоб зробити вашу публікацію якомога більш читаною.
caird coinheringaahing


0

Рубін , 55 байт

замість того, щоб повертати однакові величини для всіх вимірів і використовувати формулу (1+(n+1)**0.5)/nI, збільшуючи на коефіцієнт, nщоб спростити формулу до(1+(n+1)**0.5)

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

Спробуйте в Інтернеті!

unolfolf у тестовій програмі

Функція лямбда, яка бере 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]]


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.