クリスマスにどれくらいプレゼントをもらいましたか?


32

はい、いくらで、いくらではなく...

ご存知のように、大きなプレゼントは小さなプレゼントよりもはるかに優れています。したがって、プレゼントの価値は、プレゼントの数、重量、または組み合わせた価格ではなく、常に総量で測定する必要があります。

プレゼントの量を比較するのは面倒くさいので、クリスマスパーティーで他の人が簡単に見たり読んだりできる長いスクリプトは必要ありません。したがって、スクリプトのバイト数を最小限に抑える必要があります。

あなたのタスクは簡単です:次元のリストを入力として適切な形式で受け取り、プレゼントの合計量を出力するプログラムを作成します。各プレゼントの次元は、3つの数字のセットまたは単一の数字のいずれかです。入力が3つの数値(L, W, H)の場合、現在は次元の直方体ですL x W x H。単一の数値(R)の場合、現在の半径はsphereですR

ルール:

  • 完全なプログラムまたは関数のいずれかです
  • 入力は任意の便利な形式にすることができます
    • 必要に応じて、球体は数字とそれに続く2つのゼロで表すことができます。
    • 直方体は常にすべてゼロ以外の次元を持ちます。
  • 出力は単一の10進数でなければなりません
    • 答えが明らかである限り、追加の出力が受け入れられます
    • 出力には、小数点の後に少なくとも2桁が必要です。
    • 数値が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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、スニペットに表示することもできます。

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


3
これらの面白い円筒形の箱に帽子をかぶる女性はいませんか?
マナトワーク

2
@manatwork、いいえ、すべての女性が山高帽を手に入れ、あなたは簡単に球にそれらを合わせることができます= P
Stewie Griffin

1
(5)は単に部分的な例であり、私たちのコードは処理するだけでよいと思います((5))
マナトワーク

2
選択した言語にPi定数がない場合、どのくらいの精度が必要ですか?
デニス

1
@manatwork、+、*は、使用している言語での加算や乗算(または他の演算)を意味しない限り問題ありません。
スティーヴィーグリフィン

回答:


10

ゼリー19 18バイト

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

オンラインでお試しください!

残念ながら、Jellyにはまだπ定数がなく、ベクトライザーはfloatを適切に処理しません。

これらの問題を克服するために、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

Haskell、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、数字のリストのリストで使用するように言われました)
レイフウィラーツ

1
@LeifWillerts:グローバル定義で中継する名前のない関数を許可するメタに関する最近のトピックがあります。sum.map qはに依存する名前のない関数なqので、大丈夫だと思います。
nimi

9

Pyth、19 18バイト

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

デニスのおかげで1バイト

デモンストレーション

入力形式はリストのリストです:

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

単純に次元を掛け合わせて、立方体の体積を計算します。それがゼロになると、球体の体積が計算されます。

球定数4/3*piは、ラジアンで240度として計算されます。.t ... 7度単位の入力をラジアンに変換し、C\ðのコードポイントを計算しますð。これは240です。


7

Python 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

piのハードコードされた値は少しずれていると思います:)
wnnmaw

4
@wnnmawそれはPiではありません。4Pi / 3です。
デニス

5

Mathematica、34バイト

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

長さのネストされたリストを取り、実数としてボリュームを返す名前のない関数。

まず、単一の値を、対応する球体の体積で置き換えます/.{r_}:>{4r^3/3Pi}。次に、各リストの内容にを掛け1.##&@@@ます。最後に、を使ってベクトルのトレースとして合計を計算し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

より賢明な .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

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

入力形式は、各行が立方体または球体を記述するマトリックスです。球体は、その行の最初の数だけで定義されます。他の2つの数値はゼロです。したがって、チャレンジの最初の例は次のようになります。

[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

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

update 47 このトリックを使用しいくつかのバイトを保存してくれた@Dennisに感謝します。


s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g;}{数バイト節約します。
デニス

@デニスありがとう!前に$ \で試してみましたが$_、同じくらいコストをリセットしました。理由としてまだ不明$_...ですが、リセットが、新しいブロックである$_ブロック・ローカルでwhile(<>){}
ケニー

はい、$_現在のスコープのデフォルト変数です。ENDブロックでは、未定義です。
デニス

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)、それをループにパイプします|%{}

ループ内で、まず$_、検討している特定の配列に1つの項目しか含まれていないかどうかを確認し、それを使用して配列にインデックスを付けます(基本的に短いif / else構造)。(1,4,3)入力として複数の項目がある場合、前半を実行します。これは$_、などを介して配列を吐き出すだけ(1,4,3)です。それ以外の場合は、要素で構成される新しい動的配列を3回作成し、(,$_*3)4 / 3rd * Piの近似値を追加します。入力の(3)場合、これは(3,3,3,4.18879)出力になります。

はい、PowerShellにはPi定数があり、.NET呼び出しを介してアクセスしますが[math]::PI、それは長く、使用したくありません。:p

かかわらず、我々は経由アスタリスクでその出力配列を連結-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

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

このプログラムに入力を提供する方法はいくつかあります。それぞれの存在を、スペースで区切られた3つの数字のコマンドライン引数として使用できます(引用符で囲む必要があります:)pip.py present.pip "1 4 3" "3 0 0"。または、-rフラグを指定して、それぞれを3つのスペースで区切られた数字で構成される標準入力の行として指定します。オンラインでお試しください!

どうやって?

                         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バイト

-pコマンドラインでwith を実行し、次のようにカンマで区切られた数値を入力します。

5,0,0 または (5,0,0)

生産するだろう

523.598820058997

piPerlにはキーワードはありません。これは、ほとんどの場合、指定された有効数字に対して正確ですが、知っているパイのすべての数字を入力しても、一部の計算ではあまり正確ではありません。だから私はそれを残しました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]);}

デニスのアドバイスをより正確に編集しました。デニスは、私よりも基本的な数学が得意であり、MichaelTの提案から、バイトを節約しながら正確さを維持しています。


2
1.どのように解析し1511ますか?2. 3.1415は適切に丸められておらず、十分に正確でもありません。計算が正しい場合、エラーは0.0000017を超えてはなりません。3. (4/3)*3.1415単一のフロートに置き換えることができます。
デニス

1. OPは、球体の末尾のゼロ(実際には私が提供した入力例)を想定する可能性があると述べています。良い提案、私はそれを見逃した。ありがとう!
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

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

05AB1E18 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)

デフォルトの引数を使用してケースを切り替えます。3つの引数を使用すると積が計算され、1つの引数を使用すると球体の式が計算されます。


あなたが必要なんf<-{}
ジュゼッペ

このコードは、テストケースに対して正しく出力されません(5,0,0)。また、複数のプレゼンスがあり、ボリュームを合計する必要があるテストケースには対応していません。
ロバートS.

(5,0,0)の場合、ゼロになります—それは正しくありませんか?使用するために編集しましたsum(そして、ジュゼッペの提案に従って必要ではなかったものを削除しました)
JDL
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.