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.

Odpowiedzi:


9

Mathematica, 16 bajtów

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

Wypróbuj online!

oczywiście matematyka ma do tego wbudowane

Area@*RegularPolygon

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ę !!!



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.








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.

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


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>



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.

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.



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ń



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





0

C # (kompilator Mono C #) , 24 bajty


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

Wypróbuj online!


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.