Berapa banyak hadiah yang Anda dapatkan untuk Natal?


32

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 Nukuran 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


3
Tidak ada wanita mendapat topi di salah satu kotak silinder lucu itu ?
manatwork

2
@manatwork, tidak, semua wanita akan mendapatkan topi bowler, dan Anda dapat dengan mudah memasangnya di bola = P
Stewie Griffin

1
Saya berasumsi (5)hanya sebagian contoh dan kode kita hanya harus menangani ((5)).
manatwork

2
Jika bahasa pilihan kami tidak memiliki konstanta Pi, berapa banyak presisi yang diperlukan?
Dennis

1
@manatwork, + dan * tidak masalah selama itu tidak berarti penambahan dan perkalian (atau operasi lainnya) dalam bahasa yang Anda gunakan.
Stewie Griffin

Jawaban:


10

Jelly , 19 18 byte

Zµ*3×1420÷339Ḣo@PS

Cobalah 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.

Zµ*3×240°Ḣo@PS

Cobalah online!

Bagaimana itu bekerja

Zµ*3×1420÷339Ḣo@PS  Left argument: A, e.g., [[1, 2, 3], [4, 0, 0]]

Z                   Zip A; turn A into [[1, 4], [2, 0], [3, 0]].
 µ                  Begin a new, monadic chain with zip(A) as left argument.
  *3                Cube all involved numbers.
    ×1420           Multiply all involved numbers by 1420.
         ÷339       Divide all involved numbers by 339.
                    This calculates [[4.19, 268.08], [33.51, 0], [113.10, 0]]
             Ḣ      Head; retrieve the first array.
                    This yields [4.19, 268.08].
                P   Take the product across the columns of zip(A).
                    This yields [6, 0].
              o@    Apply logical OR with swapped argument order to the results.
                    This replaces zeroes in the product with the corresponding
                    results from the left, yielding [6, 268.08].
                 S  Compute the sum of the resulting numbers.

Versi yang tidak bersaing menggunakan ×240°alih-alih ×1420÷339, yang dikalikan 240 dan mengubah produk menjadi radian.


9

Haskell, 40 byte

q[x]=4/3*pi*x^^3
q x=product x
sum.map q

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, xhitung volume bola, ambil yang lain product. Jumlahkan.


1
Apakah cara menghitung byte ini secara umum valid? Saya akan mengatakan p=sum.map q(dan kemudian diberitahu untuk menggunakan pdaftar nomor)
Leif Willerts

1
@LeifWillerts: Ada topik terkini tentang meta yang memungkinkan fungsi tanpa nama yang menyampaikan definisi global. sum.map qadalah fungsi yang tidak disebutkan namanya yang tergantung q, jadi saya kira itu baik-baik saja.
nimi

9

Pyth, 19 18 byte

sm|*Fd*.tC\ð7^hd3Q

Terima kasih 1 byte untuk Dennis

Demonstrasi

Format input adalah daftar daftar:

[[1,4,3],[2,2,2],[3,0,0],[4,4,4]]

Ini hanya mengalikan dimensi bersama-sama untuk menghitung volume kubus. Jika itu keluar ke nol, itu menghitung volume bola.

Konstanta bola, 4/3*pidihitung sebagai 240 derajat dalam radian. .t ... 7mengkonversi input dalam derajat ke radian, dan C\ðmenghitung titik kode ð, yaitu 240.


7

Python 2, 86 70 byte

lambda i:sum(x[0]*x[1]*x[2]if len(x)>1 else x[0]**3*4.18879for x in i)

Saya mendapatkan hitungan byte Anda sebagai 86, bagaimana Anda mendapatkan Anda byte ?
wnnmaw

Selain itu, Anda dapat menyimpan byte dengan hanya memasukkan nilai pi secara manual, Anda dapat menggunakan hingga 3.14159265358979323titik impas
wnnmaw

@wnnmaw Saya lupa menghitung impor -.-
TFeld

Saya percaya nilai hardcoded Anda untuk pi sedikit off :)
wnnmaw

4
@wnnmaw Itu bukan Pi; ini 4Pi / 3.
Dennis

5

Mathematica, 34 byte

Tr[1.##&@@@(#/.{r_}:>{4r^3/3Pi})]&

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 daftar 1.##&@@@. Akhirnya kita menghitung penjumlahan sebagai jejak vektor Tr[...].


5

JavaScript (ES6), 56

l=>l.map(([x,y,z])=>t+=y?x*y*z:x*x*x*4/3*Math.PI,t=0)&&t

Versi yang lebih masuk akal .reduce adalah 1 byte lebih lama

l=>l.reduce((t,[x,y,z])=>t+(y?x*y*z:x*x*x*4/3*Math.PI),0)

Anda dapat menyimpan beberapa byte dengan menggunakan 4.11879menggantikan 4/3*Math.PI, karena itu harus cukup akurat untuk memenuhi syarat.
ETHproduksi

@ ETHproductions ya, tapi In case your language doesn't have a Pi-constant,dan bahasa saya memiliki konstanta PI, jadi saya tidak tahu apakah itu memenuhi syarat
edc65

5

Python, 49 byte

lambda l:sum(a*b*c or a**3*4.18879for a,b,c in l)

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.


4

MATL , 20 byte

it!ptbw~)3^4*3/XT*hs

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:

[1 4 3; 2 2 2; 3 0 0; 4 4 4]

Ini menggunakan rilis bahasa saat ini, 2.0.2 , yang lebih awal dari tantangan ini.

Contoh:

>> matl it!ptbw~)3^4*3/XT*hs
> [1 4 3; 2 2 2; 3 0 0; 4 4 4]
197.0973355292326

>> matl it!ptbw~)3^4*3/XT*hs
> [5 0 0]
523.5987755982989

Penjelasan:

i             % input matrix
t!            % duplicate and transpose: each object is now a column
p             % product of elements in each column
t             % duplicate                                               
b             % bubble up top-third element in stack                              
w             % swap top two elements in stack                                  
~             % logical 'not'. This gives logical index of speheres                 
)             % reference () indexing. This is a logical-linear index to get sphere radii
3^4*3/XT*     % formula for volume of spehere; element-wise operations
h             % horizontal concatenation                                
s             % sum                

3

Prolog, 115 100 byte

Kode:

[]*0.
[[L,W,H]|T]*V:-W=0,X is 4*pi*L^3/3,T*Y,V is X+Y;X is L*W*H,T*Y,V is X+Y.
p(L):-L*V,write(V).

Dijelaskan:

[]*0.
[[L,W,H]|T]*V:-W=0,                           % When 2nd dimension is 0
                  X is 4*pi*L^3/3,            % Calc volume of sphere
                  T*Y,                        % Recurse over list
                  V is X+Y                    % Sum volumes
                  ;                           % When we have a cube
                  X is L*W*H,                 % Calc cube volume
                  T*Y                         % Recurse over list
                  V is X+Y.                   % Sum volumes
p(L):-L*V,                                    % Get combined volume of list of lists
      write(V).                               % Print volume

Contoh:

p([[1,4,3],[2,2,2],[3,0,0],[4,4,4]]).
197.09733552923257

p([[5,0,0]]).
523.5987755982989

Cobalah online di sini

Sunting: disimpan 15 byte dengan mendefinisikan predikat diad.


3

Perl, 52 47 byte

s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g}{

46 +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:

s/,/*/g                # x,y,z becomes x*y*z
||                     # if that fails,
s@$@**3*1420/339@      # x becomes x**3 * 1420/339
,                      # 
$\+=eval               # evaluate the expression and accumulate
for/\S+/g              # iterate groups of non-whitespace
}{                     # -p adds while(<>){...}continue{print}; resets $_

perbarui 47 Terima kasih kepada @Dennis karena telah menghemat beberapa byte menggunakan trik ini .


s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g;}{menghemat beberapa byte.
Dennis

@Dennis Terima kasih! Saya mencoba dengan $ \ sebelumnya tetapi mengatur ulang $_biaya sebanyak. Masih belum jelas mengapa $_direset di blok baru, .. Apakah $_blok-lokal di while(<>){}?
Kenney

Ya, $_adalah variabel default dari cakupan saat ini. Di blok END, itu tidak terdefinisi.
Dennis

2

CJam, 24 21 byte

q~{3*)4P*3/*+3<:*}%:+

Uji di sini.

Penjelasan

q~       e# Read and evaluate input.
{        e# Map this block over the list of presents...
  3*     e#   Repeat the list of lengths 3 times. This will expand cuboids to 9 elements
         e#   and spheres to three copies of the radius.
  )      e#   Pull off the last element.
  4P*3/* e#   Multiply by 4 pi / 3.
  +      e#   Add it back to the list of lengths.
  3<     e#   Truncate to 3 elements. This is a no-op for spheres, which now have three
         e#   elements [r r 4*pi/3*r] but discards everything we've done to cuboids, such
         e#   that they're reduced to their three side lengths again.
  :*     e#   Multiply the three numbers in the list.
}%
:+       e# Sum all the individual volumes.

2

PowerShell, 67 Bytes

($args|%{($_,((,$_*3)+4.18879))[$_.count-eq1]-join'*'})-join'+'|iex

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. : p

Apapun, 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, dan iexekspresi untuk menghitung hasilnya.

Fiuh.


1

Ruby, 58 karakter

->b{b.reduce(0){|t,s|a,b,c=*s;t+(c ?a*b*c :a**3*4.18879)}}

Contoh dijalankan:

2.1.5 :001 ->b{b.reduce(0){|t,s|a,b,c=*s;t+(c ?a*b*c :a**3*4.18879)}}[[[1,4,3],[2,2,2],[3],[4,4,4]]]
 => 197.09733

Ruby, 50 karakter

Ide perbaikan tanpa malu-malu dicuri dari edc65 's jawaban JavaScript .

->b{t=0;b.map{|a,b,c|t+=c ?a*b*c :a**3*4.18879};t}

Contoh dijalankan:

2.1.5 :001 > ->b{t=0;b.map{|a,b,c|t+=c ?a*b*c :a**3*4.18879};t}[[[1,4,3],[2,2,2],[3],[4,4,4]]]
 => 197.09733

1

Japt, 27 22 byte

N®r*1 ª4/3*M.P*Zg ³} x

Mengambil input sebagai array yang dipisahkan ruang. Cobalah online!

Bagaimana itu bekerja

N®   r*1 ª 4/3*M.P*Zg ³  } x
NmZ{Zr*1 ||4/3*M.P*Zg p3 } x

          // Implicit: N = array of input arrays
NmZ{   }  // Map each item Z in N to:
Zr*1      //  Reduce Z with multiplication.
||4/3*M.P //  If this is falsy, calculate 4/3 times Pi
*Zg p3    //  times the first item in Z to the 3rd power.
x         // Sum the result.
          // Implicit: output last expression


1

Pip , 23 byte

{$*a|4/3*PI*@a**3}MSg^s

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 -rbendera dan berikan setiap hadiah sebagai garis stdin yang terdiri dari tiga angka yang dipisahkan spasi. Cobalah online!

Bagaimana?

                         g is list of cmdline args (or lines of stdin, if using -r flag)
                         s is space, PI is what it says on the tin (implicit)
                    g^s  Split each argument on spaces, so we have a list of lists
{                }MS     Map this function to each sublist and sum the results:
 $*a                      Fold the list on * (i.e. take the product)
    |                     Logical OR: if the above value is zero, use this value instead:
     4/3*PI*              4/3 pi, times
            @a            First element of the list
              **3         Cubed
                         Autoprint the result

0

Perl 5, 142 byte

Jalankan dengan -pdi 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 meninggalkannya 3.1415. Saya tidak yakin apakah ini dapat diterima atau tidak.

Kode:

@a=$_=~/(\d+,*)/g;$_=0;@n = map(split(/\D/),@a);for($i=0;$i<$#n;$i+=3){$x=$n[$i];$n[$i+1]==0?$_+=1420/339*$x**3:$_+=($x*$n[$i+1]*$n[$i+2]);}

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.


2
1. Bagaimana Anda menguraikan 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.1415dapat diganti dengan float tunggal.
Dennis

1. OP mengatakan kita dapat mengasumsikan nol untuk bola (yang sebenarnya adalah contoh input yang saya berikan), 2. Saya tidak tahu perhitungan apa yang Anda gunakan, tapi tentu saja, saya akan meningkatkan presisi, dan 3 Saran yang bagus, saya melewatkan yang itu. Terima kasih!
Codefun64

Saya tidak memiliki sumber daya di depan saya saat ini, meskipun saya bertanya-tanya apakah melakukan 1420/339akan 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-8

@MichaelT Itu hal yang paling menarik. Apakah Anda memiliki skrip yang menemukan representasi pecahan terkecil dari angka? ;)
Codefun64

Codefun64 Saya baru saja mengerjakan dari pendekatan umum lainnya untuk pi. 22/7 tidak dalam toleransi yang cukup, jadi saya melirik en.wikipedia.org/wiki/Approximations_of_%CF%80 dan menggunakan yang berikutnya untuk melihat apakah ia memiliki toleransi yang lebih baik daripada yang diminta @Dennis.

0

Lua, 115 104 byte

function f(a)b=0 for i=1,#a do c=a[i]b=b+(1<#c and c[1]*c[2]*c[3]or(4/3)*math.pi*c[1]^3)end return b end

Solusi 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 mengeksekusi print(f(array)).


0

05AB1E , 18 16 byte

εDgi3m4žq*3/*]PO

Cobalah online.

Penjelasan:

ε                # Map each inner list of the (implicit) input to:
 D               #  Duplicate the current inner list
  gi             #  Is the length 1 (is it an `R`):
    3m           #   Take the duplicated current item and take its cube
                 #    i.e. [3] → [27]
      žq         #   PI
        4*       #   Multiplied by 4
          3/     #   Divided by 3
                 #    → 4.1887902047863905
            *    #   And multiply it with the current cubed `R`
                 #    [27] and 4.1887902047863905 → [113.09733552923254]
]                # Close both the if and map
 P               # Take the product of each inner list
                 #  i.e. [[1,4,3],[2,2,2],[113.09733552923254],[4,4,4]]
                 #   → [12,8,113.09733552923254,64]
  O              # Take the total sum (and output implicitly)
                 #  i.e. [12,8,113.09733552923254,64] → 197.09733552923254

0

R, 38 36 byte

function(x,y=4*pi/3*x,z=x)sum(x*y*z)

Menggunakan argumen default untuk beralih di antara kasus: dengan tiga argumen menghitung produk, dan dengan satu argumen menghitung rumus bola.


Apakah Anda membutuhkan f<-dan {}?
Giuseppe

Kode ini tidak menghasilkan dengan benar untuk kasing uji (5,0,0). Juga, itu tidak mengakomodasi test case di mana ada beberapa hadiah dan volume perlu dijumlahkan bersama.
Robert S.

Untuk (5,0,0) saya mendapat nol - apakah itu tidak benar? Telah diedit untuk menggunakan sum(dan menghapus beberapa hal yang tidak perlu sesuai saran Giuseppe)
JDL
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.