Tulis program yang menggunakan dua angka sebagai inputnya. Yang pertama adalah jumlah dimensi - 0 untuk titik, 1 untuk garis lurus, 2 untuk lingkaran, 3 untuk bola. Angka kedua adalah jari-jari objek, atau, jika itu 1-dimensi, bilangan itu sendiri. Output 0 untuk 0 dimensi. Outputnya adalah panjang / area / volume objek.
Jika kita memanggil nomor pertama n
, yang kedua r
, dan hasilnya x
, kita dapat:
untuk n = 0, x = 1
untuk n = 1, x = 2 × r
untuk n = 2, x = r 2 × π
untuk n = 3, x = ( 4 / 3 ) × r 3 × π
dan seterusnya ... jika Anda mau.
Catatan:
Kasus-kasus ketika satu atau kedua angka negatif, atau ketika angka pertama tidak utuh, tidak perlu ditutupi.
Program tidak boleh membaca dari file apa pun dan satu-satunya input adalah dua angka itu.
Output harus menggunakan hanya angka (mis. Bukan "14 * pi"), dan harus akurat setidaknya dua digit desimal.
Sedangkan untuk n = 0, Anda dapat menampilkan 0 jika membuat kode lebih pendek.
Sombong ekstra untuk jawaban yang mencakup "bola" 4 dimensi dan lebih banyak lagi!
Ini kode-golf , jadi jawaban tersingkat dalam byte menang!
Contoh:
1 1 -> 2
2 3 -> 28,27
3 1 -> 4,19
3 4,5 -> 381,70
1 9.379 -> 18.758
0 48 -> 1
== r
adalah bola, himpunan poin dengan jarak dari asal<= r
adalah bola. Maka ini adalah 0-bola = titik, 1-bola = segmen, 2-bola = disk, 3-bola = bola, 4-bola, 5-bola, dan lain-lain. (terdaftar sebagai "n
-ball = nama umum").Jawaban:
Jelly , 13 byte + tambahan barang curian
Cobalah online!
Berfungsi untuk dimensi apa pun, asalkan nilai tetap π yang dihasilkan oleh
ØP
(3.141592653589793
) cukup akurat.Bagaimana?
sumber
Mathematica, 18 byte, hingga ~ 168,15 triliun dimensi
Fungsi anonim. Mengambil dua angka sebagai input, dan mengembalikan nomor yang tidak eksak sebagai output. Bekerja dengan sejumlah dimensi. Output
1.
untuk n = 0. Menggunakan rumus dari Volume n-ball di Wikipedia.Penjelasan
Kami berusaha menghitung π n / 2 / Γ ( n / 2 + 1) · R n , atau
N[Pi^(n/2)/Gamma[n/2 + 1] R^n]
dalam Mathematica. Dalam kasus kami,#
(argumen pertama) adalah n dan#2
(argumen kedua) adalah R . Ini yang membuat kitaN[Pi^(#/2)/Gamma[#/2 + 1] #2^#] &
, yang bisa bermain golf sebagai berikut:dan dengan demikian, program asli kami.
sumber
!
berfungsi juga untuk non-integral. Menggunakan Mathematica untuk ini hampir terasa seperti selingkuh ... :)JavaScript (ES6), 45 byte + curian ekstra
Formula rekursif dari wikipedia , harus bekerja untuk sejumlah dimensi
sumber
R,
754038 byte (plus swag ekstra)Yah, sepertinya saya bisa bermain golf ini dengan menyerah dan menggunakan fungsi gamma daripada fungsi rekursif.
Menentukan fungsi anonim untuk menghitung volume suatu
n
jari-jari dimensi - dimensir
.Beberapa contoh:
Solusi Swagless,
3834 byteUntuk beberapa byte lebih sedikit, Anda dapat memiliki fungsi anonim yang hanya berfungsi untuk dimensi 1 hingga 3. Pengembalian
numeric(0)
untukn=0
, danNA
untukn>3
. (numeric(0)
adalah vektor numerik dengan panjang 0;NA
adalah untuk "tidak tersedia".) Kinerja dinyatakan identik dengan solusi umum di atas.sumber
Haskell,
746536 byte + barang curian ekstraFormula rekursif, bekerja untuk semua dimensi yang dapat disajikan dengan tepat sebagai angka floating point presisi ganda tetapi akan berulang tanpa batas untuk dimensi non-integral. Versi lama demi kepentingan posterioritas:
Berfungsi untuk semua dimensi. Menggunakan formula dari manifesto tau .product[n,n-2..1.1]
adalah hack faktorial ganda yang tidak akan dihitung noln==2
sumber
JavaScript,
61514943 byteDimensi 0-3 didukung karena tidak ada dimensi ke-4 .
Terima kasih kepada @Hedi untuk menghemat 7 byte
Menciptakan fungsi
d
. Kemudian naikkanr
ken
daya th dan kemudian gandakan dengan angka tergantung padan
penggunaan operator ternary. Output1
untukn=0
Memberikan output ke setidaknya 2 tempat desimal (10+ dp)
Ini cuplikan makanan ringan!
sumber
3 dimensions that behave in the same way and one that behaves in a different way
- Pada saat itu dia tampaknya mengatakan ada dimensi ke-4, tetapi tidak ada 1, 2 atau 3!MATL , 17 byte
Ini berfungsi hingga 3 dimensi saja. Input dalam urutan terbalik, yaitu:,
r
lalun
.Cobalah online!
Pertimbangkan
r=3
,n=2
sebagai contoh.sumber
Java / C / C ++ / C #,
6967 byte + barang curian ekstra!Sunting: Disimpan 2 byte berkat @AlexRacer
Fungsi diadik - argumen pertama adalah jumlah dimensi, kedua adalah jari-jari n-ball.
float v(int n,float r){return n<1?1:n<2?2*r:6.283f*r*r*v(n-2,r)/n;}
Rumus rekursif untuk volume bola-n: V n = (2πr 2 V n-2 ) ⁄ n
Wah! Java (bahasa pengujian saya) mengalahkan Scala di sini, berkat
?:
sintaks ternary yang singkat ! Fungsi ini secara sintaksis benar dalam semua 4 bahasa dalam tajuk, dan saya telah mengujinya dengan C (MinGW GCC 5.4.0), & C # (VS Ultimate 2016, C # 6.0). Saya berasumsi bahwa itu akan bekerja di C ++ juga, jadi di sana. Karena fungsi ini cukup banyak perpustakaan-independen, itu harus berfungsi dalam bahasa C-like dengan sintaksis yang sama.sumber
n==0
dapat disingkat menjadin<1
dan jugan==1
ken<2
Haskell,
52 byte untuk tab indentasi42 byte + swag ekstraSunting: Disimpan 10 byte berkat @WChargin
Fungsi kari diad - argumen pertama adalah jumlah dimensi, kedua adalah jari-jari bola-n.
Rumus rekursif untuk volume bola-n: V n = (2πr 2 V n-2 ) ⁄ n
Simpan ini sebagai file skrip terpisah dan jalankan dengan GHCi, dengan fungsi untuk menguji
v
output, misalnya,show (v 3 4.5)
,. Saya tidak menguji ini, tolong beri tahu saya jika ini tidak berhasil.Program lama dengan perkiraan 6.2832 untuk 2π diganti (50 byte dengan indentasi tab):
Ini dapat digunakan dengan GHCi dalam mode multiline (menggunakan
:set +m
atau melampirkan kode antara:{
&:}
, enklosur berada di jalurnya sendiri. Fungsi tester diperlukan.Pengetikan statis dengan inferensi tipe program lengkap mulai berlaku di sini, memungkinkan Haskell untuk melakukan jauh lebih baik daripada Scala, dan mendekati Groovy, tetapi tidak cukup mengalahkannya berkat kecocokan pola dan bukan ternary, yang melibatkan beberapa pengulangan karakter.
sumber
2*pi
untuk6.2832
, dan 47 jika Anda menjatuhkan kurung di sekitar panggilan rekursif:let{v 0 r=1;v 1 r=2*r;v n r=2*pi*r*r*v(n-2)r/n}
...let{}
dan ganti titik koma saya dengan linefeeds untuk mendapatkan hanya 42 byte (tanpa tertinggal baris baru).Racket 69 byte (ditambah barang curian ekstra)
Menggunakan rumus rekursif dari https://en.wikipedia.org/w/index.php?title=Volume_of_an_n-ball§ion=3#Recursions
Termasuk saran oleh @wchargin
Tidak digabungkan (v = volume, d = dimensi, r = jari-jari):
Pengujian:
Keluaran:
sumber
v
tidak terikat (belum lagi parameter lainnya). Tentunya Anda perlu menghitung(define(v d r))
juga? Ini membawa Anda hingga 82 byte ...cond
denganif
ekspresi bersarang , membawa Anda ke 78 byte dengan(define(v d r)(if(= d 0)1(if(= d 1)(* 2 r)(*(/(* 2 pi(* r r))d)(v(- d 2)r)))))
.match
untuk mendapatkan(define(v d r)(match d[0 1][1(* 2 r)][_(*(/(* 2 pi(* r r))d)(v(- d 2)r))]))
.Perl, 63 byte + tambahan barang curian
Menerima dua bilangan bulat n dan r, satu per satu, lalu mengeluarkan volume-n untuk jari-jari r dari bola-n yang diberikan. Ketika n = 0, V = 1, dan ketika n = 1, V = 2r. Semua dimensi selanjutnya dihitung dengan rumus berikut:
Sejak r n adalah faktor jari-jari dalam setiap rumus, saya meninggalkannya dari perhitungan dasar dan hanya menerapkannya di akhir.
2π diperkirakan dalam kode dengan 6.283.
sumber
Scala, 53 byte
Maaf, tidak ada barang curian tambahan untuk saya :(
Penjelasan:
sumber
JavaScript (ES6), 39 byte, tidak ada barang curian
sumber
Python 3,
767268 byte + barang curian ekstra!Solusi rekursif dengan barang curian ekstra!
Pengembalian
0
untukn=0
Pendekatan lama (
1
untukn=1
):Formula rekursif dari Wikipedia .
Cobalah online.
sumber
Python 3, 56 byte + barang curian ekstra!
Mudah dengan barang curian ekstra!
Formula standar.
Cobalah online
sumber
Scala,
8179 byte + barang curian ekstra!Sunting: Disimpan 2 byte berkat @AlexRacer
Fungsi diadik - argumen pertama adalah jumlah dimensi, kedua adalah jari-jari n-ball.
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
Rumus rekursif untuk volume bola-n: V n = (2πr 2 V n-2 ) ⁄ n
Kurangnya inferensi tipe Scala untuk tipe kembali fungsi rekursif dan parameter fungsi dan sintaks ternary verbose agak menyakitkan di sini :(
sumber
Groovy,
4947 byte + barang curian ekstra!Sunting: Disimpan 2 byte berkat @AlexRacer
Fungsi diadik - argumen pertama adalah jumlah dimensi, kedua adalah jari-jari n-ball.
def v(n,r){n<1?1:n<2?2*r:6.2832*r*r*v(n-2,r)/n}
Rumus rekursif untuk volume bola-n: V n = (2πr 2 V n-2 ) ⁄ n
Mengetik Dinamis FTW!
Scala dan Java saya menjawab menggunakan logika yang sama, tetapi dengan pengetikan statis jumlah byte yang lebih tinggi karena mengetik anotasi :(. Namun, Scala dan Groovy memungkinkan saya untuk menghilangkan
return
dan titik koma, sehingga membantu jumlah byte, tidak seperti Java / C ...sumber
Lithp , 96 karakter + barang curian ekstra
Garis terbagi 2 untuk dibaca:
Berpikir saya perlu memutakhirkan parser saya untuk membutuhkan lebih sedikit ruang Ukuran kode akan dikurangi dengan baik, terutama di
((/ (* (* (* (*
bagian itu.Pemakaian:
Terima kasih kepada Rudolf karena telah memangkas beberapa byte.
sumber
3.141592653589793
" menjadi "3.1416
", menghemat 11 byte dan masih sesuai dengan aturan?CJam (27 byte dengan kredit ekstra)
Test suite online . Ini adalah blok anonim (fungsi) yang mengambil argumen
d r
di stack dan meninggalkan hasilnya di stack.Pembedahan
Rumus n-dimensi umum dapat ditulis ulang sebagai
sumber