Підсумуйте вершинні з'єднання


14

Припустимо, у вас є ціле позитивне число N . Спочатку побудуйте правильний багатокутник, який має N вершин, при цьому відстань між сусідніми вершинами дорівнює 1. Потім з'єднайте лінії від кожної вершини та до кожної іншої вершини. Нарешті, обчисліть довжину всіх рядків, підсумованих разом.

Приклад

З огляду на вхід N = 6 , побудуйте шестикутник з лініями, що з'єднують кожну вершину з іншими вершинами.

Шестикутник

Як бачимо, загалом існує 6 ліній кордону (довжина = 1), 3 лінії, які мають подвійну довжину кордону (довжина = 2), і 6 інших ліній, які ми, використовуючи теорему Піфагора, можемо обчислити довжину для , який є

Якщо додати довжини ліній разом, отримаємо (6 * 1) + (3 * 2) + (6 * 1.732) = 22.392 .

Додаткова інформація

Оскільки структури з 2 або меншими вершинами не вважаються багатокутниками, вихід NaNN (або , оскільки відстань між однією вершиною не має великого сенсу) для 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
Повинен ми справді впоратися 1? Мій поточний запис, наприклад, повернеться, nanа не нуль, і просто вимагатиме спеціального корпусу.
Джонатан Аллан

1
@JonathanAllan Я подумав про це, побачивши вашу відповідь, nanтеж добре, оскільки відстань між однією вершиною все одно не має особливого сенсу.
Ян Х.

6
Напевно, ви повинні дозволити, щоб помилки були кинуті теж, n=1я думаю.
Джонатан Аллан

Важко сказати, що означає 3 десяткових знаку точності без верхньої межі N, оскільки виходи збільшуються, а поплавці стають менш точними.
xnor

@xnor Поки для будь-якого розумного введення N точно до 3 знаків після коми , його штраф є менш точним для величезних чисел.
Ян Х.

Відповіді:


13

Python 3 симпатією ) ,  61 60 58 54  48 байт

-6 (можливо, навіть -10, якщо нам не потрібно обробляти n=1) завдяки xnor (подальше тригонометричне спрощення плюс подальше гольф, щоб обробити крайовий випадок 1 та зберегти дужки, перемістивши (тепер непотрібний) floatзаголовок).

Сподіваємось, неподатний, якщо немає сторонніх бібліотек? Так!! але давайте прокручувати речі ...

lambda n:1%n*n/2/(1-cos(pi/n))
from math import*

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

При цьому використовується формула для суми довжин, якщо багатокутник вписаний всередині одиничного кола, 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).


2
так! збережено 11 байт. класна формула!
J42161217

1
Схоже, формула спрощується n/2/(1-cos(pi/n)).
xnor

Гарне місце @xnor (до тих пір , як ми можемо вихід 0.25для n=1- але спеціальний корпус може бути коротше , теж ...)
Джонатан Allan

@JonathanAllan Ху, дивно, що 1/4це результат n=1. Він може бути зафіксований 1%n*. Також парени можна зберегти, перемістивши floatвсередину до float(1-cos(pi/n)). Я не знаю симпатії багато, але, можливо, є арифметичний спосіб примусити поплавок.
xnor

@xnor Дякую! (Я мав би помітити floatхід). sympy виводить вираз - наприклад, для n=6відсутності анонсованих результатів у виразі з поданням 3.0/(-sqrt(3)/2 + 1)- можливо, існує коротший шлях, але я цього ще не знаю.
Джонатан Аллан

7

Пітон , 34 байти

lambda n:1%n*n/abs(1-1j**(2/n))**2

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

Використовує формулу, n/2/(1-cos(pi/n))спрощену від Джонатана Аллана . Ніл врятував 10 байт, зазначивши, що Python може обчислити коріння єдності як дробові сили 1j.

Python без імпорту не має вбудованих тригонометричних функцій pi, або e. Для того, щоб n=1давати, 0а не робити 0.25, ми робимо передумови 1%n*.

Більш довга версія, що використовує лише повноваження з натуральним числом:

lambda n:1%n*n/abs(1-(1+1e-8j/n)**314159265)**2

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


1
Остудіть як огірок.
Джонатан Аллан

37 байт:lambda n:1%n*n/(1-(1j**(2/n)).real)/2
Ніл

@Neil Wow, Python може просто обчислити коріння єдності.
xnor

Ну, це був легкий шматочок. Я не знаю, що все-таки abs()робить.
Ніл

@Neil він отримує абсолютне значення, отже, норма, тобто відстань від початку.
Джонатан Аллан

6

MATL , 16 15 байт

t:=ZF&-|Rst2)/s

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Для цього використовується комісія, яка запровадила функцію FFT (швидка трансформація Фур'є), яка передує виклику протягом 8 днів.

Пояснення

Код використовує цей трюк (адаптований до MATL) для створення коренів єдності. Вони дають положення вершин як складні числа, за винятком того, що відстань між послідовними вершинами не нормалізується до 1. Щоб вирішити, що після обчислення всіх парних відстаней програма розділяє їх на відстань між послідовними вершинами.

t       % Implicit input, n. Duplicate
:       % Range: [1 2 ... n-1 n]
=       % Isequal, element-wise. Gives [0 0 ... 0 1]
ZF      % FFT. Gives the n complex n-th roots of unity
&-|     % Matrix of pairwise absolute differences
R       % Upper triangular matrix. This avoids counting each line twice.
s       % Sum of each column. The second entry gives the distance between
        % consecutive vertices
t2)/    % Divide all entries by the second entry
s       % Sum. Implicit display

1
це прекрасно
Йона

@Jonah Комплексні номери FTW :-)
Луїс Мендо

5

Коник, 25 примітивів (11 компонентів, 14 проводів)

Я читаю мета-пост про програми в GH та LabVIEW і дотримуюся подібних інструкцій для вимірювання візуальної мови.

програма коника

Роздрукуйте <null>для N = 0, 1, 2, тому що Polygon Primitiveне можна генерувати багатокутник з 2 або меншими краями, і ви отримаєте порожній список рядків.

Компоненти зліва направо:

  • Side count слайдер: вхід
  • Багатокутник примітивний: намалюйте багатокутник на полотні
  • Вибухнути: вибухнути полілінією в сегменти та вершини
  • Перехресне посилання: побудувати цілісний поперечний посилання між усіма вершинами
  • Лінія: намалюйте лінію між усіма парами
  • Видалити повторювані лінії
  • Довжина кривої
  • (верхня) сума
  • (нижній) Відділ: оскільки Polygon Primitiveмалює багатокутник на основі радіуса, нам потрібно масштабувати фігуру
  • Мультиплікація
  • Панель: вихід

скріншот носорога



2

Haskell , 27 байт

f 1=0
f n=n/2/(1-cos(pi/n))

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

Я просто занурився в Haskell, тому це виявляється доброю гольф-початківцем (тобто копіюючи формулу з інших відповідей).

Я також намагався $кудись поставити, але компілятор постійно кричить на мене, так що це найкраще, що я маю. : P


2

Желе , 13 12 11 байт

Використовує формулу Джонатана Аллана (і завдяки йому за збереження 2-х байт)

ØP÷ÆẠCḤɓ’ȧ÷

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

Я завжди був дуже захоплений Джеллі, але мало використовував його, тому це може бути не найпростіша форма.


Збережіть байт, скориставшись "заміною аргументу діадичним поділом ланцюга", ɓщоб вбудувати своє допоміжне посилання так:ØP÷ÆẠCḤɓn1×÷
Джонатан Аллан

@JonathanAllan о, дякую, я все ще новачок і знав, що, мабуть, є кращий спосіб, ніж мати нову ланцюжок, але не знав, як це зробити
Jeffmagma

О, ми можемо врятувати іншого, використовуючи убутку, і логіко-й ȧ: ØP÷ÆẠCḤɓ’ȧ÷:)
Jonathan Allan

о, дякую, я не думав про це
Jeffmagma

1

Javascript (ES6), 36 байт

n=>1%n*n/2/(1-Math.cos(Math.PI/n))

Порт @ JonathanAllan відповідь Python 3

f=n=>1%n*n/2/(1-Math.cos(Math.PI/n))
<input id=i type=number oninput="o.innerText=f(i.value)" /><pre id=o>

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