Допустим, у вас есть целое положительное число N . Сначала создайте правильный многоугольник с N вершинами, с расстоянием между соседними вершинами, равным 1. Затем соедините линии из каждой вершины с любой другой вершиной. Наконец, рассчитайте длину всех строк, суммируемых вместе.
пример
Учитывая вход N = 6 , построить шестиугольник с линиями, соединяющими каждую вершину с другими вершинами.
Как вы можете видеть, есть всего 6 линий границы (длина = 1), 3 линии, которые удваивают длину границы (длина = 2), и 6 других линий, которые мы, используя теорему Пифагора, можем вычислить длину для , который
Если мы сложим длины линий вместе, мы получим (6 * 1) + (3 * 2) + (6 * 1.732) = 22.392 .
Дополнительная информация
Поскольку структуры с 2 или менее вершинами не считаются полигонами, выведите 0 (или NaN
, поскольку расстояние между одной вершиной не имеет большого смысла) для N = 1, поскольку одна вершина не может быть связана с другими вершинами, а 1 для N = 2, так как две вершины соединены одной линией.
вход
Целое число N в любом приемлемом формате.
Выход
Длина всех строк, суммируемых вместе, с точностью не менее 3 десятичных знаков, либо в виде функции возврата, либо в виде прямой печати stdout
.
правила
- Стандартные лазейки запрещены.
- Это код-гольф , поэтому выигрывает самый короткий код в байтах на любом языке.
Удачи!
Тестовые случаи
(Input) -> (Output)
1 -> 0 or NaN
2 -> 1
3 -> 3
5 -> 13.091
6 -> 22.392
1
? Моя текущая запись будет возвращатьсяnan
, например, вместо нуля, и для этого потребуется специальный регистр.nan
тоже хорошо, так как расстояние между одной вершиной в любом случае не имеет особого смысла.n=1
мне кажется.N
, поскольку выходные данные увеличиваются, а значения с плавающей точкой становятся менее точными.Ответы:
Python 3
(с SymPy ),61 60 58 5448 байт-6 (может быть, даже -10, если нам не нужно обрабатывать
n=1
) благодаря xnor (дальнейшее тригонометрическое упрощение плюс дальнейшая игра в гольф для обработки крайнего случая 1 и сохранения скобок путем перемещения (теперь ненужного)float
броска).Надеемся, что можнопобедить безстороннихбиблиотек? Да!!нодавайте заставим вещи катиться ...Попробуйте онлайн!
При этом используется формула для суммы длин, если многоугольник вписан в единичный круг,
n*cot(pi/2/n)/2
и корректируется результат на единицу для длины стороны, равной единице, путем деления на грех этой длины шнураsin(pi/n)
.Первая формула получается путем рассмотрения
n-1
длины шнуров всех диагоналей, исходящих из одного угла, которые имеют длинуsin(pi/n)
(снова)sin(2*pi/n)
,, ...,sin((n-1)pi/n)
. Сумма этого в томcot(pi/2/n)
, что естьn
углы, поэтому мы умножаем наn
, но затем мы дважды подсчитали все шнуры, поэтому мы делим на два.В результате чего
n*cot(pi/2/n)/2/sin(pi/n)
была затем упрощена путем XNOR , чтобыn/2/(1-cos(pi/n))
(выдержка в течениеn>1
)... это (при условии, что точность приемлема) теперь больше не требуется по
sympy
сравнению со встроеннымmath
модулем (math.pi=3.141592653589793
).источник
n/2/(1-cos(pi/n))
.0.25
дляn=1
- но специальный корпус может быть короче , тоже ...)1/4
результат дляn=1
. Это может быть исправлено1%n*
. Кроме того, паренсы могут быть сохранены путем перемещенияfloat
внутрьfloat(1-cos(pi/n))
. Я не очень много знаю, но, может быть, есть арифметический способ заставить поплавок.float
движение). sympy выводит выражение - например, еслиn=6
приведение не приводит к выражению с представлением3.0/(-sqrt(3)/2 + 1)
- вполне может быть более короткий путь, но я его пока не знаю.Python , 34 байта
Попробуйте онлайн!
Использует формулу,
n/2/(1-cos(pi/n))
упрощенную от Джонатана Аллана . Нил сэкономил 10 байтов, отметив, что Python может вычислять корни единства как дробные степени1j
.Python без импорта не имеет встроенных тригонометрических функций
pi
, илиe
. Для того, чтобыn=1
дать ,0
а не0.25
мы предварять1%n*
.Более длинная версия, использующая только натуральные числа:
Попробуйте онлайн!
источник
lambda n:1%n*n/(1-(1j**(2/n)).real)/2
abs()
делает, хотя.MATL ,
1615 байтПопробуйте онлайн! Или проверьте все тестовые случаи .
При этом используется фиксация, которая представила функцию FFT (быстрое преобразование Фурье) и которая предшествует вызову на 8 дней.
объяснение
Код использует этот трюк (адаптированный к MATL) для генерации корней единства. Они дают позиции вершин в виде комплексных чисел, за исключением того, что расстояние между последовательными вершинами не нормируется на 1. Чтобы решить, что после вычисления всех парных расстояний программа делит их на расстояние между последовательными вершинами.
источник
Кузнечик, 25 примитивов (11 компонентов, 14 проводов)
Я читаю мета-пост о программах в GH и LabVIEW и следую аналогичным инструкциям для измерения визуального языка.
Выведите
<null>
для N =0, 1, 2
, потому чтоPolygon Primitive
не можете сгенерировать многоугольник с 2 или менее ребрами, и вы получите пустой список линий.Компоненты слева направо:
Side count
ползунок: входPolygon Primitive
рисует многоугольник на основе радиуса, нам нужно масштабировать формуисточник
Mathematica, 26 байтов
использует формулу Джонатана Аллана
Попробуйте онлайн!
-1 байт Junghwan мин
источник
N@Cot[Pi/2/#]/2Csc[Pi/#]#&
с1/sin(x) = csc(x)
.5Csc[x=Pi/#]Cot[x/2]#&
Haskell , 27 байт
Попробуйте онлайн!
Я просто нырнул в Haskell, так что это оказалось честным новичком в гольф (то есть, копируя формулу из других ответов).
Я также старался
$
куда-то положить, но компилятор продолжает на меня кричать, так что это лучшее, что у меня есть. :Писточник
Желе ,
131211 байтИспользует формулу Джонатана Аллана (и спасибо ему за сохранение 2 байта)
Попробуйте онлайн!
Я всегда был в восторге от желе, но не использовал его много, так что это, возможно, не самая простая форма.
источник
ɓ
чтобы встроить вашу вспомогательную ссылку следующим образом:ØP÷ÆẠCḤɓn1×÷
’
и логические-и, :)ȧ
:ØP÷ÆẠCḤɓ’ȧ÷
Javascript (ES6), 36 байт
Порт @ JonathanAllan's Python 3 ответа
источник