Рассчитать площадь правильного многоугольника

19

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

Апофемом правильного многоугольника является отрезок от центра до середины одной из его сторон.

Выведите площадь n-gon в виде числа с плавающей запятой, содержащего не менее 8 десятичных знаков.

Контрольные примеры

3
5.1961524227

6
3.4641016151

10
3.2491969623

20
3.1676888065

99
3.1426476062

1697
3.1415962425

15000
3.1415926995

Примечание. Приведенные выше тестовые примеры содержат на 2 цифры больше, чем требуется для вывода.

Зак Гейтс
источник

Ответы:

9

Mathematica, 16 байтов

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

Попробуйте онлайн!

конечно Mathematica имеет встроенные модули для этого

Area@*RegularPolygon
J42161217
источник
Area@RegularPolygonдолжно быть Area@*RegularPolygon; как сейчас, он не может быть записан в переменной. То есть f = Area@RegularPolygon; f[3]не работает. Соответствующая мета-дискуссия
JungHwan Мин.
@JungHwanMin хорошо, я исправил это (хотя я не отправлял это как ответ. Я только показывал встроенные модули для забавы)
J42161217
6

На самом деле , 5 байтов

╦/Tß*

Попробуйте онлайн!


Как?

╦ / Tß * Полная программа.

╦ Нажмите Пи.
 / Разделить ^ на вход.
  T Tangent.
   * Умножить на вход.
        Вывод неявно.

Альтернатива: ß╦/T*. о_О На самом деле на самом деле бьет желе !!!

Мистер Xcoder
источник
2-байтовые встроенные имена ...
Эрик Outgolfer
да, я знаю ... @EriktheOutgolfer 3-байтовые встроенные функции в Pyth, хотя>. <
Mr. Xcoder
3
+1 за « На самом деле на самом деле бьет желе! » Это каламбур никогда не стареет. ;)
Кевин Круйссен
4

Машинный код x87, 11 байт

D9 EB
DA 31
D9 F2
DD D8
DA 09
C3

Приведенные выше байты кода определяют функцию, которая вычисляет площадь обычного n-гона с апофемом 1. Для этого вычисления используются инструкции FPU x87 (классическая единица с плавающей запятой на процессорах 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)
Только пара интересных вещей указывает на то, что:

  • FPU x87 имеет специальную инструкцию для загрузки постоянного значения PI ( FLDPI). Это редко использовалось, даже в те времена (и, очевидно, намного меньше сейчас), но оно короче по размеру, чем встраивание константы в ваш двоичный файл и его загрузка.
  • Инструкция x87 FPU для вычисления тангенса FPTANзаменяет значение входного регистра (вершина стека FPU) на результат, но также помещает константу 1.0 в верхнюю часть стека FPU. Это сделано для обратной совместимости с 8087 (я понятия не имею, почему это было сделано на 8087; вероятно, ошибка). Это означает, что мы должны вытолкнуть это ненужное значение из стека. Самый быстрый и короткий способ сделать это - простой FSTP st0, как мы используем здесь. Мы могли бы также сделать умножение-и-всплытие , поскольку умножение на 1,0 не изменит результат, но это также 2 байта (поэтому нет выигрыша в размере кода), вероятно, будет выполняться медленнее и может привести к ненужной неопределенности в результат.

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

Коди Грей
источник
3

Желе , 6 байт

ØP÷ÆT×

Попробуйте онлайн!

Π встроенный в желе имеет> 8 десятичных знаков.

Эрик Outgolfer
источник
Ницца. Я пытался выяснить это (и Джелли в целом), прямо сейчас. :-)
Зак Гейтс
3

Сакура , 4 байта

*ij/π

Это расширяется до *ij/π⓪⓪, который является

*              *
 ij     tan(   )
  /         /
   π       π
    ⓪        n
     ⓪          n
TuxCrafting
источник
1
Не конкурировать больше не вещь.
Лохматый
@ Шэгги, что ты имеешь в виду? С каких пор?
Shooqie
Посмотри на эту мету , Такс.
Лохматый
3

R , 25 байт

cat((n=scan())*tan(pi/n))

Ввод из stdin, вывод в stdout.

Попробуйте онлайн!

Giuseppe
источник
1
Работает без cat(). На 5 байт меньше.
Руи Баррадас - Восстановить Моник
2

Ом v2 , 7 байт

απ/ÆT³*

Попробуйте онлайн!


Как?

απ / ÆT³ * Полная программа

απ Push Pi.
  / Разделенный на вход.
   TT Касательная.
     ³ * Умножается на вход.
          Неявный вывод.
Мистер Xcoder
источник
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
Zongor
источник
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)

Попробуйте онлайн!

Хуснайн Раза
источник
2
38 байтов
г-н Xcoder
В подобных случаях мне очень не нравится использовать лямбду для сохранения байтов, просто помещая отпечаток в нижний колонтитул ... Поэтому: 44 байта
Simon
4
@ Симон почему? Функции являются допустимым представлением - вы можете либо вывести значение, либо вернуть его из функции. Печать в нижнем колонтитуле не требуется.
Стивен
1

Pyth , 9 байт

*.tc.n0Q2

Тестирование.


Как?

* .tc.n0Q2 Полная программа. Q означает ввод.

    .n0 Pi. 
   c Разделенный на:
       Q вход.
 .t 2 Касательная.
* Q Умножьте на вход.
             Вывод неявно.
Мистер Xcoder
источник
1

Gaia , 5 байт

₵P÷ṫ×

Попробуйте онлайн!


Как?

₵ P ÷ ṫ × Полная программа.

Push P Push Pi.
  ÷ делится на вход.
   ṫ Касательная.
    × Умножьте на вход.
Мистер Xcoder
источник
1

Perl, 14 + 16 = 30

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

14 байтов для самой программы и 16 для переключателей командной строки


источник
0

IBM / Lotus Notes Formula Language, 13 байтов

a*@Tan(@Pi/a)

Ввод осуществляется через поле с именем a в той же форме, что и поле, содержащее формулу. TIO недоступен, поэтому скриншот всех тестовых случаев показан ниже:

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

ElPedro
источник
0

PowerShell , 38 байт

param($n)$n*[math]::tan([math]::pi/$n)

Попробуйте онлайн!

Делает именно то, что говорит на жестяной банке, просто занимает немного больше времени из-за длительных [math]::вызовов .NET.

AdmBorkBork
источник
0

C # (моно C # компилятор) , 24 байта


=>n*Math.Tan(Math.PI/n)

Попробуйте онлайн!

Амит Гаванде
источник
3
К сожалению, это не полная программа, не функция. Вместо этого это фрагмент, который здесь не разрешен. Тем не менее, я думаю, что вы можете добавить n=>в начало, чтобы превратить это в функцию стрелки (возьмите это с щепоткой соли, я не знаю C #), что является допустимым.
Кэрд coinheringaahing
Вы можете поместить фрагмент в a System.Func<T, T>, который будет принимать в floatкачестве входных данных, а другой - в качестве выходных. Декларация будет выглядеть следующим образом:, System.Func<float, float> f = n=>n*Math.Tan(Math.PI/n);где начнется bytecount 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
pizzapants184
источник