Hitung luas poligon reguler

19

Diberikan bilangan bulat,, di nmana 3 <= n < 2^32, menghitung luas n-gon reguler dengan apotema 1; rumus untuk yang n * tan(π / n). Bagi mereka yang tidak tahu apa itu apotema:

Apotem poligon beraturan adalah segmen garis dari pusat ke titik tengah salah satu sisinya.

Keluarkan area n-gon sebagai titik mengambang dengan tidak kurang dari 8 tempat desimal.

Uji kasus

3
5.1961524227

6
3.4641016151

10
3.2491969623

20
3.1676888065

99
3.1426476062

1697
3.1415962425

15000
3.1415926995

Catatan: Kasing uji di atas mencakup 2 digit lebih banyak dari yang dibutuhkan untuk menghasilkan.

Zach Gates
sumber

Jawaban:

9

Mathematica, 16 byte

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

Cobalah online!

tentu saja Mathematica memiliki built-in untuk ini

Area@*RegularPolygon
J42161217
sumber
Area@RegularPolygonseharusnya Area@*RegularPolygon; seperti sekarang, tidak bisa ditangkap dalam variabel. Artinya, f = Area@RegularPolygon; f[3]tidak berfungsi. Diskusi meta yang relevan
JungHwan Min
@JungHwanMin ok, saya memperbaikinya (walaupun saya tidak mempostingnya sebagai jawaban. Saya baru saja menunjukkan built-in untuk bersenang-senang)
J42161217
6

Sebenarnya , 5 byte

╦/Tß*

Cobalah online!


Bagaimana?

╦ / Tß * Program lengkap.

╦ Dorong Pi.
 / Bagi ^ dengan input.
  T Tangent.
   ß * Kalikan dengan input.
        Output tersirat.

Alternatif: ß╦/T*. o_O Sebenarnya sebenarnya mengalahkan Jelly !!!

Tuan Xcoder
sumber
2-byte builtin names ...
Erik the Outgolfer
ya, saya tahu ... @EriktheOutgolfer built-in 3 byte di Pyth>. <
Mr. Xcoder
3
+1 untuk " Sebenarnya sebenarnya mengalahkan Jelly !!! " Permainan kata itu tidak pernah menjadi tua. ;)
Kevin Cruijssen
4

x87 Kode Mesin, 11 byte

D9 EB
DA 31
D9 F2
DD D8
DA 09
C3

Byte kode di atas mendefinisikan fungsi yang menghitung luas n-gon reguler dengan apothem 1. Menggunakan instruksi FPU x87 (unit floating-point klasik pada prosesor x86) untuk melakukan perhitungan ini.

Mengikuti konvensi pemanggilan berbasis register x86 standar (dalam hal ini, __fastcall), argumen fungsi adalah sebuah pointer ke integer, diteruskan dalam ECXregister. Hasil fungsi adalah nilai titik-mengambang, dikembalikan di bagian atas tumpukan titik-mengambang x87 (register ST0).

Cobalah online!

Mnemonik perakitan tidak dikumpulkan:

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

Seperti yang Anda lihat, ini pada dasarnya hanya perhitungan langsung dari rumus yang diberikan,
     hasil = n * tan (π / n)
Hanya beberapa hal menarik yang menunjukkan:

  • FPU x87 memiliki instruksi khusus untuk memuat nilai konstan PI ( FLDPI). Ini jarang digunakan, bahkan pada hari itu (dan jelas jauh lebih sedikit sekarang), tetapi ukurannya lebih pendek daripada memasukkan konstanta ke dalam biner Anda dan memuatnya.
  • Instruksi FPU x87 untuk menghitung garis singgung,, FPTANmenggantikan nilai register input (bagian atas tumpukan FPU) dengan hasilnya, tetapi juga mendorong konstanta 1,0 ke atas tumpukan FPU. Ini dilakukan untuk kompatibilitas dengan 8087 (saya tidak tahu mengapa ini dilakukan pada 8087; mungkin bug). Itu berarti kita perlu membuang nilai yang tidak dibutuhkan ini dari tumpukan. Cara tercepat dan terpendek untuk melakukannya adalah sederhana FSTP st0, seperti yang kami gunakan di sini. Kita juga bisa melakukan multiply-and-pop , karena mengalikan dengan 1,0 tidak akan mengubah hasilnya, tetapi ini juga 2 byte (jadi tidak ada kemenangan dalam ukuran kode), mungkin akan mengeksekusi lebih lambat, dan dapat memperkenalkan ketidakpastian yang tidak perlu ke dalam hasil.

Meskipun seorang programmer atau kompiler modern akan menggunakan set instruksi SSE (dan yang lebih baru), daripada x87 yang menua, ini akan membutuhkan lebih banyak kode untuk diimplementasikan, karena tidak ada instruksi tunggal untuk menghitung garis singgung dalam SPA yang lebih baru ini.

Cody Grey
sumber
3

Jelly , 6 byte

ØP÷ÆT×

Cobalah online!

Jelly bawaan has memiliki> 8 tempat desimal.

Erik the Outgolfer
sumber
Bagus. Saya sedang mencoba mencari tahu ini (dan Jelly secara keseluruhan), sekarang. :-)
Zach Gates
3

Sakura , 4 byte

*ij/π

Ini diperluas ke *ij/π⓪⓪, yaitu

*              *
 ij     tan(   )
  /         /
   π       π
    ⓪        n
     ⓪          n
TuxCrafting
sumber
1
Non-bersaing bukan hal lagi.
Shaggy
@ Shaggy apa maksudmu? Sejak kapan?
shooqie
Lihat Meta ini , Tux.
Shaggy
3

R , 25 byte

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

Input dari stdin, output ke stdout.

Cobalah online!

Giuseppe
sumber
1
Bekerja tanpa cat(). 5 byte lebih sedikit.
Rui Barradas - Reinstate Monic
2

Japt , 7 byte

*MtMP/U

Menguji


Penjelasan

Hanya mengimplementasikan forumla, di mana Mttan, MPadalah pi dan Uinputnya.

Shaggy
sumber
2

Ohm v2 , 7 byte

απ/ÆT³*

Cobalah online!


Bagaimana?

απ / ÆT³ * Program Lengkap

απ Tekan Pi.
  / Dibagi dengan input.
   TangT Tangen.
     ³ * Dikalikan dengan input.
          Keluaran tersirat.
Tuan Xcoder
sumber
2

var'aq , 51 byte

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

Penjelasan

'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
sumber
2

JavaScript (ES6), 24 byte

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

Cobalah

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>

Shaggy
sumber
1

Python 2 , 45 byte

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

Cobalah online!

Husnain Raza
sumber
2
38 byte
Mr. Xcoder
Dalam tantangan seperti ini, saya sangat tidak suka menggunakan lambda untuk menyimpan byte dengan hanya meletakkan cetakan di footer ... Oleh karena itu: 44 byte
Simon
4
@Simon mengapa? Fungsi adalah pengiriman yang valid - Anda bisa mengeluarkan nilai, atau mengembalikannya dari suatu fungsi. Cetak di footer tidak diperlukan.
Stephen
1

Pyth , 9 byte

*.tc.n0Q2

Suite uji.


Bagaimana?

* .tc.n0Q2 Program lengkap. Q berarti input.

    .n0 Pi. 
   c Dibagi oleh:
       Q Masukan.
 .t 2 Tangen.
* Q Kalikan dengan input.
             Output tersirat.
Tuan Xcoder
sumber
1

Gaia , 5 byte

₵P÷ṫ×

Cobalah online!


Bagaimana?

₵ P ÷ ṫ × Program lengkap.

₵ P Push Pi.
  ÷ Dibagi berdasarkan input.
   ṫ Tangen.
    × Kalikan dengan input.
Tuan Xcoder
sumber
1

Swift , 35 byte

Dengan peringatan kompiler:

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

Coba di sini!

Tanpa peringatan kompiler, 40 byte :

import Foundation
{tan(Double.pi/$0)*$0}
Tuan Xcoder
sumber
1

Excel, 16 byte

=A1*TAN(PI()/A1)
Wernisch
sumber
1

Perl, 14 + 16 = 30

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

14 byte untuk program yang tepat, dan 16 untuk switch baris perintah


sumber
0

Prolog (SWI) , 25 byte

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

Cobalah online!

Ini adalah pengiriman pertama saya ke codegolf, harap saya baik-baik saja. Ditulis sebagai fungsi.

qwertxzy
sumber
0

Bahasa Formula IBM / Lotus Notes, 13 byte

a*@Tan(@Pi/a)

Input diambil melalui bidang bernama a pada formulir yang sama dengan bidang yang berisi rumus. Tidak ada TIO yang tersedia sehingga tangkapan layar dari semua kasus uji yang ditunjukkan di bawah:

masukkan deskripsi gambar di sini

ElPedro
sumber
0

PowerShell , 38 byte

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

Cobalah online!

Melakukan persis apa yang tertulis di kaleng, hanya butuh sedikit lebih lama karena [math]::panggilan NET lama .

AdmBorkBork
sumber
0

C # (Mono C # compiler) , 24 byte


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

Cobalah online!

Amit Gawande
sumber
3
Sayangnya, ini bukan program yang lengkap, bukan fungsi. Alih-alih itu cuplikan, yang tidak diizinkan di sini. Namun, saya pikir Anda dapat menambahkan n=>ke awal untuk membuat ini menjadi fungsi panah (ambil ini dengan sejumput garam, saya tidak tahu C #) yang valid.
caird coinheringaahing
Anda dapat menempatkan potongan ke dalam System.Func<T, T>, yang akan mengambil floatinput sebagai dan yang lain sebagai output. Deklarasi akan terlihat seperti ini System.Func<float, float> f = n=>n*Math.Tan(Math.PI/n);:, di mana bytecount akan dimulai n=>. Dalam contoh saya, saya menghilangkan dua tanda kurung Anda untuk menghemat 2 byte;)
Ian H.
0

RPNGolf 0.6 / 0.7 , 12 byte

tbp-1mBsdmcc

Posting pertama saya menggunakan RPNGolf, bahasa berbasis stack baru saya!

Ini adalah program lengkap yang membaca bilangan bulat dari input standar dan mencetak output ke output standar (tanpa baris tambahan).

Penjelasan:

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
sumber