Vòng tròn N chiều!


16

Viết chương trình lấy hai số làm đầu vào. Cái đầu tiên là số thứ nguyên - 0 cho một dấu chấm, 1 cho một đường thẳng, 2 cho một vòng tròn, 3 cho một hình cầu. Số thứ hai là bán kính của đối tượng, hoặc, nếu đó là 1 chiều, chính số đó. Đầu ra 0 cho 0 kích thước. Đầu ra là chiều dài / diện tích / thể tích của đối tượng.

Nếu chúng ta gọi số đầu tiên n, số thứ hai rvà đầu ra x, chúng ta sẽ nhận được:

  • cho n = 0, x = 1

  • cho n = 1, x = 2 × r

  • cho n = 2, x = r 2 × π

  • cho n = 3, x = ( 4 / 3 ) × r 3 × π

  • và v.v ... nếu bạn muốn, mặc dù.

Ghi chú:

  • Các trường hợp khi một hoặc cả hai số âm hoặc khi số đầu tiên không toàn bộ, không cần phải được bảo hiểm.

  • Chương trình không được đọc từ bất kỳ tập tin nào và đầu vào duy nhất là hai số đó.

  • Đầu ra chỉ nên sử dụng các chữ số (ví dụ: "14 * pi") và phải chính xác đến ít nhất hai chữ số thập phân.

  • Đối với n = 0, bạn có thể xuất 0 nếu nó làm cho mã ngắn hơn.

  • Swag thêm cho một câu trả lời bao gồm cả "hình cầu" 4 chiều và nhiều chiều hơn!

  • Đó là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!

Ví dụ:

 1 1 -> 2

 2 3 -> 28,27

 3 1 -> 4,19

 3 4,5 -> 381,70

 1 9.379 -> 18.758

 0 48 -> 1

2
Yay! Tôi yêu phương trình MathJax sai trong bài viết!
RudolfJelin

1
Không chỉ trích, nhưng tôi không thấy làm thế nào một dòng có thể được coi là vòng tròn 1d ...
xem

10
@xem Hãy xem xét một vòng tròn vì tất cả các điểm nằm trong một khoảng cách nhất định từ trung tâm
Luis Mendo

3
Các loại toán học sẽ gọi những "quả bóng" có kích thước khác nhau. Tập hợp các điểm có khoảng cách từ điểm gốc == rlà hình cầu, tập hợp các điểm có khoảng cách từ điểm gốc <= rlà quả bóng. Thì đó là 0-ball = point, 1-ball = Seg, 2-ball = đĩa, 3-ball = ball, 4-ball, 5-ball, et c. (được liệt kê là " n-ball = tên chung").
Tháp Eric

3
"Đầu ra 0 cho 0 kích thước" và "cho n = 0, x = 1" trái ngược nhau. Bạn có thể vui lòng chọn một (hoặc làm rõ rằng cả hai đều được phép)?
Paŭlo Ebermann

Câu trả lời:


7

Jelly , 13 byte + swag thêm

÷2µØP*÷!
ç×*@

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

Hoạt động cho bất kỳ kích thước nào, miễn là giá trị cố định của π mang lại bởi ØP( 3.141592653589793) là đủ chính xác.

Làm sao?

÷2µØP*÷! - Link 1: n, r
÷2       - n / 2
  µ      - monadic chain separation
   ØP    - π (3.141592653589793)
     *   - exponentiate: π^(n/2)
       ! - Pi(n/2): Gamma(n/2 + 1)
      ÷  - divide: π^(n/2) / Gamma(n/2 + 1)

ç×*@     - Main link: n, r
ç        - call last link (1) as a dyad: π^(n/2) / Gamma(n/2 + 1)
  *@     - exponentiate with reversed @rguments: r^n
 ×       - multiply: r^n * π^(n/2) / Gamma(n/2 + 1)

1
Làm tốt cho việc đánh bại Mathicala!
Dennis

Xin chúc mừng, bạn đã thắng!
RudolfJelin

13

Mathicala, 18 byte, lên tới ~ 168,15 nghìn tỷ

Pi^(a=.5#)/a!#2^#&

Chức năng ẩn danh. Lấy hai số làm đầu vào và trả về một số không chính xác làm đầu ra. Hoạt động với bất kỳ số lượng kích thước. Đầu ra 1.cho n = 0. Sử dụng công thức từ Khối lượng của một quả bóng n trên Wikipedia.

Giải trình

Chúng tôi đang cố gắng để tính π n / 2 / Γ ( n / 2 + 1) · R n , hoặc N[Pi^(n/2)/Gamma[n/2 + 1] R^n]trong Mathematica. Trong trường hợp của chúng ta,# (số đầu tiên) là n#2(số thứ hai) là R . Điều này để lại cho chúng tôi N[Pi^(#/2)/Gamma[#/2 + 1] #2^#] &, có thể được chơi golf như sau:

N[Pi^(#/2)/Gamma[#/2 + 1] #2^#] &
Pi^(.5#)/Gamma[.5# + 1] #2^# &    (* replace exact with approximate numbers*)
Pi^(.5#)/(.5#)! #2^# &            (* n! == Gamma[n + 1] *)
Pi^(a=.5#)/a! #2^# &              (* replace repeated .5# *)
Pi^(a=.5#)/a!#2^#&                (* remove whitespace *)

và do đó, chương trình ban đầu của chúng tôi.


Câu trả lời hay - thật nhanh! Chỉ cần làm rõ: Để có bao nhiêu chữ số là đầu ra chính xác? Có thể tính được bao nhiêu kích thước?
RudolfJelin

@ RudolfL.Jelínek Nó xuất ra khoảng 5 con số quan trọng và nó hoạt động với tất cả n lên tới 168,146,894,169,516 cho r = 1 (mặc dù có ít số liệu hơn).
LegionMammal978

@ LegionMammal978 công thức nào? Tôi khá chắc chắn rằng bạn không sử dụng chức năng gamma ở đó
Angs

@Ang n ! = Γ  (  n + 1).
LegionMammal978

2
Oh, !làm việc cho không tích hợp quá. Sử dụng Mathematica cho việc này gần như cảm thấy như lừa dối :)
Angs

6

JavaScript (ES6), 45 byte + swag thêm

Công thức đệ quy từ wikipedia , nên hoạt động với mọi số chiều

f=(n,r)=>n<2?n?2*r:1:f(n-2,r)*2*Math.PI*r*r/n

6

R, 75 40 38 byte (cộng thêm swag)

Chà, có vẻ như tôi có thể đánh golf nó xuống bằng cách cho vào và sử dụng chức năng gamma thay vì các hàm đệ quy.

function(n,r)pi^(n/2)/gamma(n/2+1)*r^n

Xác định một hàm ẩn danh để tính toán khối lượng của một nsiêu mặt phẳng bán kính r.

Vài ví dụ:

1 1 -> 2

0 48 -> 1

2 3 -> 28.27433

3 4,5 -> 381,7035

7 7 -> 3891048

100 3 -> 122051813

Giải pháp Swagless, 38 34 byte

Đối với một vài byte ít hơn, bạn có thể có một chức năng vô danh mà chỉ hoạt động cho kích thước từ 1 tới 3. Returns numeric(0)cho n=0, và NAcho n>3. ( numeric(0)là một vectơ số có độ dài 0; NAdành cho "không khả dụng".) Hiệu suất khác với giải pháp chung ở trên.

function(n,r)c(1,pi,4/3*pi)[n]*r^n

1
Cho SSSSSWWWWWAAAAAAAGGGGGGGGGGG!
RudolfJelin

5

Haskell, 74 65 36 byte + swag thêm

0%r=1
1%r=2*r
n%r=2*pi*r^2/n*(n-2)%r

Công thức đệ quy, hoạt động cho tất cả các kích thước có thể được trình bày chính xác dưới dạng số dấu phẩy động chính xác kép nhưng sẽ lặp vô hạn cho các kích thước không tách rời. Phiên bản cũ vì lợi ích của hậu thế:

n%r=(max 1$1-(-1)**n)*(2*pi)^(floor$n/2)*r**n/product[n,n-2..1.1]

Hoạt động cho tất cả các kích thước. Sử dụng công thức từ bản tuyên ngôn tau . product[n,n-2..1.1]là một hack nhân đôi không được tính không chon==2


5

JavaScript, 61 51 49 43 byte

Kích thước 0-3 được hỗ trợ vì không có kích thước thứ 4 .

Cảm ơn @Hedi đã lưu 7 byte

d=(n,r)=>r**n*(n<2?n+1:Math.PI*(n<3?1:4/3))

Tạo chức năng d. Sau đó, đặt ra rcho các nthứ quyền lực và sau đó nhân lên nó với một số tùy thuộc vào nsử dụng ternary nhà khai thác. Đầu ra 1chon=0

Cung cấp đầu ra cho ít nhất 2 vị trí thập phân (10+ dp)

Đây là một đoạn ăn nhẹ!

var N = document.getElementById("n");
var R = document.getElementById("r");
N.value="3";//default
R.value="4.5";//default
d=(n,r)=>r**n*(n<2?n+1:Math.PI*(n<3?1:4/3));
var b = document.getElementById("b");
b.onclick = function() {
  var s = document.getElementById("s");
  var n = document.getElementById("n").value;
  var r = document.getElementById("r").value;
  s.textContent = d(parseFloat(n),parseFloat(r));
}
span {border:1px solid black;padding:10px;font-size:30px;}
Value of n: <input id="n" type="number"></input>
Value of r: <input id="r" type="number"></input><br>
<button id="b">Calculate!</button><br><br><br>
<span id="s">THERE IS NO 4TH DIMENSION</span>


Đánh bại giải pháp không đăng của tôi bằng ... rất nhiều. +1!
RudolfJelin

6
thật là một video ngu ngốc
Sange Borsch

1
@SargeBorsch Ít nhất nó cũng chứng minh quan điểm của tôi :)
Kritixi Lithos

2
@SargeBorsch Haha video ngu ngốc yup - 0:40 3 dimensions that behave in the same way and one that behaves in a different way- Tại thời điểm đó, anh ta dường như đang nói rằng có một chiều thứ 4, nhưng không có thứ 1, thứ 2 hoặc thứ 3!
Cấp sông St

1
@LevelRiverSt Vâng, đó là kết quả đầu tiên tôi có trên web ¯ \ _ (ツ) _ /
Kritixi Lithos

3

MATL , 17 byte

3:^[2P4*P/3]*1hi)

Điều này chỉ hoạt động tối đa 3 chiều. Các đầu vào theo thứ tự ngược lại, đó là : r, sau đón .

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

Hãy xem xét r=3, n=2như một ví dụ.

3:         % Push array [1 2 3]
           % STACK: [1 2 3]
^          % Take r implicitly, and raise it to [1 2 3] element-wise
           % STACK: [3 9 27]
[2P4*P/3]  % Push array [2 pi 4*pi/3]
           % STACK: [3 9 27], [2 pi 4*pi/3]
*          % Multiply element-wise
           % STACK: [6 28.2743 113.0973]
1h         % Append 1
           % STACK: [6 28.2743 113.0973, 1]
i)         % Input n and use it as modular index into the array. Display implicitly
           % STACK: 28.2743

2

Java / C / C ++ / C #, 69 67 byte + swag thêm!

Chỉnh sửa: Đã lưu 2 byte nhờ @AlexRacer

Hàm dyadic - đối số thứ nhất là số thứ nguyên, thứ hai là bán kính của bóng n.

float v(int n,float r){return n<1?1:n<2?2*r:6.283f*r*r*v(n-2,r)/n;}

Công thức đệ quy cho thể tích của một quả bóng n : V n = (2πr 2 V n-2 ) / n

Ái chà! Java (ngôn ngữ thử nghiệm của tôi) đánh bại Scala ở đây, nhờ ?:cú pháp tạm thời ngắn gọn ! Hàm này đúng về mặt cú pháp trong cả 4 ngôn ngữ trong tiêu đề và tôi đã thử nghiệm nó với C (MinGW GCC 5.4.0), & C # (VS Ultimate 2016, C # 6.0). Tôi giả sử rằng nó cũng sẽ hoạt động trong C ++. Vì hàm này độc lập với thư viện khá nhiều, nên nó hoạt động trong mọi ngôn ngữ giống như C với cú pháp tương tự.


Ồ Tôi nghĩ rằng tôi sẽ không bao giờ nhận được câu trả lời Java! Hiểu rồi - cảm ơn! Và, như một phần thưởng, nó đánh bại một số câu trả lời có thêm swag! ₊₁
RudolfJelin

n==0có thể rút ngắn n<1và cũng có n==1thển<2
AlexRacer 6/11/2016

2

Haskell, 52 byte cho tab thụt lề 42 byte + swag thêm

Chỉnh sửa: Đã lưu 10 byte nhờ @WChargin

Hàm curled dyadic - đối số đầu tiên là số thứ nguyên, thứ hai là bán kính của bóng n.

v 0 r=1
v 1 r=2*r
v n r=2*pi*r*r*v(n-2)r/n

Công thức đệ quy cho khối lượng của một n-ball: V n = (2πr 2 V n-2 ) / n

Lưu tệp này dưới dạng tệp tập lệnh riêng biệt và chạy với GHCi, với chức năng kiểm tra v đầu ra, ví dụ : show (v 3 4.5). Tôi đã không kiểm tra điều này, xin vui lòng cho tôi biết nếu điều này không hoạt động.

Chương trình cũ với xấp xỉ 6,2832 cho 2π được thay thế (50 byte với thụt tab):

let v 0 r=1
    v 1 r=2*r
    v n r=2*pi*r*r*(v(n-2)r)/n

Điều này có thể được sử dụng với GHCi ở chế độ đa dòng (sử dụng :set +mhoặc kèm theo mã giữa :{&:} , các vỏ được đặt trên các dòng riêng của chúng. Yêu cầu chức năng của người kiểm tra.

Gõ tĩnh với suy luận kiểu chương trình đầy đủ xuất hiện ở đây, cho phép Haskell làm tốt hơn Scala và tiếp cận Groovy, nhưng không hoàn toàn đánh bại nó nhờ vào khớp mẫu thay vì một câu ba, liên quan đến sự lặp lại của một số ký tự.


51 nếu sử dụng bố trí trực tiếp, 49 nếu bạn thay thế 2*picho 6.2832, và 47 nếu bạn thả ngoặc xung quanh cuộc gọi đệ quy: let{v 0 r=1;v 1 r=2*r;v n r=2*pi*r*r*v(n-2)r/n}...
wchargin

Chấm điểm nhưng tiêu biểu hơn là gửi một tập lệnh riêng biệt; bỏ let{}và thay thế dấu chấm phẩy của tôi bằng các nguồn cấp dữ liệu để chỉ nhận 42 byte (không có dòng mới).
wchargein

@WChargin Tôi đã học Haskell được 2 ngày, vì vậy cảm ơn bạn đã gợi ý. Tôi đã nhầm lẫn về mặt thận trọng với các dấu ngoặc đơn vì tôi không chắc chắn về quyền ưu tiên của nhà điều hành và chức năng gọi trong Haskell
Tamoghna Chowdhury

2

Vợt 69 byte (cộng thêm swag)

Sử dụng công thức đệ quy từ https://en.wikipedia.org/w/index.php?title=Volume_of_an_n-ball§ion=3#Recacht

Bao gồm các đề xuất của @wchargein

(define(v d r)(match d[0 1][1(* 2 r)][_(/(* 2 pi r r(v(- d 2)r))d)]))

Ungolfed (v = âm lượng, d = kích thước, r = bán kính):

(define(v d r)
  (match d
    [0 1]
    [1 (* 2 r)]
    [_ (/ (*  2   pi   r   r   (v (- d 2) r)  )
          d)]
    ))

Kiểm tra:

(v 1 1)
(v 2 3)
(v 3 1)
(v 3 4.5)
(v 1 9.379)
(v 0 48)

Đầu ra:

2
28.274333882308138
4.1887902047863905
381.7035074111599
18.758
1

Tôi rất nghi ngờ rằng điều này là hợp pháp: bạn đang sử dụng hàm đệ quy mà không tính định nghĩa của nó trong số byte. Đó là, biểu thức mà bạn đang ghi là 67 byte không phải là vợt hợp lệ, như vlà không liên kết (không đề cập đến các tham số khác). Chắc chắn bạn cũng cần phải tính (define(v d r))? Điều này mang lại cho bạn tới 82 byte, một lần nữa
wchargein vào

Nhưng bạn có thể loại bỏ bốn byte từ đó bằng cách thay thế condcác ifbiểu thức lồng nhau , đưa bạn xuống còn 78 byte bằng (define(v d r)(if(= d 0)1(if(= d 1)(* 2 r)(*(/(* 2 pi(* r r))d)(v(- d 2)r))))).
wchargein

Càng và cạo ba cái nữa bằng cách dùng a matchđể lấy (define(v d r)(match d[0 1][1(* 2 r)][_(*(/(* 2 pi(* r r))d)(v(- d 2)r))])).
wchargein

Cảm ơn những lời đề nghị tuyệt vời. Tôi bao gồm những điều này trong câu trả lời.
rnso

@wchargein: Tôi có thể giảm thêm 9 byte bằng cách định vị lại (v (- d 2) r) trong công thức và chỉ bằng cách sử dụng "r r" thay vì "(* rr)" vì nó đã có trong công thức nhân.
rnso

1

Perl, 63 byte + swag thêm

@a=1..2;push@a,6.283/$_*@a[$_-2]for 2..($b=<>);say$a[$b]*<>**$b

Chấp nhận hai số nguyên n và r, mỗi lần một, sau đó xuất ra thể tích n cho bán kính r cho trước của một hình cầu n. Khi n = 0, V = 1 và khi n = 1, V = 2r. Tất cả các kích thước khác được tính theo công thức sau:

Công thức khối đệ quy

Kể từ khi r n là hệ số bán kính trong mọi công thức, tôi bỏ nó ra khỏi phép tính cơ bản và chỉ áp dụng nó ở cuối.

2π được tính gần đúng trong mã bằng 6.283.


Đẹp và đệ quy, và để hiển thị công thức đệ quy.
RudolfJelin

1

Scala, 53 byte

{import math._;(n,r)=>pow(r,n)*Seq(1,2,Pi,Pi*4/3)(n)}

Xin lỗi, không có thêm swag cho tôi :(

Giải trình:

{                     //define a block, the type of this is the type of the last expression, which is a function
  import math._;        //import everything from math, for pow and pi
  (n,r)=>               //define a function
    pow(r,n)*             //r to the nth power multiplied by
    Seq(1,2,Pi,Pi*4/3)(n) //the nth element of a sequence of 1, 2, Pi and Pi*4/3
}

1

JavaScript (ES6), 39 byte, không có swag

(n,r)=>[1,r+r,a=Math.PI*r*r,a*r*4/3][n]

1

Trăn 3, 76 72 68 byte + swag thêm!

Giải pháp đệ quy có thêm swag!
Trả lại 0chon=0

from math import*
f=lambda n,r:n*r*2*(n<2or pi*r/n/n*(f(n-2,r)or 1))

Cách tiếp cận cũ ( 1cho n=1):

from math import*
f=lambda n,r:1*(n<1)or r*2*(n<2)or 2*pi*r*r/n*f(n-2,r)

Công thức đệ quy từ Wikipedia .

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



1

Scala, 81 79 byte + swag thêm!

Chỉnh sửa: Đã lưu 2 byte nhờ @AlexRacer

Hàm dyadic - đối số thứ nhất là số thứ nguyên, thứ hai là bán kính của bóng n.

def v(n:Int,r:Float):Float=if n<1 1 else if n<2 2*r else 6.2832f*r*r*v(n-2,r)/n

Công thức đệ quy cho khối lượng của một n-ball: V n = (2πr 2 V n-2 ) / n

Scala thiếu suy luận kiểu cho các kiểu trả về của hàm đệ quy và tham số hàm và cú pháp ternary dài dòng gây tổn thương khá nhiều ở đây :(


1

Groovy, 49 47 byte + swag thêm!

Chỉnh sửa: Đã lưu 2 byte nhờ @AlexRacer

Hàm dyadic - đối số thứ nhất là số thứ nguyên, thứ hai là bán kính của bóng n.

def v(n,r){n<1?1:n<2?2*r:6.2832*r*r*v(n-2,r)/n}

Công thức đệ quy cho khối lượng của một n-ball: V n = (2πr 2 V n-2 ) / n

Đánh máy động FTW!

Các câu trả lời Scala và Java của tôi sử dụng cùng một logic, nhưng với kiểu gõ tĩnh nên số byte cao hơn do chú thích kiểu :(. Tuy nhiên, Scala và Groovy cho phép tôi bỏ qua returndấu chấm phẩy và dấu chấm phẩy, để giúp đếm byte, không giống như Java / C ...


Cho SWAG thêm!
RudolfJelin

1

Tiếng Litva , 96 ký tự + thêm swag

Dòng chia làm 2 để dễ đọc:

#N,R::((if (< N 2) ((? (!= 0 N) (* 2 R) 1)) ((/ (* (* (* (* (f (- N 2) R) 2)
        3.1416) R) R) N))))

Suy nghĩ tôi cần nâng cấp trình phân tích cú pháp của mình để yêu cầu ít không gian hơn. Kích thước mã sẽ được cắt giảm độc đáo, đặc biệt là trong đó((/ (* (* (* (* phần .

Sử dụng:

% n-circle.lithp
(
    (def f #N,R::((if (< N 2) ((? (!= 0 N) (* 2 R) 1)) ((/ (* (* (* (* (f (- N 2) R) 2) 3.1416) R) R) N)))))
    (print (f 1 1))
    (print (f 2 3))
    (print (f 3 1))
    (print (f 3 4.5))
    (print (f 1 9.379))
    (print (f 0 48))
)

#./run.js n-circle.lithp
2
28.274333882308138
4.1887902047863905
381.7035074111598
18.758
1

Cảm ơn Rudolf vì đã cạo một vài byte.


1
Điều gì về việc rút ngắn " 3.141592653589793" thành " 3.1416", tiết kiệm 11 byte và vẫn phù hợp với các quy tắc?
RudolfJelin

1

CJam (27 byte có thêm tín dụng)

{1$_[2dP]*<f*\,:)-2%./1+:*}

Bộ kiểm tra trực tuyến . Đây là một khối ẩn danh (hàm) có các đối sốd r trên ngăn xếp và để lại kết quả trên ngăn xếp.

Mổ xẻ

Công thức n chiều chung có thể được viết lại thành

2d2πd2rdd!!
{            e# Begin block: stack holds d r
  1$_[2dP]*< e#   Build a list which repeats [2 pi] d times and take the first d elements
  f*         e#   Multiply each element of the list by r
  \,:)-2%    e#   Build a list [1 ... d] and take every other element starting at the end
  ./         e#   Pointwise divide. The d/2 elements of the longer list are untouched
  1+:*       e#   Add 1 to ensure the list is non-empty and multiply its elements
}
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.