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


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

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

@JungHwanMin хорошо, я исправил это (хотя я не отправлял это как ответ. Я только показывал встроенные модули для забавы)
J42161217


6

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

╦/Tß*

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


Как?

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

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

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


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.









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 байта
Simon

4
@ Симон почему? Функции являются допустимым представлением - вы можете либо вывести значение, либо вернуть его из функции. Печать в нижнем колонтитуле не требуется.
Стивен





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 недоступен, поэтому скриншот всех тестовых случаев показан ниже:

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





0

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.