Tính diện tích của một đa giác thông thường


19

Cho một số nguyên, ntrong đó 3 <= n < 2^32, tính diện tích của một đường thẳng thông thường nvới một apothem là 1; công thức cho nó là n * tan(π / n). Đối với những người không biết apothem là gì:

Apothem của một đa giác thông thường là một đoạn thẳng từ tâm đến trung điểm của một trong các cạnh của nó.

Xuất diện tích của đường nchéo dưới dạng một điểm nổi với không ít hơn 8 chữ số thập phân.

Các trường hợp thử nghiệm

3
5.1961524227

6
3.4641016151

10
3.2491969623

20
3.1676888065

99
3.1426476062

1697
3.1415962425

15000
3.1415926995

Lưu ý: Các trường hợp kiểm tra ở trên bao gồm 2 chữ số nhiều hơn bạn bắt buộc phải xuất.

Câu trả lời:


9

Toán học, 16 byte

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

Hãy thử trực tuyến!

tất nhiên mathicala đã tích hợp sẵn cho việc này

Area@*RegularPolygon

Area@RegularPolygonnên được Area@*RegularPolygon; như bây giờ, nó không thể bị bắt trong một biến. Đó là, f = Area@RegularPolygon; f[3]không hoạt động. Thảo luận meta có liên quan
JungHwan Min

@JungHwanMin ok, tôi cố định nó (mặc dù tôi đã không gửi nó như một answer.I chỉ hiển thị được xây dựng-in cho vui).
J42161217


6

Trên thực tế , 5 byte

╦/Tß*

Hãy thử trực tuyến!


Làm sao?

╦ / Tß * Chương trình đầy đủ.

Đẩy Pi.
 / Chia ^ cho đầu vào.
  T tiếp tuyến.
   ß * Nhân với đầu vào.
        Đầu ra ngầm.

Thay thế : ß╦/T*. o_O Thực sự đánh bại Jelly !!!


Tên dựng sẵn 2 byte ...
Erik the Outgolfer

vâng, tôi biết ... @EriktheOutgolfer 3 byte dựng sẵn trong Pyth mặc dù>. <
Ông Xcoder

3
+1 cho " Thực sự đánh bại Jelly !!! " Trò chơi chữ đó không bao giờ cũ. ;)
Kevin Cruijssen

4

Mã máy x87, 11 byte

D9 EB
DA 31
D9 F2
DD D8
DA 09
C3

Các byte mã trên xác định hàm tính diện tích của một n-gon thông thường với một apothem là 1. Nó sử dụng các lệnh x87 FPU (đơn vị dấu phẩy động cổ điển trên bộ xử lý x86) để thực hiện tính toán này.

Theo một quy ước gọi dựa trên thanh ghi x86 tiêu chuẩn (trong trường hợp này __fastcall), đối số của hàm là một con trỏ tới số nguyên, được truyền trong thanh ECXghi. Kết quả của hàm là một giá trị dấu phẩy động, được trả về ở đầu ngăn xếp dấu phẩy động x87 (thanh ghi ST0).

Hãy thử trực tuyến!

Ma thuật lắp ráp bất khả xâm phạm:

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

Như bạn có thể thấy, về cơ bản, đây chỉ là một tính toán đơn giản của công thức đã cho,
     result = n * tan (π / n)
Chỉ có một vài điều thú vị được chỉ ra:

  • FPU x87 có một hướng dẫn chuyên dụng để tải giá trị không đổi PI ( FLDPI). Điều này hiếm khi được sử dụng, thậm chí trở lại vào ban ngày (và rõ ràng là ít hơn bây giờ), nhưng nó có kích thước ngắn hơn so với việc nhúng một hằng số vào nhị phân của bạn và tải nó.
  • Lệnh x87 FPU để tính tiếp tuyến, FPTANthay thế giá trị của thanh ghi đầu vào (đỉnh của ngăn xếp FPU) bằng kết quả, nhưng cũng đẩy một hằng số 1.0 lên trên đỉnh của ngăn xếp FPU. Điều này được thực hiện để tương thích ngược với 8087 (Tôi không biết tại sao điều này được thực hiện trên 8087; có lẽ là một lỗi). Điều đó có nghĩa là chúng ta cần loại bỏ giá trị không cần thiết này khỏi ngăn xếp. Cách nhanh nhất và ngắn nhất để làm điều đó là đơn giản FSTP st0, như chúng ta sử dụng ở đây. Chúng tôi cũng có thể thực hiện phép nhân và pop , vì nhân với 1.0 sẽ không thay đổi kết quả, nhưng đây cũng là 2 byte (vì vậy không thắng trong kích thước mã), có thể sẽ thực thi chậm hơn và có thể đưa ra sự không xác định không cần thiết vào kết quả.

Mặc dù một lập trình viên hoặc trình biên dịch hiện đại sẽ sử dụng tập lệnh SSE (và phiên bản mới hơn), thay vì x87 cũ, điều này sẽ đòi hỏi nhiều mã hơn để thực hiện, vì không có lệnh nào để tính tiếp tuyến trong các ISA mới hơn này.




3

Sakura , 4 byte

*ij/π

Điều này được mở rộng đến *ij/π⓪⓪, đó là

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

1
Không cạnh tranh không phải là một điều nữa.
Xù xì

@Shaggy có nghĩa là gì? Kể từ khi?
shooqie

Xem Meta này , Thục.
Xù xì





2

var'aq , 51 byte

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

Giải trình

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

Thử nó

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)

Hãy thử trực tuyến!



Trong các challang như thế này, tôi thực sự không thích sử dụng lambda để lưu byte bằng cách chỉ in bản in ở chân trang ... Do đó: 44 byte
Simon

4
@Simon tại sao? Hàm là một đệ trình hợp lệ - bạn có thể xuất giá trị hoặc trả về từ hàm. Bản in ở chân trang không bắt buộc.
Stephen





1

Perl, 14 + 16 = 30

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

14 byte cho chương trình thích hợp và 16 byte cho chuyển đổi dòng lệnh



0

Ngôn ngữ công thức ghi chú của IBM / Lotus, 13 byte

a*@Tan(@Pi/a)

Đầu vào được thực hiện thông qua một trường có tên a trên cùng một hình thức với trường có chứa công thức. Không có TIO nên ảnh chụp màn hình của tất cả các trường hợp thử nghiệm được hiển thị bên dưới:

nhập mô tả hình ảnh ở đây





0

3
Thật không may, đây không phải là một chương trình hoàn chỉnh, không phải là một chức năng. Thay vào đó là một đoạn trích, không được phép ở đây. Tuy nhiên, tôi nghĩ rằng bạn có thể thêm n=>vào lúc bắt đầu để biến điều này thành hàm mũi tên (lấy cái này bằng một nhúm muối, tôi không biết C #) là hợp lệ.
caird coinheringaahing

Bạn có thể đặt đoạn mã vào một System.Func<T, T>, cái sẽ lấy floatđầu vào làm đầu vào và một đoạn khác làm đầu ra. Tuyên bố sẽ trông như thế này : System.Func<float, float> f = n=>n*Math.Tan(Math.PI/n);, nơi mà bytecount sẽ bắt đầu tại n=>. Trong ví dụ của tôi, tôi đã bỏ qua hai dấu ngoặc của bạn để lưu 2 byte;)
Ian H.

0

RPNGolf 0,6 / 0,7 , 12 byte

tbp-1mBsdmcc

Bài đăng đầu tiên của tôi sử dụng RPNGolf, ngôn ngữ dựa trên ngăn xếp mới của tôi!

Đây là một chương trình đầy đủ đọc một số nguyên từ đầu vào tiêu chuẩn và in đầu ra thành đầu ra tiêu chuẩn (không có dòng mới).

Giải trình:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.