Самая простая N-мерная форма, которую можно создать для любого измерения, - это Симплекс , и это набор из 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-мерного симплекса, если оно остается регулярным и ненулевым.
- Стандартные лазейки запрещены.
- Это код-гольф , поэтому побеждает меньше байтов.
code-golf
arithmetic
Ataco
источник
источник
Ответы:
Желе , 11 байт
Попробуйте онлайн!
Работы генерации единичной матрицы размера N и конкатенации его со списком генерируется путем повторения N раз одноэлементного √ (N + 1) + 1 , делится на N .
источник
Python
7866 байтНаверняка можно улучшить,
особенно при обработке 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
0
s в первой точке. Упростим немного: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
.источник
Wolfram Language (Mathematica) , 46 байтов
Попробуйте онлайн!
источник
APL (Дьялог) ,
2018 байт1 байт благодаря @ngn
Попробуйте онлайн!
источник
(∘.=⍨⍳)
->∘.=⍨∘⍳
⌹
но я не могу понять, как это могло бы работать ...{÷¯1+4○⍵*.5}⍪⍳∘.=⍳
JavaScript (ES7), 70 байт
Порт ответа @ PattuX's Python.
источник
Wolfram Language (Mathematica), 205 байтов
Симплексная функция в Mathematica Начиная с
{0,0,...]},{1,0,0,...]}
, Помещение первой точки в начало координат, Вторая точка наx
оси Третья точка наx,y
плоскости, Четвертая точка вx,y,z
пространстве и т. Д. Эта последовательность повторного использования всех предыдущих точек, добавляя одну новую точку за раз в новом измеренииверификация
источник
Октава , 31 байт
Сохранено 2 байта благодаря Луису Мендо .
Попробуйте онлайн!
источник
ones(1,n)
на~~(1:n)
Рубин , 55 байт
вместо того, чтобы возвращать одинаковые величины для всех измерений и использовать формулу
(1+(n+1)**0.5)/n
I, чтобы увеличить формулу,n
чтобы упростить формулу(1+(n+1)**0.5)
Попробуйте онлайн!
разряженный в тестовой программе
Лямбда-функция, принимающая
n
в качестве аргумента и возвращающая массив массивов.выход
источник
Пари / ГП , 37 байт
Попробуйте онлайн!
источник
R , 38 байт
Попробуйте онлайн!
источник