Обчисліть площу регулярного багатокутника


19

Дано ціле число, nде 3 <= n < 2^32, обчислити площу звичайної n-гона з апотемою 1; формула для якої є n * tan(π / n). Для тих, хто не знає, що таке апофем:

Апотема правильного многокутника - це відрізок лінії від центру до середини однієї з його сторін.

Виведіть область n-гона як плаваючу крапку з не менше 8 знаків після коми.

Тестові справи

3
5.1961524227

6
3.4641016151

10
3.2491969623

20
3.1676888065

99
3.1426476062

1697
3.1415962425

15000
3.1415926995

Примітка. Вище наведені тестові випадки містять на 2 цифри більше, ніж потрібно для виведення.

Відповіді:


9

Математика, 16 байт

N[Tan[Pi/#]#,9]&

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

звичайно, математика має для цього вбудовані

Area@*RegularPolygon

Area@RegularPolygonповинно бути Area@*RegularPolygon; як зараз, він не може бути захоплений змінною. Тобто f = Area@RegularPolygon; f[3]не працює. Відповідна мета дискусія
JungHwan Min

@JungHwanMin гаразд, я це виправив. (Хоча я не публікував це як відповідь. Я просто показував вбудовані для розваги)
J42161217,


6

Власне , 5 байт

╦/Tß*

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


Як?

Full / Tß * Повна програма.

╦ Натисніть Пі.
 / Розділити ^ по введенню.
  T Тангент.
   ß * Помножити на введення.
        Висновок неявно.

Альтернатива: ß╦/T*. o_O Насправді насправді б'є желе !!!


2-байтові вбудовані імена ...
Ерік Аутгольфер

так, я знаю ... @EriktheOutgolfer 3-х байтові вбудовані в Pyth, хоча>. <
Містер Xcoder

3
+1 за " Насправді насправді б'є желе !!! " Цей каламбур ніколи не старіє. ;)
Кевін Круїссен

4

x87 Код машини, 11 байт

D9 EB
DA 31
D9 F2
DD D8
DA 09
C3

Вищеописані байти коду визначають функцію, яка обчислює площу регулярного n-gon з апотемою 1. Для цього використовується обчислення x87 FPU (класичний блок з плаваючою комою на процесорах x86).

Після стандартної конвенції викликів на основі реєстру x86 (в даному випадку __fastcall) аргумент функції є вказівником на ціле число, передане в ECXрегістр. Результатом функції є значення з плаваючою комою, повернене у верхній частині стека x87 з плаваючою комою (регістр ST0).

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

Невикольована збірна мнемоніка:

D9 EB  fldpi                  ; load constant PI at top of FPU stack
DA 31  fidiv DWORD PTR [ecx]  ; divide PI by integer input (loaded from pointer
                              ;   in ECX), leaving result at top of FPU stack
D9 F2  fptan                  ; compute tangent of value at top of FPU stack
DD D8  fstp  st0              ; pop junk value (FPTAN pushes 1.0 onto stack)
DA 09  fimul DWORD PTR [ecx]  ; multiply by integer input (again, loaded via ECX)
C3     ret                    ; return control to caller

Як бачимо, це в основному просто пряме обчислення даної формули,
     результат = n * tan (π / n)
Вказує лише кілька цікавих речей:

  • X87 FPU має спеціалізовану інструкцію для завантаження постійного значення PI ( FLDPI). Це використовувалося рідко, навіть у той час (і, очевидно, набагато менше, ніж зараз), але він коротший за розміром, ніж вбудовувати константу у свій двійковий і завантажувати це.
  • Інструкція x87 FPU для обчислення дотичної, FPTANзамінює значення вхідного регістру (вершина стека FPU) результатом, але також висуває постійну 1,0 на вершину стека FPU. Це робиться для зворотної сумісності з 8087 (я поняття не маю, чому це було зроблено на 8087; можливо, помилка). Це означає, що нам потрібно вивести це зайве значення зі стека. Найшвидший і найкоротший спосіб зробити це простий FSTP st0, як ми тут використовуємо. Ми могли б також зробити множину та попс , оскільки множення на 1.0 не змінить результат, але це також 2 байти (тому виграш не в розмірі коду), ймовірно, буде виконуватися повільніше і може внести зайву невизначеність у результат.

Хоча сучасний програміст або компілятор використовує набір інструкцій SSE (і пізнішої версії), а не старіння x87, для цього потрібно буде більше коду для реалізації, оскільки немає жодної інструкції для обчислення дотичної в цих нових ISA.









2

var'aq , 51 байт

'Ij latlh HeHmI' tam boqHa''egh qojmI' boq'egh cha'

Пояснення

'Ij        - read from STDIN
latlh      - duplicate top of stack
HeHmI'     - push PI onto stack
tam        - swap first 2 elements on stack
boqHa''egh - divide
qojmI'     - take tangent
boq'egh    - multiply
cha'       - print


2

JavaScript (ES6), 24 байти

x=>x*Math.tan(Math.PI/x)

Спробуй це

o.innerText=(f=
x=>x*Math.tan(Math.PI/x)
)(+i.value);oninput=_=>o.innerText=f(+i.value)
<input id=i min=3 type=number value=3><pre id=o>


1

Python 2 , 45 байт

from math import*
n=input()
print n*tan(pi/n)

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



У подібних викликах мені дуже не подобається використання лямбда для збереження байтів, просто поклавши друк у колонтитул ... Тому: 44 байти
Саймон

4
@Simon чому? Функції є дійсним поданням - ви можете або вивести значення, або повернути його з функції. Друк у нижньому колонтитулі не потрібен.
Стівен





1

Перл, 14 + 16 = 30

perl -MMath::Trig -ple'$_*=tan(pi/$_)'

14 байт для належної програми та 16 для комутаторів командного рядка



0

Мова формули IBM / Lotus Notes, 13 байт

a*@Tan(@Pi/a)

Введення здійснюється через поле з ім'ям a у тій же формі, що і поле, що містить формулу. Немає TIO, тому скріншот для всіх тестових випадків, показаних нижче:

введіть тут опис зображення





0

3
На жаль, це не є ні повною програмою, ні функцією. Натомість це фрагмент, який тут не дозволений. Однак я думаю, що ви можете додати n=>до початку, щоб перетворити це на функцію стрілки (візьміть це за допомогою дрібки солі, я не знаю C #), що є дійсним.
caird coinheringaahing

Ви можете розмістити фрагмент в System.Func<T, T>, який буде приймати floatяк вхід, а інший як вихід. Декларація виглядала б System.Func<float, float> f = n=>n*Math.Tan(Math.PI/n);приблизно так: звідки починався ббайт n=>. У моєму прикладі я опустив два ваших дужки, щоб зберегти 2 байти;)
Ян Х.

0

RPNGolf 0,6 / 0,7 , 12 байт

tbp-1mBsdmcc

Моє перше повідомлення з використанням RPNGolf, моя нова мова на основі стека!

Це повна програма, яка зчитує ціле число зі стандартного вводу і друкує вихід на стандартний вихід (без зворотного нового рядка).

Пояснення:

tb              # push user input from STDIN as int
  p             # duplicate top of stack
   -1           # push -1
     mB         # pop i, push inverse cosine of i
       s        # swap top two items on the stack
        d       # pop b, pop a, push a/b
         mc     # pop i, push tangent of i
           c    # pop b, pop a, push a*b
# RPNGolf implicity prints the stack upon normal exit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.