Ya, berapa banyak , bukan berapa ...
Seperti kita ketahui, hadiah besar jauh lebih baik daripada hadiah kecil. Oleh karena itu, nilai hadiah harus selalu diukur dalam volume total, bukan jumlah hadiah, berat, atau bahkan harga gabungan.
Karena disukai untuk membandingkan jumlah hadiah yang didapat, Anda tidak ingin skrip panjang yang mudah dilihat dan dibaca oleh orang lain di pesta Natal. Karena itu, Anda harus menjaga jumlah byte dalam skrip Anda minimal.
Tugas Anda sederhana: Buat program yang mengambil daftar dimensi sebagai input, pada format apa pun yang sesuai, dan output volume gabungan dari hadiah Anda. Dimensi dari masing-masing hadiah adalah sekumpulan tiga angka, atau satu angka. Jika inputnya tiga angka ( L, W, H
), present adalah berbentuk kubus dimensi L x W x H
. Jika ini adalah angka tunggal ( R
), sekarang adalah bidang jari-jari R
.
Aturan:
- Ini bisa berupa program lengkap atau fungsi
- Input dapat dalam format apa pun yang nyaman
- Jika diinginkan, bola dapat diwakili oleh angka yang diikuti oleh dua nol
- Kuboid akan selalu memiliki semua dimensi non-nol.
- Outputnya harus berupa angka desimal tunggal
- Output tambahan diterima selama jelas jawabannya
- Output harus memiliki setidaknya dua digit setelah titik desimal
- Outputnya bisa dalam bentuk standar / notasi ilmiah jika jumlahnya lebih besar dari 1000.
- Jika bahasa Anda tidak memiliki konstanta-Pi, jawabannya harus akurat hingga 9999,99.
Contoh:
((1,4,3),(2,2,2),(3),(4,4,4))
197.0973 // (1*4*3 + 2*2*2 + 4/3*pi*3^3 + 4*4*4)
(5)
523.5988
(5,0,0)
523.5988
Papan peringkat
Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
## Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
## Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=67027,OVERRIDE_USER=44713;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
(5)
hanya sebagian contoh dan kode kita hanya harus menangani((5))
.Jawaban:
Jelly ,
1918 byteCobalah online!
Sayangnya, Jelly belum memiliki konstanta π , dan vectorizer tidak menangani floats dengan benar.
Untuk mengatasi masalah ini, alih-alih mengalikannya dengan 4π / 3 , kami mengalikannya dengan 1420 dan membaginya dengan 339 . Karena 1420 ÷ 339 = 4.18879056 ... dan 4π / 3 = 4.18879020 ... , ini cukup tepat untuk mematuhi aturan.
Versi terbaru Jelly dapat menyelesaikan tugas ini dalam 14 byte , dengan presisi yang lebih baik.
Cobalah online!
Bagaimana itu bekerja
Versi yang tidak bersaing menggunakan
×240°
alih-alih×1420÷339
, yang dikalikan 240 dan mengubah produk menjadi radian.sumber
Haskell, 40 byte
Contoh penggunaan:
sum.map q $ [[1,4,3],[2,2,2],[3],[4,4,4]]
->197.09733552923254
.Cara kerjanya: Untuk setiap elemen dari daftar input: jika memiliki elemen tunggal,
x
hitung volume bola, ambil yang lainproduct
. Jumlahkan.sumber
p=sum.map q
(dan kemudian diberitahu untuk menggunakanp
daftar nomor)sum.map q
adalah fungsi yang tidak disebutkan namanya yang tergantungq
, jadi saya kira itu baik-baik saja.Pyth,
1918 byteTerima kasih 1 byte untuk Dennis
Demonstrasi
Format input adalah daftar daftar:
Ini hanya mengalikan dimensi bersama-sama untuk menghitung volume kubus. Jika itu keluar ke nol, itu menghitung volume bola.
Konstanta bola,
4/3*pi
dihitung sebagai 240 derajat dalam radian..t ... 7
mengkonversi input dalam derajat ke radian, danC\ð
menghitung titik kodeð
, yaitu 240.sumber
Python 2,
8670 bytesumber
3.14159265358979323
titik impasMathematica, 34 byte
Fungsi tanpa nama yang mengambil daftar panjang bersarang dan mengembalikan volume sebagai bilangan real.
Kami pertama-tama mengganti nilai tunggal dengan volume bola yang sesuai dengan
/.{r_}:>{4r^3/3Pi}
. Lalu, kita gandakan konten dari setiap daftar1.##&@@@
. Akhirnya kita menghitung penjumlahan sebagai jejak vektorTr[...]
.sumber
JavaScript (ES6), 56
Versi yang lebih masuk akal
.reduce
adalah 1 byte lebih lamasumber
4.11879
menggantikan4/3*Math.PI
, karena itu harus cukup akurat untuk memenuhi syarat.In case your language doesn't have a Pi-constant,
dan bahasa saya memiliki konstanta PI, jadi saya tidak tahu apakah itu memenuhi syaratPython, 49 byte
Menggunakan representasi bola sebagai
(a,0,0)
. Diperlakukan sebagai berbentuk kubus, ini memiliki volume 0, dalam hal ini volume bola digunakan sebagai gantinya. Saya tidak jelas tentang seberapa akurat konstanta perlu, jadi saya harap ini cukup.sumber
MATL , 20 byte
Format input adalah matriks di mana setiap baris menggambarkan kubus atau bola. Sebuah bola didefinisikan oleh hanya angka pertama di baris itu; dua angka lainnya adalah nol. Jadi contoh pertama dari tantangan adalah:
Ini menggunakan rilis bahasa saat ini, 2.0.2 , yang lebih awal dari tantangan ini.
Contoh:
Penjelasan:
sumber
Prolog,
115100 byteKode:
Dijelaskan:
Contoh:
Cobalah online di sini
Sunting: disimpan 15 byte dengan mendefinisikan predikat diad.
sumber
Perl,
5247 byte46 +1 untuk
-p
(itu sudah biasa; beri tahu saya jika berbeda di sini dan saya akan memperbarui)Penggunaan: dimasukkan ke dalam file dan
echo 1,4,3 2,2,2 3 4,4,4 | perl -p x.pl
Dengan komentar:
perbarui 47 Terima kasih kepada @Dennis karena telah menghemat beberapa byte menggunakan trik ini .
sumber
s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g;}{
menghemat beberapa byte.$_
biaya sebanyak. Masih belum jelas mengapa$_
direset di blok baru, .. Apakah$_
blok-lokal diwhile(<>){}
?$_
adalah variabel default dari cakupan saat ini. Di blok END, itu tidak terdefinisi.CJam,
2421 byteUji di sini.
Penjelasan
sumber
PowerShell, 67 Bytes
Beberapa ilmu hitam terjadi di sini. Saya akan mencoba menjalaninya dengan lancar.
Kami pertama-tama mengambil input kami, diharapkan sebagai array yang dibatasi koma misalnya
(1,4,3) (2,2,2) (3) (4,4,4)
, dan menyalurkannya ke dalam satu lingkaran|%{}
.Di dalam loop, pertama-tama kita memeriksa apakah
$_
, array tertentu yang kita pertimbangkan, hanya memiliki satu item dan menggunakannya untuk mengindeks ke dalam array (pada dasarnya konstruksi lebih pendek jika / yang lain). Jika lebih dari satu item, misalkan saja(1,4,3)
sebagai input, kami mengeksekusi babak pertama, yang hanya untuk meludahkan array via$_
, seperti(1,4,3)
. Jika tidak, kami membuat array dinamis baru yang terdiri dari elemen tiga kali dengan(,$_*3)
dan memakukan pada perkiraan 4 / 3rd * Pi. Untuk input(3)
, ini akan menghasilkan(3,3,3,4.18879)
output.Ya, PowerShell memiliki konstanta Pi, diakses melalui panggilan NET.
[math]::PI
, Tapi itu lebih lama dan saya tidak ingin menggunakannya. : pApapun, kami menggabungkan array output dengan tanda bintang via
-join'*'
, jadi"1*4*3"
. Setelah kita sepenuhnya melalui loop, kita sekarang memiliki koleksi string. Kita-join'+'
semua bersama-sama untuk penambahan kita, daniex
ekspresi untuk menghitung hasilnya.Fiuh.
sumber
Ruby, 58 karakter
Contoh dijalankan:
Ruby, 50 karakter
Ide perbaikan tanpa malu-malu dicuri dari edc65 's jawaban JavaScript .
Contoh dijalankan:
sumber
Japt,
2722 byteMengambil input sebagai array yang dipisahkan ruang. Cobalah online!
Bagaimana itu bekerja
sumber
R , 70 byte
Cobalah online!
sumber
Pip , 23 byte
Ada beberapa cara untuk memberi masukan ke program ini. Ini dapat mengambil setiap hadiah sebagai argumen baris perintah dari tiga angka yang dipisahkan oleh spasi (yang perlu dibungkus dengan tanda kutip:)
pip.py present.pip "1 4 3" "3 0 0"
. Secara bergantian, tentukan-r
bendera dan berikan setiap hadiah sebagai garis stdin yang terdiri dari tiga angka yang dipisahkan spasi. Cobalah online!Bagaimana?
sumber
Perl 5, 142 byte
Jalankan dengan
-p
di baris perintah, dan ketik angka yang dibatasi dengan koma, seperti:5,0,0
atau(5,0,0)
akan menghasilkan
523.598820058997
Tidak ada
pi
kata kunci di Perl. Ini, dalam banyak kasus, akurat untuk angka signifikan yang ditentukan, namun bahkan jika saya mengetikkan semua angka pi yang saya tahu, itu tidak akan sangat akurat untuk beberapa perhitungan. Jadi saya meninggalkannya3.1415
. Saya tidak yakin apakah ini dapat diterima atau tidak.Kode:
Diedit untuk presisi yang lebih besar atas saran Dennis, yang lebih baik dalam matematika dasar daripada saya, dan dari saran oleh MichaelT untuk menghemat byte sementara tetap tepat.
sumber
1511
? 2. 3.1415 tidak dibulatkan dengan benar atau tidak cukup tepat. Jika perhitungan saya benar, kesalahan tidak boleh lebih besar dari 0,0000017 . 3.(4/3)*3.1415
dapat diganti dengan float tunggal.1420/339
akan memberi Anda beberapa byte kembali dengan perkiraan yang masuk akal. (ini 4/3 * 355/113). Perbedaan antara fraksi dan nilai yang Anda miliki adalah -8.49130615e-8Lua,
115104 byteSolusi sederhana, saya harus membungkus operasi pseudo-ternary
<condition> and <non-false> or <value if false>
dalam tanda kurung lain b akan menjumlahkan dengan kedua bidang.Input harus dalam bentuk
array={{1,4,3},{2,2,2},{3},{4,4,4}}
dan hasilnya dapat dilihat dengan mengeksekusiprint(f(array))
.sumber
05AB1E ,
1816 byteCobalah online.
Penjelasan:
sumber
R,
3836 byteMenggunakan argumen default untuk beralih di antara kasus: dengan tiga argumen menghitung produk, dan dengan satu argumen menghitung rumus bola.
sumber
f<-
dan{}
?(5,0,0)
. Juga, itu tidak mengakomodasi test case di mana ada beberapa hadiah dan volume perlu dijumlahkan bersama.sum
(dan menghapus beberapa hal yang tidak perlu sesuai saran Giuseppe)