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


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 자

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

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