Calcola l'area di un poligono regolare


19

Dato un numero intero, ndove 3 <= n < 2^32, calcola l'area di un normale n-gon con un apotema di 1; la formula per cui è n * tan(π / n). Per quelli che non sanno cos'è l'apotema:

L'apotema di un poligono regolare è un segmento di linea dal centro al punto medio di uno dei suoi lati.

nEmette l'area del -gon come punto mobile con non meno di 8 cifre decimali.

Casi test

3
5.1961524227

6
3.4641016151

10
3.2491969623

20
3.1676888065

99
3.1426476062

1697
3.1415962425

15000
3.1415926995

Nota: i casi di test sopra riportati includono 2 cifre in più di quelle necessarie per l'output.

Risposte:


9

Mathematica, 16 byte

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

Provalo online!

ovviamente matematica ha incorporato per questo

Area@*RegularPolygon

Area@RegularPolygondovrebbe essere Area@*RegularPolygon; com'è ora, non può essere catturato in una variabile. Cioè, f = Area@RegularPolygon; f[3]non funziona. Meta discussione pertinente
JungHwan Min

@JungHwanMin ok, l'ho risolto (anche se non l'ho pubblicato come risposta. Stavo solo mostrando gli elementi incorporati per divertimento)
J42161217


6

In realtà , 5 byte

╦/Tß*

Provalo online!


Come?

╦ / Tß * Programma completo.

╦ Premere Pi.
 / Dividi ^ per l'input.
  T Tangente.
   ß * Moltiplicare per l'input.
        Uscita implicita.

Alternativa: ß╦/T*. o_O In realtà batte Jelly !!!


Nomi incorporati a 2 byte ...
Erik the Outgolfer

sì, lo so ... @EriktheOutgolfer 3 byte integrati in Pyth però>. <
Mr. Xcoder

3
+1 per " In realtà batte Jelly !!! " Quel gioco di parole non invecchia mai. ;)
Kevin Cruijssen il

4

x87 Codice macchina, 11 byte

D9 EB
DA 31
D9 F2
DD D8
DA 09
C3

I byte di codice sopra definiti definiscono una funzione che calcola l'area di una normale n-gon con un apotema di 1. Utilizza queste istruzioni FPU x87 (la classica unità a virgola mobile sui processori x86) per eseguire questo calcolo.

Seguendo una convenzione di chiamata standard x86 basata sul registro (in questo caso __fastcall), l'argomento della funzione è un puntatore all'intero, passato nel ECXregistro. Il risultato della funzione è un valore in virgola mobile, restituito nella parte superiore dello stack in virgola mobile x87 (registro ST0).

Provalo online!

Mnemonici di assemblaggio non golfati:

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

Come puoi vedere, questo è fondamentalmente solo un semplice calcolo della formula data,
     risultato = n * tan (π / n)
Solo un paio di cose interessanti portano alla luce:

  • La FPU x87 ha un'istruzione dedicata per il caricamento del valore costante PI ( FLDPI). Questo veniva usato raramente, anche nel passato (e ovviamente molto meno ora), ma ha dimensioni più ridotte rispetto all'incorporamento di una costante nel tuo binario e al caricamento.
  • L'istruzione FPU x87 per calcolare la tangente, FPTANsostituisce il valore del registro di input (la parte superiore dello stack FPU) con il risultato, ma spinge anche un costante 1,0 nella parte superiore dello stack FPU. Questo viene fatto per la retrocompatibilità con l'8087 (non ho idea del perché ciò sia stato fatto sull'8087; probabilmente un bug). Ciò significa che dobbiamo eliminare questo valore non necessario dallo stack. Il modo più rapido e breve per farlo è semplice FSTP st0, come usiamo qui. Avremmo anche potuto fare un moltiplicare e pop , poiché la moltiplicazione per 1.0 non cambierà il risultato, ma questo è anche 2 byte (quindi nessuna vincita nella dimensione del codice), probabilmente verrà eseguito più lentamente e potrebbe introdurre indeterminazione non necessaria in il risultato.

Sebbene un programmatore o compilatore moderno userebbe il set di istruzioni SSE (e successive), piuttosto che l'invecchiamento x87, ciò richiederebbe più codice da implementare, poiché non esiste una singola istruzione per calcolare una tangente in questi ISA più recenti.







2

Japt , 7 byte

*MtMP/U

Provalo


Spiegazione

Implementa solo il forumla, dove Mtè tan, MPè pi ed Uè l'input.


2

Ohm v2 , 7 byte

απ/ÆT³*

Provalo online!


Come?

απ / ÆT³ * Programma completo

απ Push Pi.
  / Diviso per l'ingresso.
   TangT Tangente.
     ³ * Moltiplicato per l'ingresso.
          Uscita implicita.

2

var'aq , 51 byte

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

Spiegazione

'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 byte

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

Provalo

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 byte

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

Provalo online!



In sfide come questa non mi piace molto usare lambda per salvare i byte semplicemente inserendo la stampa nel piè di pagina ... Pertanto: 44 byte
Simon

4
@Simon perché? Le funzioni sono un invio valido: è possibile emettere un valore o restituirlo da una funzione. La stampa nel piè di pagina non è richiesta.
Stephen,

1

Pyth , 9 byte

*.tc.n0Q2

Suite di test.


Come?

* .tc.n0Q2 Programma completo. Q significa input.

    .n0 Pi. 
   c Diviso per:
       Q L'input.
 .t 2 Tangente.
* Q Moltiplicare per l'input.
             Uscita implicita.

1

Gaia , 5 byte

₵P÷ṫ×

Provalo online!


Come?

₵ P ÷ ṫ × Programma completo.

₵ P Premere Pi.
  ÷ Diviso per l'ingresso.
   ṫ tangente.
    × Moltiplicare per l'input.



1

Perl, 14 + 16 = 30

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

14 byte per il programma corretto e 16 per le opzioni della riga di comando



0

Linguaggio formula IBM / Lotus Notes, 13 byte

a*@Tan(@Pi/a)

Input prelevato tramite un campo denominato a nella stessa forma del campo contenente la formula. Nessun TIO disponibile, quindi screenshot di tutti i casi di test mostrati di seguito:

inserisci qui la descrizione dell'immagine


0

PowerShell , 38 byte

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

Provalo online!

Fa esattamente quello che dice sulla scatola, richiede solo un po 'più di tempo a causa delle lunghe [math]::chiamate .NET.




0

C # (compilatore Mono C #) , 24 byte


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

Provalo online!


3
Sfortunatamente, questo non è né un programma completo, né una funzione. Invece è uno snippet, che non è consentito qui. Tuttavia, penso che puoi aggiungere n=>all'inizio per renderlo una funzione freccia (prendilo con un pizzico di sale, non conosco C #) che è valido.
caird coinheringaahing

Puoi inserire lo snippet in a System.Func<T, T>, che richiederebbe un floatinput e un altro come output. La dichiarazione sarebbe simile a questa System.Func<float, float> f = n=>n*Math.Tan(Math.PI/n);:, da dove inizierebbe il Bytecount n=>. Nel mio esempio ho omesso due delle tue parentesi per salvare 2 byte;)
Ian H.

0

RPNGolf 0.6 / 0.7 , 12 byte

tbp-1mBsdmcc

Il mio primo post con RPNGolf, il mio nuovo linguaggio basato sullo stack!

Questo è un programma completo che legge un numero intero dall'input standard e stampa l'output sull'output standard (senza una nuova riga finale).

Spiegazione:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.