คำนวณพื้นที่ของรูปหลายเหลี่ยมปกติ


19

รับจำนวนเต็มnที่ไหน3 <= n < 2^32คำนวณพื้นที่ของปกติn-gon กับ apothem ของ 1; n * tan(π / n)สูตรสำหรับซึ่งเป็น สำหรับผู้ที่ไม่ทราบว่า apothem คืออะไร:

Apothem ของรูปหลายเหลี่ยมปกติคือส่วนของเส้นตรงจากจุดกึ่งกลางไปยังจุดกึ่งกลางของด้านใดด้านหนึ่ง

เอาต์พุตพื้นที่ของn-gon เป็นจุดลอยตัวที่มีทศนิยมไม่ต่ำกว่า 8 ตำแหน่ง

กรณีทดสอบ

3
5.1961524227

6
3.4641016151

10
3.2491969623

20
3.1676888065

99
3.1426476062

1697
3.1415962425

15000
3.1415926995

หมายเหตุ: กรณีทดสอบด้านบนมีตัวเลข 2 หลักมากกว่าที่คุณต้องการเพื่อส่งออก

คำตอบ:


9

Mathematica ขนาด 16 ไบต์

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

ลองออนไลน์!

แน่นอนว่า mathematica ได้สร้าง -ins สำหรับสิ่งนี้

Area@*RegularPolygon

Area@RegularPolygonควรจะArea@*RegularPolygon; เนื่องจากตอนนี้มันไม่สามารถจับภาพในตัวแปรได้ นั่นคือf = Area@RegularPolygon; f[3]ไม่ทำงาน การสนทนาเมตาที่เกี่ยวข้อง
JungHwan Min

@JungHwanMin ตกลงฉันซ่อมมัน (แม้ว่าฉันจะไม่ได้โพสต์มันเป็นคำตอบฉันแค่แสดงบิวด์อินเพื่อความสนุก)
J42161217


6

ที่จริงแล้ว 5 ไบต์

╦/Tß*

ลองออนไลน์!


อย่างไร?

╦ / Tß * โปรแกรมเต็มรูปแบบ

╦กด Pi
 / หาร ^ โดยอินพุต
  t แทนเจนต์
   ß * คูณด้วยอินพุต
        ผลผลิตโดยปริยาย

ทางเลือก: ß╦/T*. o_O จริง ๆ แล้วเต้นJelly !


ชื่อบิวด์อินขนาด 2 ไบต์ ...
Erik the Outgolfer

ใช่ฉันรู้ ... @EriktheOutgolfer 3 ไบต์บิวด์อินใน Pyth แม้ว่า>> <
Mr. Xcoder

3
+1 สำหรับ "ที่จริงแล้วเต้น Jelly !!! " ปุนนั้นไม่เคยแก่ ;)
Kevin Cruijssen

4

x87 รหัสเครื่อง 11 ไบต์

D9 EB
DA 31
D9 F2
DD D8
DA 09
C3

ไบต์ของโค้ดด้านบนจะกำหนดฟังก์ชั่นที่คำนวณพื้นที่ของ n-gon ปกติด้วย apothem ที่ 1 โดยใช้คำสั่ง x87 FPU (หน่วยจุดลอยตัวแบบคลาสสิกบนโปรเซสเซอร์ x86) เพื่อทำการคำนวณนี้

หลังจากการเรียกใช้การลงทะเบียนแบบ x86 มาตรฐาน (ในกรณีนี้__fastcall) อาร์กิวเมนต์ของฟังก์ชันคือตัวชี้ไปยังจำนวนเต็มที่ส่งผ่านในการECXลงทะเบียน ผลลัพธ์ของฟังก์ชันคือค่าเลขทศนิยมซึ่งส่งคืนที่ด้านบนของ x87 จุดลอยตัวสแต็ก (รีจิสเตอร์ST0)

ลองออนไลน์!

คำย่อของชุดประกอบ Ungolfed:

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

อย่างที่คุณเห็นนี่เป็นเพียงการคำนวณสูตรที่ตรงไปตรง
     มา result = n * tan (π / n)
มีเพียงสิ่งที่น่าสนใจสองสามข้อที่ชี้ให้เห็น:

  • x87 FPU มีคำแนะนำเฉพาะสำหรับการโหลดค่าคงที่ PI ( FLDPI) สิ่งนี้ไม่ค่อยได้ใช้แม้แต่วัน (และตอนนี้ก็ชัดเจนน้อยกว่า) แต่ก็มีขนาดที่สั้นกว่าการฝังค่าคงที่ลงในไบนารีของคุณแล้วโหลดมัน
  • คำสั่ง x87 FPU เพื่อคำนวณแทนเจนต์, FPTANแทนที่ค่าของอินพุตรีจิสเตอร์ (ด้านบนของ FPU สแต็ก) ด้วยผลลัพธ์ แต่ยังเพิ่มค่าคงที่ 1.0 ลงด้านบนของ FPU สแต็ก สิ่งนี้ทำเพื่อความเข้ากันได้ย้อนหลังกับ 8087 (ฉันไม่รู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้นใน 8087 อาจเป็นข้อผิดพลาด) นั่นหมายความว่าเราจำเป็นต้องแสดงค่าที่ไม่จำเป็นนี้ออกจากสแต็ก วิธีที่เร็วและสั้นที่สุดในการทำเช่นนั้นเป็นเรื่องง่ายFSTP st0เหมือนที่เราใช้ที่นี่ เราสามารถทำทวีคูณและป๊อปได้เนื่องจากการคูณด้วย 1.0 จะไม่เปลี่ยนผลลัพธ์ แต่นี่ก็เป็น 2 ไบต์ (ดังนั้นจึงไม่ชนะขนาดรหัส) อาจทำงานช้ากว่าและอาจแนะนำการกำหนดที่ไม่จำเป็นเข้ามา ผลลัพธ์.

แม้ว่าโปรแกรมเมอร์หรือคอมไพเลอร์สมัยใหม่จะใช้ชุดคำสั่ง SSE (และรุ่นที่ใหม่กว่า) แทนที่จะเป็นชุดอายุ x87 แต่จะต้องใช้รหัสเพิ่มเติมในการติดตั้งเนื่องจากไม่มีคำสั่งเดียวในการคำนวณแทนเจนต์ใน ISAs ที่ใหม่กว่านี้




3

ซากุระขนาด 4 ไบต์

*ij/π

นี่คือการขยายไปสู่*ij/π⓪⓪ซึ่งเป็น

*              *
 ij     tan(   )
  /         /
   π       π
    ⓪        n
     ⓪          n

1
ไม่ใช่การแข่งขันไม่ใช่เรื่องอื่นอีกแล้ว
Shaggy

@Shaggy คุณหมายถึงอะไร ตั้งแต่เมื่อไหร่
shooqie

ดูMeta , Tux
Shaggy





2

var'aq , 51 ไบต์

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

คำอธิบาย

'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



1

Python 2 , 45 ไบต์

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

ลองออนไลน์!



ในการท้าทายแบบนี้ฉันไม่ชอบการใช้แลมบ์ดาเพื่อบันทึกไบต์โดยเพียงพิมพ์ลงในส่วนท้าย ... ดังนั้น: 44 ไบต์
Simon

4
@Simon ทำไม ฟังก์ชั่นเป็นการส่งที่ถูกต้อง - คุณสามารถส่งออกค่าหรือส่งคืนจากฟังก์ชั่น ไม่จำเป็นต้องพิมพ์ในส่วนท้าย
Stephen

1

Pyth , 9 ไบต์

*.tc.n0Q2

ชุดทดสอบ


อย่างไร?

* .tc.n0Q2 โปรแกรมเต็มรูปแบบ Q หมายถึงอินพุต

    .n0 Pi 
   c หารด้วย:
       Q การป้อนข้อมูล
 .t 2 แทนเจนต์
* Q คูณด้วยอินพุต
             ผลผลิตโดยปริยาย




1

Perl, 14 + 16 = 30

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

14 ไบต์สำหรับโปรแกรมที่เหมาะสมและ 16 สำหรับสวิตช์บรรทัดคำสั่ง



0

ภาษาสูตร IBM / Lotus Notes ขนาด 13 ไบต์

a*@Tan(@Pi/a)

ข้อมูลที่ป้อนผ่านฟิลด์ชื่อ a บนแบบฟอร์มเดียวกับฟิลด์ที่มีสูตร ไม่มี TIO ให้ภาพหน้าจอของกรณีทดสอบทั้งหมดที่แสดงด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่





0

3
น่าเสียดายที่นี่ไม่ใช่โปรแกรมที่สมบูรณ์ไม่ใช่ฟังก์ชั่น แต่เป็นตัวอย่างซึ่งไม่ได้รับอนุญาตที่นี่ อย่างไรก็ตามฉันคิดว่าคุณสามารถเพิ่มn=>ไปยังจุดเริ่มต้นเพื่อทำให้สิ่งนี้เป็นฟังก์ชั่นลูกศร (ใช้สิ่งนี้ด้วยเกลือนิดหน่อยฉันไม่รู้ C #) ซึ่งใช้ได้
caird coinheringaahing

คุณสามารถวางข้อมูลโค้ดลงใน a System.Func<T, T>ซึ่งจะใช้floatเป็นอินพุตและอีกอันหนึ่งเป็นเอาต์พุต การประกาศจะมีลักษณะเช่นนี้System.Func<float, float> f = n=>n*Math.Tan(Math.PI/n);ที่ bytecount n=>จะเริ่มต้นที่ ในตัวอย่างของฉันฉันละเว้นสองวงเล็บของคุณเพื่อประหยัด 2 ไบต์;)
เอียนเอช

0

RPNGolf 0.6 / 0.7 , 12 ไบต์

tbp-1mBsdmcc

โพสต์แรกของฉันที่ใช้ RPNGolf ซึ่งเป็นภาษาสแต็กใหม่ของฉัน!

นี่เป็นโปรแกรมเต็มรูปแบบที่อ่านจำนวนเต็มจากอินพุตมาตรฐานและพิมพ์เอาต์พุตไปยังเอาต์พุตมาตรฐาน (โดยไม่ขึ้นบรรทัดใหม่)

คำอธิบาย:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.