Bạn đã nhận được bao nhiêu món quà cho Giáng sinh?


32

Phải, bao nhiêu chứ không phải bao nhiêu ...

Như chúng ta đã biết, một món quà lớn tốt hơn nhiều so với một món quà nhỏ. Do đó, giá trị của các món quà phải luôn được đo bằng tổng khối lượng, không phải số lượng quà, trọng lượng hoặc thậm chí giá kết hợp.

Khi nó cau mày để so sánh số lượng quà tặng mà một người nhận được, bạn không muốn một kịch bản dài mà người khác dễ dàng nhìn thấy và đọc trong bữa tiệc Giáng sinh. Do đó, bạn cần giữ tối thiểu số byte trong tập lệnh của mình.

Nhiệm vụ của bạn rất đơn giản: Tạo một chương trình lấy danh sách các thứ nguyên làm đầu vào, trên bất kỳ định dạng phù hợp nào và xuất ra khối lượng kết hợp của các món quà của bạn. Kích thước của mỗi món quà sẽ là một bộ gồm ba số hoặc một số duy nhất. Nếu đầu vào là ba số ( L, W, H), thì hiện tại là một hình khối kích thước L x W x H. Nếu đó là một số duy nhất ( R), thì hiện tại là một hình cầu bán kính R.

Quy tắc:

  • Nó có thể là một chương trình đầy đủ hoặc một chức năng
  • Đầu vào có thể ở bất kỳ định dạng thuận tiện
    • Nếu muốn, một hình cầu có thể được biểu thị bằng một số theo sau là hai số không
    • Một hình khối sẽ luôn có tất cả các kích thước khác không.
  • Đầu ra phải là một số thập phân duy nhất
    • Đầu ra bổ sung được chấp nhận miễn là câu trả lời rõ ràng là gì
    • Đầu ra phải có ít nhất hai chữ số sau dấu thập phân
    • Đầu ra có thể ở dạng chuẩn / ký hiệu khoa học nếu số lớn hơn 1000.
    • Trong trường hợp ngôn ngữ của bạn không có hằng số Pi, câu trả lời phải chính xác đến 9999,99.

Ví dụ:

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

Bảng xếp hạng

Đoạn trích đoạn ở cuối bài này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

## Perl, 43 + 2 (-p flag) = 45 bytes

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


3
Không có phụ nữ có mũ trong một trong những hộp hình trụ vui nhộn ?
manatwork

2
@manatwork, không, tất cả phụ nữ sẽ nhận được mũ Bowler và bạn có thể dễ dàng đặt chúng trong một quả cầu = P
Stewie Griffin

1
Tôi giả sử (5)chỉ là một phần ví dụ và mã của chúng tôi chỉ phải xử lý ((5)).
manatwork

2
Nếu ngôn ngữ lựa chọn của chúng ta không có hằng số Pi, thì cần bao nhiêu độ chính xác?
Dennis

1
@manatwork, + và * đều ổn miễn là chúng không có nghĩa là phép cộng và phép nhân (hoặc các thao tác khác) trong ngôn ngữ bạn đang sử dụng.
Stewie Griffin

Câu trả lời:


10

Thạch , 19 18 byte

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

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

Thật không may, Jelly chưa có hằng số π và vectorizer không xử lý nổi đúng cách.

Để khắc phục những vấn đề này, thay vì nhân với 4π / 3 , chúng tôi nhân với 1420 và chia cho 339 . Vì 1420 339 = 4.188790564π / 3 = 4.18879020 , nên điều này đủ chính xác để tuân thủ các quy tắc.

Phiên bản mới nhất của Jelly có thể hoàn thành nhiệm vụ này trong 14 byte , với độ chính xác tốt hơn.

Zµ*3×240°Ḣo@PS

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

Làm thế nào nó hoạt động

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.

Phiên bản không cạnh tranh sử dụng ×240°thay vì ×1420÷339, nhân với 240 và chuyển đổi các sản phẩm thành radian.


9

Haskell, 40 byte

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

Ví dụ sử dụng: sum.map q $ [[1,4,3],[2,2,2],[3],[4,4,4]]-> 197.09733552923254.

Cách thức hoạt động: Đối với mỗi phần tử của danh sách đầu vào: nếu nó có một phần tử duy nhất xtính thể tích của hình cầu, thì phần khác sẽ lấy product. Tổng kết lại.


1
Đây có phải là cách đếm byte nói chung hợp lệ? Tôi sẽ nói p=sum.map q(và sau đó nói đến việc sử dụng ptrên một danh sách liệt kê các số)
Leif Willerts

1
@LeifWillerts: Có một chủ đề gần đây về meta cho phép các chức năng không tên được chuyển tiếp theo định nghĩa toàn cầu. sum.map qlà một chức năng không tên phụ thuộc vào q, vì vậy tôi đoán nó ổn.
nimi

9

Pyth, 19 18 byte

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

1 byte nhờ Dennis

Trình diễn

Định dạng đầu vào là danh sách các danh sách:

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

Nó chỉ đơn giản là nhân các kích thước với nhau để tính khối lượng khối. Nếu điều đó bằng không, nó sẽ tính toán thể tích hình cầu.

Hằng số hình cầu, 4/3*piđược tính bằng 240 độ theo radian. .t ... 7chuyển đổi một đầu vào theo độ thành radian và C\ðtính toán điểm mã ðlà 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)

Tôi nhận được số byte của bạn là 86, làm thế nào bạn có được số byte của bạn?
wnnmaw

Ngoài ra, bạn có thể lưu byte bằng cách đặt thủ công một giá trị cho pi, bạn có thể sử dụng tối đa 3.14159265358979323để hòa vốn
wnnmaw

@wnnmaw Tôi quên đếm số lần nhập -.-
TFeld

Tôi tin rằng giá trị mã hóa cứng của bạn cho pi là một chút :)
wnnmaw

4
@wnnmaw Đó không phải là Pi; đó là 4Pi / 3.
Dennis

5

Toán học, 34 byte

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

Một hàm không tên có danh sách các độ dài lồng nhau và trả về âm lượng như một số thực.

Trước tiên chúng ta thay thế các giá trị đơn bằng thể tích của hình cầu tương ứng bằng /.{r_}:>{4r^3/3Pi}. Sau đó, chúng tôi nhân lên nội dung của từng danh sách với 1.##&@@@. Cuối cùng, chúng tôi tính tổng là dấu vết của vectơ với 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

Càng hợp lý .reduce phiên bản là 1 byte còn

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

Bạn có thể lưu một vài byte bằng cách sử dụng 4.11879thay thế 4/3*Math.PI, vì điều đó đủ chính xác để đủ điều kiện.
Sản phẩm ETH

@ETHproductions có, nhưng In case your language doesn't have a Pi-constant,ngôn ngữ của tôi có hằng số PI, vì vậy tôi không biết liệu nó có đủ điều kiện hay không
edc65

5

Python, 49 byte

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

Sử dụng các đại diện của hình cầu như (a,0,0). Được coi là một hình khối, cái này có thể tích 0, trong trường hợp đó khối lượng hình cầu được sử dụng thay thế. Tôi không rõ ràng về mức độ chính xác của nhu cầu cần thiết, vì vậy tôi hy vọng điều này là đủ.


4

MATL , 20 byte

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

Định dạng đầu vào là một ma trận trong đó mỗi hàng mô tả một khối hoặc một hình cầu. Một hình cầu được xác định chỉ bằng số đầu tiên trong hàng đó; hai số còn lại bằng không. Vì vậy, ví dụ đầu tiên từ thử thách sẽ là:

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

Điều này sử dụng bản phát hành hiện tại của ngôn ngữ, 2.0.2 , sớm hơn thử thách này.

Ví dụ:

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

Giải trình:

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

Mã số:

[]*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).

Giải thích:

[]*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

Ví dụ:

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

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

Dùng thử trực tuyến tại đây

Chỉnh sửa: đã lưu 15 byte bằng cách xác định một vị từ dyadic.


3

Perl, 52 47 byte

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

46 + 1 cho -p(điều đó là phổ biến; hãy cho tôi biết nếu nó khác ở đây và tôi sẽ cập nhật)

Cách sử dụng: đặt trong một tập tin và echo 1,4,3 2,2,2 3 4,4,4 | perl -p x.pl

Với nhận xét:

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 $_

cập nhật 47 Cảm ơn @Dennis vì đã lưu một số byte bằng thủ thuật này .


s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g;}{tiết kiệm một vài byte.
Dennis

@Dennis Cảm ơn! Tôi đã thử với $ \ trước đây nhưng đặt lại $_chi phí càng nhiều. Vẫn chưa rõ tại sao $_lại được đặt lại trong một khối mới, mặc dù vậy .. Có phải là $_khối cục bộ while(<>){}không?
Kenney

Có, $_là biến mặc định của phạm vi hiện tại. Trong khối END, nó không được xác định.
Dennis

2

CJam, 24 21 byte

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

Kiểm tra nó ở đây.

Giải trình

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 byte

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

Một số ma thuật đen xảy ra ở đây. Tôi sẽ cố gắng vượt qua nó thật suôn sẻ.

Trước tiên, chúng tôi lấy đầu vào của chúng tôi, dự kiến ​​là các mảng được phân tách bằng dấu phẩy riêng lẻ (1,4,3) (2,2,2) (3) (4,4,4), ví dụ , và đưa nó vào một vòng lặp |%{}.

Trong vòng lặp, trước tiên chúng tôi kiểm tra xem $_, mảng cụ thể mà chúng tôi đang xem xét, chỉ có một mục và sử dụng mục đó để lập chỉ mục thành một mảng (về cơ bản là một cấu trúc if / other ngắn hơn). Nếu đó là nhiều hơn một mục, giả sử (1,4,3)là đầu vào, chúng tôi thực hiện nửa đầu, chỉ đơn giản là nhổ mảng qua $_, chẳng hạn như (1,4,3). Mặt khác, chúng tôi tạo ra một mảng động mới bao gồm phần tử ba lần (,$_*3)và xử lý xấp xỉ 4/3 * Pi. Đối với đầu vào (3), điều này sẽ dẫn đến (3,3,3,4.18879)đầu ra.

Có, PowerShell có hằng số Pi, được truy cập qua cuộc gọi .NET [math]::PI, nhưng điều đó lâu hơn và tôi không muốn sử dụng nó. : p

Bất kể, chúng tôi ghép mảng đầu ra đó bằng dấu hoa thị thông qua -join'*', vì vậy "1*4*3". Khi chúng ta hoàn toàn vượt qua vòng lặp, bây giờ chúng ta có một bộ các chuỗi. Chúng tôi -join'+'tất cả những người cùng nhau để bổ sung của chúng tôi, và iexbiểu thức để tính kết quả.

Phù.


1

Ruby, 58 ký tự

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

Chạy mẫu:

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 ký tự

Cải thiện ý tưởng bị đánh cắp một cách đáng xấu hổ từ câu trả lời JavaScript của edc65 .

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

Chạy mẫu:

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

Lấy đầu vào là các mảng được phân tách bằng dấu cách. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Có một vài cách để cung cấp đầu vào cho chương trình này. Nó có thể lấy mỗi hiện tại làm đối số dòng lệnh của ba số được phân tách bằng dấu cách (sẽ cần được gói trong dấu ngoặc kép pip.py present.pip "1 4 3" "3 0 0":). Thay phiên, chỉ định -rcờ và cung cấp cho mỗi món quà như một dòng stdin bao gồm ba số cách nhau không gian. Hãy thử trực tuyến!

Làm sao?

                         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

Chạy với -pdòng lệnh và nhập số được phân cách bằng dấu phẩy, như vậy:

5,0,0 hoặc là (5,0,0)

sẽ sản xuất

523.598820058997

Không có pitừ khóa trong Perl. Điều này, trong hầu hết các trường hợp, chính xác với các số liệu quan trọng được chỉ định, tuy nhiên ngay cả khi tôi đã nhập tất cả các số liệu của pi mà tôi biết, nó sẽ không chính xác cho một số tính toán. Vì vậy, tôi đã để lại nó với 3.1415. Tôi không chắc điều này có được chấp nhận hay không.

Mã số:

@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]);}

Được chỉnh sửa để có độ chính xác cao hơn theo lời khuyên của Dennis, người giỏi toán cơ bản hơn tôi và từ một gợi ý của MichaelT để lưu byte trong khi vẫn chính xác.


2
1. Bạn sẽ phân tích 1511như thế nào? 2. 3.1415 không được làm tròn đúng hay đủ chính xác. Nếu tính toán của tôi là chính xác, sai số không được lớn hơn 0,0000017 . 3. (4/3)*3.1415có thể được thay thế bằng một float duy nhất.
Dennis

1. OP nói rằng chúng tôi có thể giả sử dấu 0 cho các hình cầu (thực tế là đầu vào ví dụ tôi đã cung cấp), 2. Tôi không biết bạn đang sử dụng phép tính nào, nhưng chắc chắn, tôi sẽ tăng độ chính xác và 3 đề nghị tốt, tôi đã bỏ lỡ một. Cảm ơn!
Codefun64

Hiện tại tôi không có tài nguyên trước mặt, mặc dù tôi tự hỏi liệu việc làm 1420/339đó có mang lại cho bạn một vài byte với xấp xỉ hợp lý hay không. (đây là 4/3 * 355/113). Sự khác biệt giữa phân số và giá trị bạn có là -8.49130615e-8

@MichaelT Đó là điều thú vị nhất. Bạn có một tập lệnh tìm đại diện phân số nhỏ nhất của các số không? ;)
Codefun64

Codefun64 Tôi vừa thực hiện các phép tính gần đúng phổ biến khác cho pi. 22/7 không đủ sức chịu đựng, vì vậy tôi đã liếc vào en.wikipedia.org/wiki/Approimumations_of_%CF% 80 một cái tiếp theo để xem liệu nó có dung sai tốt hơn những gì @Dennis yêu cầu không.

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

Giải pháp đơn giản, tôi phải bọc hoạt động giả ba chiều <condition> and <non-false> or <value if false>trong ngoặc đơn khác b sẽ tổng hợp với cả hai khu vực.

Đầu vào phải ở dạng array={{1,4,3},{2,2,2},{3},{4,4,4}}và kết quả có thể được nhìn thấy bằng cách thực thi print(f(array)).


0

05AB1E , 18 16 byte

εDgi3m4žq*3/*]PO

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

Giải trình:

ε                # 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)

Sử dụng các đối số mặc định để chuyển đổi giữa các trường hợp: với ba đối số sẽ tính toán sản phẩm và với một đối số sẽ tính công thức hình cầu.


Bạn cần f<-{}?
Giuseppe

Mã này không xuất chính xác cho trường hợp thử nghiệm (5,0,0). Ngoài ra, nó không phù hợp với trường hợp thử nghiệm khi có nhiều phần quà và các tập cần được tổng hợp lại với nhau.
Robert S.

Đối với (5,0,0) tôi nhận được số không - điều đó có đúng không? Đã chỉnh sửa để sử dụng sum(và xóa một số nội dung không cần thiết theo đề xuất của Giuseppe)
JDL
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.