Normal bir çokgenin alanını hesaplama


19

Bir tamsayı verildiğinde n, burada 3 <= n < 2^32, n1'lik bir apothem ile normal bir -gonun alanını hesaplayın ; bunun için formül n * tan(π / n). Apothem'in ne olduğunu bilmeyenler için:

Düzenli bir çokgenin apothem, kenarlarından birinin ortasından orta noktasına doğru bir çizgi segmentidir.

n-Gon alanının en az 8 ondalık basamağa sahip olmayan bir kayan nokta olarak çıktısını alın.

Test senaryoları

3
5.1961524227

6
3.4641016151

10
3.2491969623

20
3.1676888065

99
3.1426476062

1697
3.1415962425

15000
3.1415926995

Not: Yukarıdaki test senaryoları, çıkmanız gerekenden 2 basamak daha içerir.

Yanıtlar:


9

Mathematica, 16 bayt

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

Çevrimiçi deneyin!

elbette mathematica bunun için yerleşik

Area@*RegularPolygon

Area@RegularPolygonolmalı Area@*RegularPolygon; şimdi olduğu gibi, bir değişkende yakalanamaz. Yani, f = Area@RegularPolygon; f[3]çalışmıyor. Alakalı meta tartışma
JungHwan Min

Tamam @JungHwanMin, tamir ettim (bir answer.I sadece eğlence için dahili ins gösteren gibi Bunu yayınlamama rağmen).
J42161217


6

Aslında 5 bayt

╦/Tß*

Çevrimiçi deneyin!


Nasıl?

╦ / Tß * Tam program.

Pi Pi düğmesine basın.
 / ^ Öğesini girişe bölün.
  T Teğet.
   ß * Girişle çarpın.
        Çıktı dolaylı olarak.

Alternatif: ß╦/T*. o_O Aslında gerçekte yener Jelly !!!


2 bayt yerleşik isimler ...
Outgolfer Erik

evet, biliyorum ... Pyth içinde @EriktheOutgolfer 3 bayt yerleşik ins gerçi> <.
Sayın Xcoder

3
+1 " Aslında aslında Jelly'i yener !!! " Bu kelime asla eskimez. ;)
Kevin Cruijssen

4

x87 Makine Kodu, 11 bayt

D9 EB
DA 31
D9 F2
DD D8
DA 09
C3

Yukarıdaki kod baytları, normal bir n-gon alanını 1 apothem ile hesaplayan bir işlevi tanımlar . Bu hesaplamayı yapmak için x87 FPU komutlarını (x86 işlemcilerdeki klasik kayan nokta birimi) kullanır.

Standart x86 kayıt tabanlı bir arama kuralını (bu durumda __fastcall) izleyen işlevin argümanı, ECXkayıtta iletilen tamsayıya bir göstericidir . İşlevin sonucu, x87 kayan nokta yığınının (kayıt ST0) en üstünde döndürülen bir kayan nokta değeridir .

Çevrimiçi deneyin!

Ungolfed montaj anımsatıcıları:

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

Gördüğünüz gibi, bu sadece verilen formülün basit bir hesaplamasıdır,
     sonuç = n * tan (π / n)
Sadece birkaç ilginç şey işaret ediyor:

  • X87 FPU, PI ( FLDPI) sabit değerini yüklemek için özel bir talimat içerir . Bu gün içinde bile nadiren kullanıldı (ve açıkçası şimdi çok daha az), ancak boyut, bir sabitin ikili dosyaya gömülmesinden ve yüklenmesinden daha kısa.
  • Teğet hesaplamak için x87 FPU komutu FPTAN, giriş yazmacının (FPU yığınının üst kısmı) değerini sonuçla değiştirir, ancak aynı zamanda FPU yığınının üstüne sabit 1.0'ı iter. Bu 8087 ile geriye dönük uyumluluk için yapılır (bunun neden 8087'de yapıldığı hakkında hiçbir fikrim yok; muhtemelen bir hata). Bu, gereksiz bu değeri yığının dışına çıkarmamız gerektiği anlamına gelir. Bunu yapmanın en hızlı ve en kısa yolu FSTP st0, burada kullandığımız gibi basit . Ayrıca, çarpma-ve-pop da yapabilirdik , çünkü 1.0 ile çarpmak sonucu değiştirmez, ancak bu da 2 bayttır (bu nedenle kod boyutunda kazanç olmaz), muhtemelen daha yavaş yürütülür ve gereksiz belirsizlik getirebilir sonuç.

Modern bir programcı veya derleyici, yaşlanma x87 yerine SSE (ve üstü) komut setini kullansa da, bu yeni ISA'larda bir teğet hesaplamak için tek bir talimat olmadığından, bunun uygulanması için daha fazla kod gerekir.









2

var'aq , 51 bayt

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

açıklama

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

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

Dene

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 bayt

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

Çevrimiçi deneyin!



Bunun gibi meydan okumalarda, sadece baskıları altbilgiye koyarak baytları kurtarmak için lambda kullanmayı gerçekten sevmiyorum ... Bu nedenle: 44 bayt
Simon

4
@Simon neden? İşlevler geçerli bir gönderimdir - bir değer çıktısı alabilir veya bir işlevden döndürebilirsiniz. Altbilgideki baskı gerekli değildir.
Stephen

1

Pyth , 9 bayt

*.tc.n0Q2

Test odası.


Nasıl?

* .tc.n0Q2 Tam program. Q giriş anlamına gelir.

    .n0 Pi. 
   c Bölünen:
       Q Giriş.
 .t 2 Teğet.
* Q Girişle çarpın.
             Çıktı dolaylı olarak.




1

Perl, 14 + 16 = 30

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

Program için 14 bayt ve komut satırı anahtarları için 16 bayt



0

IBM / Lotus Notes Formül Dili, 13 bayt

a*@Tan(@Pi/a)

Girdi, formülü içeren alanla aynı formda a adlı bir alan aracılığıyla alınır. TIO mevcut olmadığından aşağıda gösterilen tüm test senaryolarının ekran görüntüsü:

resim açıklamasını buraya girin





0

C # (Mono C # derleyici) , 24 bayt


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

Çevrimiçi deneyin!


3
Ne yazık ki, bu tam bir program değildir, bir işlev değildir. Bunun yerine, burada izin verilmeyen bir pasaj. Ancak, geçerli n=>bir ok işlevi (bunu bir tutam tuz ile almak, C # bilmiyorum) yapmak için başlayabilirsiniz ekleyebilirsiniz düşünüyorum .
caird coinheringaahing

Parçacığı, a girişini, diğerini çıkış olarak System.Func<T, T>alacak bir floata'ya yerleştirebilirsiniz. Beyanname şöyle görünecektir: System.Func<float, float> f = n=>n*Math.Tan(Math.PI/n);baytın nereden başlayacağı n=>. Örneğimde, 2 bayt kazanmak için parantezinizden ikisini atladım;)
Ian H.

0

RPNGolf 0.6 / 0.7 , 12 bayt

tbp-1mBsdmcc

Yeni yığın tabanlı dilim olan RPNGolf kullanan ilk yazım!

Bu, standart girişten bir tam sayı okuyan ve çıkışı standart çıkışa (son satırsonu olmadan) yazdıran tam bir programdır.

Açıklama:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.