크리스마스 선물은 얼마나 되었습니까?


32

예, 얼마나 습니까?

우리 모두 알고 있듯이 큰 선물은 작은 선물보다 훨씬 낫습니다. 따라서 선물의 가치는 항상 선물 수, 무게 또는 결합 가격이 아닌 총량으로 측정해야합니다.

한 사람이받는 선물의 양을 비교하기 위해 눈살을 찌푸 리기 때문에 크리스마스 파티에서 다른 사람들이 쉽게 읽고 읽을 수있는 긴 스크립트를 원하지 않습니다. 따라서 스크립트의 바이트 수를 최소한으로 유지해야합니다.

당신의 작업은 간단합니다 : 치수 목록을 적절한 형식으로 입력으로 취하고 선물의 결합 된 양을 출력하는 프로그램을 만드십시오. 각 선물의 차원은 세 개의 숫자 세트 또는 단일 숫자입니다. 입력 값이 세 개의 숫자 ( L, W, H) 인 경우, 선물은 차원의 입방체입니다 L x W x H. 단일 숫자 ( R) 인 경우 현재는 반경의 구입니다 R.

규칙 :

  • 전체 프로그램 또는 함수일 수 있습니다.
  • 입력은 편리한 형식 일 수 있습니다
    • 원하는 경우 구는 숫자와 두 개의 0으로 표시 될 수 있습니다.
    • 직육면체는 항상 0이 아닌 모든 치수를 갖습니다.
  • 출력은 하나의 십진수 여야합니다.
    • 대답이 무엇인지 분명하다면 추가 출력이 허용됩니다.
    • 소수점 이하 두 자리 이상을 출력해야합니다.
    • 숫자가 1000보다 큰 경우 출력은 표준 형식 / 과학 표기법 일 수 있습니다.
    • 귀하의 언어에 Pi 상수가없는 경우 최대 9999.99까지 정확해야합니다.

예 :

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

리더 보드

이 게시물의 맨 아래에있는 스택 스 니펫은 답변 a) 언어 당 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 카탈로그를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

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

헤더에 여러 개의 숫자를 포함 시키려면 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

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

언어 이름을 링크로 만들면 스 니펫에 표시됩니다.

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


3
재미있는 원통형 상자 중 하나에 모자를 쓰는 여자는 없습니까?
manatwork

2
@manatwork, 아니, 모든 숙녀는 중산모를 얻을 것이고, 당신은 쉽게 구에 그것들을 맞출 수 있습니다 = P
Stewie Griffin

1
나는 (5)단지 부분적인 예이고 우리의 코드는 처리해야 한다고 가정 ((5))합니다.
manatwork

2
우리의 선택 언어에 Pi 상수가 없다면 얼마나 많은 정밀도가 필요합니까?
Dennis

1
@manatwork, + 및 *는 사용중인 언어에서 더하기 및 곱하기 (또는 다른 연산)를 의미하지 않는 한 괜찮습니다.
Stewie Griffin

답변:


10

젤리 , 19 18 바이트

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

온라인으로 사용해보십시오!

불행히도, Jelly에는 아직 π 상수가 없으며 벡터 라이저는 플로트를 올바르게 처리하지 않습니다.

이러한 문제를 극복하기 위해 4π / 3 을 곱하는 대신 1420 을 곱하고 339로 나눕니다 . 이후 1420 ÷ 339 = 4.18879056 ...4π / 3 = 4.18879020 ... ,이 규칙에 부합하기에 충분히 정확하다.

Jelly의 최신 버전은 더 나은 정밀도 로 14 바이트로이 작업을 수행 할 수 있습니다.

Zµ*3×240°Ḣo@PS

온라인으로 사용해보십시오!

작동 원리

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.

비경쟁 버전은 ×240°대신 240×1420÷339 을 곱하고 제품을 라디안으로 변환하는 대신을 사용 합니다 .


9

하스켈, 40 바이트

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

사용 예 : sum.map q $ [[1,4,3],[2,2,2],[3],[4,4,4]]-> 197.09733552923254.

작동 방식 : 입력 목록의 각 요소에 대해 : 단일 요소가있는 경우 x구의 부피를 계산하고 그렇지 않으면을 가져옵니다 product. 더해.


1
바이트를 계산하는이 방법이 일반적으로 유효합니까? 나는 p=sum.map q말했을 것입니다 (그리고 p숫자 목록 에서 사용하도록 지시했습니다 )
Leif Willerts

1
@LeifWillerts : 메타에 대한 최근 주제가 있는데, 여기에는 전역 정의를 릴레이하는 명명되지 않은 함수를 허용합니다. sum.map q에 의존하는 명명되지 않은 함수 q이므로 괜찮습니다.
nimi December

9

Pyth, 19 18 바이트

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

Dennis 덕분에 1 바이트

데모

입력 형식은 목록의 목록입니다.

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

단순히 큐브 크기를 계산하기 위해 차원을 곱합니다. 그것이 0으로 나오면, 구 부피를 계산합니다.

구 상수 4/3*pi는 라디안 단위로 240 도로 계산됩니다. .t ... 7입력을도 단위로 라디안으로 변환하고 C\ð의 코드 포인트 ( ð240)를 계산합니다 .


7

파이썬 2, 86 70 바이트

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

나는 당신의 수 바이트 수 당신이 당신셨어요 방법, 86을?
wnnmaw

또한, 당신은 단지 수동으로 파이 값에 넣어 바이트를 저장할 수 있습니다, 당신은 최대 사용할 수있는 3.14159265358979323손익분기
wnnmaw에게

@wnnmaw 나는 수입을 계산하는 것을 잊었다 -.-
TFeld

나는 당신의 파이에 대한 하드 코딩 된 가치가 약간 떨어져 있다고 생각합니다 :)
wnnmaw

4
@wnnmaw Pi가 아닙니다. 4Pi / 3입니다.
Dennis

5

Mathematica, 34 바이트

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

이름이없는 함수는 중첩 된 길이 목록을 가져오고 볼륨을 실수로 반환합니다.

먼저 단일 값을 해당 구의 부피로 바꿉니다 /.{r_}:>{4r^3/3Pi}. 그런 다음 각 목록의 내용에을 곱합니다 1.##&@@@. 마지막으로를 사용하여 벡터의 트레이스로 합을 계산합니다 Tr[...].


5

자바 스크립트 (ES6), 56

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

합리적인 .reduce 버전은 1 바이트 더 깁니다

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

4.11879대신 에를 사용하여 몇 바이트를 절약 4/3*Math.PI할 수 있습니다.
ETHproductions

@ETHproductions 예,하지만 In case your language doesn't have a Pi-constant,언어에 PI 상수가 있으므로 자격이 있는지 모르겠습니다.
edc65

5

파이썬, 49 바이트

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

구 표현을로 사용합니다 (a,0,0). 직육면체로 취급되는이 볼륨의 체적은 0이며,이 경우 구 체적이 대신 사용됩니다. 상수가 얼마나 정확한지 확실하지 않으므로 이것이 충분하기를 바랍니다.


4

MATL , 20 바이트

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

입력 형식은 각 행이 큐브 또는 구를 설명하는 행렬입니다. 구는 해당 행의 첫 번째 숫자로만 정의됩니다. 다른 두 숫자는 0입니다. 따라서 도전의 첫 번째 예는 다음과 같습니다.

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

이것은 이 도전보다 빠른 언어의 현재 릴리스 인 2.0.2를 사용합니다 .

예 :

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

설명:

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

프롤로그, 115100 바이트

암호:

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

설명 :

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

예 :

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

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

여기에서 온라인으로 사용해보십시오

편집 : 이진 술어를 정의하여 15 바이트를 절약했습니다.


3

펄, 52 47 바이트

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

에 46 + 1 -p (일반적입니다. 여기서 다른지 알려면 업데이트하겠습니다)

사용법 : 파일에 넣고 echo 1,4,3 2,2,2 3 4,4,4 | perl -p x.pl

의견 :

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

47 개 업데이트 덕분에 @Dennis를 사용하여 일부 바이트를 저장하기 위해 이 트릭을 .


s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g;}{몇 바이트를 절약합니다.
Dennis

@Dennis 감사합니다! 전에 $ \로 시도했지만 $_비용을 많이 재설정 했습니다. 그래도 왜 $_새 블록에서 재설정 되는지 확실하지 않습니다 . $_block-local은 while(<>){}?
Kenney

예, $_현재 범위의 기본 변수입니다. END 블록에서는 정의되지 않습니다.
Dennis

2

CJam, 24 21 바이트

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

여기에서 테스트하십시오.

설명

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 바이트

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

여기에 흑 마법이 일어나고 있습니다. 순조롭게 살펴 보도록하겠습니다.

먼저 개별 쉼표로 구분 된 배열로 예상되는 입력 (1,4,3) (2,2,2) (3) (4,4,4)을 가져와 루프에 파이프합니다 |%{}.

루프 내에서 먼저 $_고려중인 특정 배열에 하나의 항목 만 있는지 확인 하고이를 사용하여 배열에 색인을 생성합니다 (기본적으로 더 짧은 if / else 구성). 더 이상의 항목의 경우, 가정 (1,4,3)우리를 통해 배열 뱉어하는 것입니다 상반기, 실행, 입력으로 $_등을, (1,4,3). 그렇지 않으면, 우리는 요소로 세 번 구성 (,$_*3)되고 대략 4 / 3rd * Pi로 고정 되는 새로운 동적 배열을 만듭니다 . input의 (3)경우 결과가 (3,3,3,4.18879)출력됩니다.

예, PowerShell에는 Pi 상수가 있으며 .NET call을 통해 액세스 [math]::PI하지만 더 길어 사용하고 싶지 않습니다. :피

그럼에도 불구하고, 우리는 별표 통해 출력하는 배열을 연결 -join'*'그래서 "1*4*3". 루프를 완전히 마치면 이제 문자열 모음이 생깁니다. 우리는 -join'+'모두 더하기 위해 그리고 iex결과를 계산하기위한 표현식을 함께 모았습니다 .


1

루비, 58 자

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

샘플 실행 :

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

루비, 50 자

개선 아이디어는 edc65JavaScript 답변 에서 부끄럽게 도난당했습니다 .

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

샘플 실행 :

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

apt, 27 22 바이트

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

공백으로 구분 된 배열로 입력을받습니다. 온라인으로 사용해보십시오!

작동 원리

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

, 23 바이트

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

이 프로그램에 입력을 제공하는 몇 가지 방법이 있습니다. 공백으로 구분 된 세 개의 숫자로 된 명령 행 인수로 각 선물을 사용할 수 있습니다 (따옴표로 묶어야 함 pip.py present.pip "1 4 3" "3 0 0"). 또는 -r플래그를 지정하고 각 선물을 공백으로 구분 된 세 개의 숫자로 구성된 stdin 라인으로 제공하십시오. 온라인으로 사용해보십시오!

방법?

                         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

펄 5, 142 바이트

-p명령 행에서 실행하고 다음 과 같이 쉼표로 구분 된 숫자를 입력하십시오.

5,0,0 또는 (5,0,0)

생산할 것이다

523.598820058997

piPerl 에는 키워드 가 없습니다 . 이것은 대부분의 경우 지정된 유효 숫자에 정확하지만, 내가 아는 모든 pi의 숫자를 입력하더라도 일부 계산에는 정확하지 않습니다. 그래서 나는 그것을 떠났다3.1415 . 이것이 허용되는지 확실하지 않습니다.

암호:

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

나보다 기본 수학에 능숙한 Dennis의 조언과 정확하게 유지하면서 바이트를 절약 할 수있는 MichaelT의 제안에 대한 정확성을 높이기 위해 편집했습니다.


2
1. 어떻게 파싱 1511하겠습니까? 2. 3.1415 는 둥글거나 정확하게 둥글 지 않습니다. 계산이 정확하면 오류는 0.0000017 보다 크지 않아야합니다 . 3. (4/3)*3.1415단일 플로트로 교체 할 수 있습니다.
Dennis

1. OP는 우리가 구에 대한 후행 0을 가정 할 수 있다고 말합니다 (실제로 내가 제공 한 입력 예입니다). 좋은 제안, 나는 그 것을 놓쳤다. 감사!
Codefun64

나는 지금 내 앞에 리소스가 없지만 1420/339합리적인 작업으로 합리적인 가격으로 몇 바이트를 돌려 줄지 궁금합니다 . (이것은 4/3 * 355/113입니다). 분수와 값의 차이는 -8.49130615e-8

@MichaelT 가장 흥미로운 것입니다. 숫자의 가장 작은 분수 표현을 찾는 스크립트가 있습니까? ;)
Codefun64

Codefun64 방금 pi 에 대한 다른 일반적인 근사치로 작업했습니다 . 22/7은 공차가 충분하지 않으므로 en.wikipedia.org/wiki/Approximations_of_%CF%80 에서 다음을 사용하여 @Dennis가 요청한 것보다 더 나은 공차가 있는지 확인했습니다.

0

루아, 115104 바이트

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

간단한 해결책으로, 의사 삼항 연산 <condition> and <non-false> or <value if false>을 괄호로 묶어야합니다. 그렇지 않으면 b는 두 영역과 합산됩니다.

입력 형식이어야하며 array={{1,4,3},{2,2,2},{3},{4,4,4}}결과를 실행하여 볼 수 있습니다 print(f(array)).


0

05AB1E , 18 16 바이트

εDgi3m4žq*3/*]PO

온라인으로 사용해보십시오.

설명:

ε                # 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 바이트

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

기본 인수를 사용하여 사례 간을 전환합니다. 세 개의 인수로 제품을 계산하고 하나의 인수로 구 공식을 계산합니다.


당신은 필요합니까 f<-과를 {}?
주세페

이 코드는 테스트 케이스에 대해 올바르게 출력되지 않습니다 (5,0,0). 또한 여러 개의 선물이 있고 볼륨을 합산해야하는 테스트 케이스를 수용하지 않습니다.
Robert S.

(5,0,0)의 경우 0을 얻습니다. 맞지 않습니까? 사용하기 위해 편집했습니다 sum(그리고 주세페의 제안에 필요하지 않은 것들을 제거했습니다)
JDL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.