Oblicz powierzchnię regularnego wielokąta

19

Biorąc pod uwagę liczbę całkowitą, ngdzie 3 <= n < 2^32oblicz pole regularnego n-gona z apothemem 1; wzór, dla którego jest n * tan(π / n). Dla tych, którzy nie wiedzą, czym jest apothem:

Apothem zwykłego wielokąta jest odcinek linii od środka do środka jednego z jego boków.

Wypisuje obszar n-gon jako zmiennoprzecinkowy z nie mniej niż 8 miejscami dziesiętnymi.

Przypadki testowe

3
5.1961524227

6
3.4641016151

10
3.2491969623

20
3.1676888065

99
3.1426476062

1697
3.1415962425

15000
3.1415926995

Uwaga: powyższe przypadki testowe zawierają 2 cyfry więcej niż jest to wymagane do wydrukowania.

Zach Gates
źródło

Odpowiedzi:

9

Mathematica, 16 bajtów

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

Wypróbuj online!

oczywiście matematyka ma do tego wbudowane

Area@*RegularPolygon
J42161217
źródło
Area@RegularPolygonpowinno być Area@*RegularPolygon; tak jak jest teraz, nie można go przechwycić w zmiennej. Oznacza to, f = Area@RegularPolygon; f[3]że nie działa. Odpowiednia meta dyskusja
JungHwan Min
@JungHwanMin ok, naprawiłem to (chociaż nie opublikowałem tego jako odpowiedzi. Po prostu pokazywałem wbudowane funkcje dla zabawy)
J42161217
6

Właściwie 5 bajtów

╦/Tß*

Wypróbuj online!


W jaki sposób?

╦ / Tß * Pełny program.

╦ Naciśnij Pi.
 / Podziel ^ przez dane wejściowe.
  T Styczna.
   ß * Pomnóż przez dane wejściowe.
        Wynik niejawnie.

Alternatywa: ß╦/T*. o_O Właściwie to faktycznie pokonuje Galaretkę !!!

Pan Xcoder
źródło
Wbudowane
tak, wiem ... @EriktheOutgolfer 3 bajty wbudowane w Pyth choć>. <
Mr. Xcoder
3
+1 za „ Właściwie to bije Jelly !!! ” Ta gra słów nigdy się nie zestarzeje. ;)
Kevin Cruijssen
4

Kod maszynowy x87, 11 bajtów

D9 EB
DA 31
D9 F2
DD D8
DA 09
C3

Powyższe bajty kodu definiują funkcję, która oblicza obszar zwykłego n-gona z apothemem 1. Używa instrukcji x87 FPU (klasyczna jednostka zmiennoprzecinkowa na procesorach x86) do wykonania tego obliczenia.

Zgodnie ze standardową konwencją wywoływania opartą na rejestrze x86 (w tym przypadku __fastcall) argumentem funkcji jest wskaźnik do liczby całkowitej przekazywanej do ECXrejestru. Wynikiem tej funkcji jest wartość zmiennoprzecinkowa, zwracana na górze stosu zmiennoprzecinkowego (rejestr ST0) x87 .

Wypróbuj online!

Mnemoniki do montażu bez golfa:

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

Jak widać, jest to po prostu proste obliczenie podanej formuły,
     wynik = n * tan (π / n)
Wskazuje tylko kilka interesujących rzeczy:

  • FPU x87 ma dedykowaną instrukcję ładowania stałej wartości PI ( FLDPI). Było to rzadko używane, nawet z powrotem w ciągu dnia (i oczywiście znacznie mniej teraz), ale ma mniejszy rozmiar niż osadzanie stałej w pliku binarnym i ładowanie tego.
  • Instrukcja x87 FPU do obliczenia stycznej, FPTANzastępuje wartość rejestru wejściowego (górną część stosu FPU) wynikiem, ale także wypycha stałą 1,0 na górę stosu FPU. Odbywa się to dla kompatybilności wstecznej z 8087 (nie mam pojęcia, dlaczego zrobiono to na 8087; prawdopodobnie błąd). Oznacza to, że musimy usunąć tę niepotrzebną wartość ze stosu. Najszybszy i najkrótszy sposób, aby to zrobić, jest prosty FSTP st0, jak tutaj. Moglibyśmy również wykonać pomnożenie i pop , ponieważ pomnożenie przez 1,0 nie zmieni wyniku, ale są to również 2 bajty (więc nie ma wygranej w rozmiarze kodu), prawdopodobnie wykona się wolniej i może wprowadzić niepotrzebną nieokreśloność do wynik.

Chociaż nowoczesny programista lub kompilator używałby zestawu instrukcji SSE (i późniejszych) zamiast starzejącego się x87, wymagałoby to więcej kodu do wdrożenia, ponieważ nie ma jednej instrukcji do obliczenia stycznej w nowszych wersjach ISA.

Cody Gray
źródło
3

Galaretka , 6 bajtów

ØP÷ÆT×

Wypróbuj online!

Wbudowane π Jelly ma> 8 miejsc po przecinku.

Erik the Outgolfer
źródło
Ładny. Próbowałem to rozgryźć (i Galaretkę w całości), właśnie teraz. :-)
Zach Gates
3

Sakura , 4 bajty

*ij/π

Zostało to rozszerzone na *ij/π⓪⓪, czyli

*              *
 ij     tan(   )
  /         /
   π       π
    ⓪        n
     ⓪          n
TuxCrafting
źródło
1
Niekonkurencja już nie jest rzeczą.
Shaggy
@Shaggy, co masz na myśli? Od kiedy?
shooqie,
Zobacz to Meta , Tux.
Shaggy
3

R , 25 bajtów

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

Wejście ze standardowego wejścia, wyjście na standardowe wyjście.

Wypróbuj online!

Giuseppe
źródło
1
Działa bez cat(). 5 bajtów mniej.
Rui Barradas - Przywróć Monic
2

Japt , 7 bajtów

*MtMP/U

Sprawdź to


Wyjaśnienie

Po prostu implementuje forumla, gdzie Mtjest tan, MPjest pi i Ustanowi dane wejściowe.

Kudłaty
źródło
2

Ohm v2 , 7 bajtów

απ/ÆT³*

Wypróbuj online!


W jaki sposób?

απ / ÆT³ * Pełny program

απ Push Pi.
  / Podzielone przez dane wejściowe.
   TT Styczna.
     ³ * Pomnożone przez dane wejściowe.
          Wyjściowy wynik.
Pan Xcoder
źródło
2

var'aq , 51 bajtów

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

Wyjaśnienie

'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
źródło
2

JavaScript (ES6), 24 bajty

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

Spróbuj

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>

Kudłaty
źródło
1

Python 2 , 45 bajtów

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

Wypróbuj online!

Husnain Raza
źródło
2
38 bajtów
Mr. Xcoder,
W takich wyzwaniach naprawdę nie lubię używać lambda do oszczędzania bajtów, po prostu umieszczając nadruk w stopce ... Dlatego: 44 bajty
Simon
4
@ Simon dlaczego? Funkcje są poprawnym przesłaniem - możesz albo wyprowadzić wartość, albo zwrócić ją z funkcji. Wydruk w stopce nie jest wymagany.
Stephen
1

Pyth , 9 bajtów

*.tc.n0Q2

Zestaw testowy.


W jaki sposób?

* .tc.n0Q2 Pełny program. Q oznacza wkład.

    .n0 Pi. 
   c Podzielone przez:
       Q Wejście.
 .t 2 Styczna.
* Q Pomnóż przez dane wejściowe.
             Wynik niejawnie.
Pan Xcoder
źródło
1

Gaia , 5 bajtów

₵P÷ṫ×

Wypróbuj online!


W jaki sposób?

₵ P ÷ ṫ × Pełny program.

₵ P Push Pi.
  ÷ Podzielone przez dane wejściowe.
   ṫ Styczna.
    × Pomnóż przez dane wejściowe.
Pan Xcoder
źródło
1

Szybki , 35 bajtów

Z ostrzeżeniami kompilatora:

import Foundation
{tan(M_PI/$0)*$0}

Wypróbuj tutaj!

Bez ostrzeżeń kompilatora 40 bajtów :

import Foundation
{tan(Double.pi/$0)*$0}
Pan Xcoder
źródło
1

Excel, 16 bajtów

=A1*TAN(PI()/A1)
Wernisch
źródło
1

Perl, 14 + 16 = 30

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

14 bajtów dla właściwego programu i 16 dla przełączników wiersza poleceń


źródło
0

Prolog (SWI) , 25 bajtów

f(X,Y):-X is Y*tan(pi/Y).

Wypróbuj online!

To jest moje pierwsze zgłoszenie do codegolf, mam nadzieję, że mam się dobrze. Napisane jako funkcja.

qwertxzy
źródło
0

Język formuły IBM / Lotus Notes, 13 bajtów

a*@Tan(@Pi/a)

Dane wejściowe pobierane za pośrednictwem pola o nazwie a w tym samym formularzu, co pole zawierające formułę. Brak dostępnych TIO, więc zrzut ekranu wszystkich przypadków testowych pokazanych poniżej:

wprowadź opis zdjęcia tutaj

ElPedro
źródło
0

PowerShell , 38 bajtów

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

Wypróbuj online!

Robi dokładnie to, co jest napisane na puszce, tylko trochę dłużej z powodu długich [math]::połączeń .NET.

AdmBorkBork
źródło
0

C # (kompilator Mono C #) , 24 bajty


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

Wypróbuj online!

Amit Gawande
źródło
3
Niestety nie jest to ani pełny program, ani funkcja. Zamiast tego jest to fragment kodu, który nie jest tutaj dozwolony. Myślę jednak, że możesz dodać n=>na początku, aby uczynić to funkcją strzałki (weź to ze szczyptą soli, nie znam C #), co jest poprawne.
caird coinheringaahing
Możesz umieścić fragment kodu w pliku System.Func<T, T>, który pobierałby floatjako dane wejściowe, a drugi jako dane wyjściowe. Deklaracja wyglądałaby następująco System.Func<float, float> f = n=>n*Math.Tan(Math.PI/n);:, od której bytecount zaczynałby się n=>. W moim przykładzie pominąłem dwa z twoich nawiasów, aby zaoszczędzić 2 bajty;)
Ian H.,
0

RPNGolf 0,6 / 0,7 , 12 bajtów

tbp-1mBsdmcc

Mój pierwszy post przy użyciu RPNGolf, mojego nowego języka opartego na stosie!

Jest to pełny program, który odczytuje liczbę całkowitą ze standardowego wejścia i drukuje dane wyjściowe na standardowe wyjście (bez końcowego znaku nowej linii).

Wyjaśnienie:

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
pizzapanty184
źródło