Wie viel Geschenk hast du zu Weihnachten bekommen?


32

Ja, wie viel , nicht wie viele ...

Wie wir alle wissen, ist ein großes Geschenk weitaus besser als ein kleines. Daher sollte der Wert der Geschenke immer im Gesamtvolumen gemessen werden, nicht in der Anzahl der Geschenke, im Gewicht oder sogar im Gesamtpreis.

Da es verpönt ist, die Menge an Geschenken zu vergleichen, die man bekommt, möchte man kein langes Drehbuch, das von anderen auf der Weihnachtsfeier leicht gesehen und gelesen werden kann. Daher müssen Sie die Anzahl der Bytes in Ihrem Skript auf ein Minimum beschränken.

Ihre Aufgabe ist einfach: Erstellen Sie ein Programm, das eine Liste von Dimensionen in einem beliebigen geeigneten Format als Eingabe verwendet und das Gesamtvolumen Ihrer Geschenke ausgibt. Die Dimension eines jeden Geschenks ist entweder ein Satz von drei Zahlen oder eine einzelne Zahl. Wenn die Eingabe drei Zahlen ( L, W, H) ist, ist die Gegenwart ein Quader von Dimensionen L x W x H. Wenn es sich um eine einzelne Zahl handelt ( R), ist die Gegenwart eine Kugel mit Radius R.

Regeln:

  • Es kann entweder ein vollständiges Programm oder eine Funktion sein
  • Die Eingabe kann in einem beliebigen Format erfolgen
    • Falls gewünscht, kann eine Kugel durch eine Zahl gefolgt von zwei Nullen dargestellt werden
    • Ein Quader hat immer alle Dimensionen ungleich Null.
  • Die Ausgabe sollte eine einzelne Dezimalzahl sein
    • Zusätzliche Ausgaben werden akzeptiert, solange die Antwort offensichtlich ist
    • Die Ausgabe muss mindestens zwei Nachkommastellen haben
    • Die Ausgabe kann in Standardform oder in wissenschaftlicher Notation erfolgen, wenn die Anzahl größer als 1000 ist.
    • Falls Ihre Sprache keine Pi-Konstante hat, sollte die Antwort auf 9999,99 genau sein.

Beispiele:

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

Bestenliste

Das Stapel-Snippet am Ende dieses Beitrags generiert den Katalog aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamt-Bestenliste.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

## Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:

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


3
Bekommt keine Dame einen Hut in eine dieser lustigen zylindrischen Schachteln ?
Handarbeit

2
@manatwork, nein, alle Damen werden Bowlerhüte bekommen, und Sie können diese leicht in eine Kugel passen = P
Stewie Griffin

1
Ich nehme an, das (5)ist nur ein Teilbeispiel und unser Code muss nur damit umgehen ((5)).
Handarbeit

2
Wenn unsere gewählte Sprache keine Pi-Konstante hat, wie viel Präzision ist erforderlich?
Dennis

1
@manatwork, + und * sind OK, solange sie nicht Addition und Multiplikation (oder andere Operationen) in der von Ihnen verwendeten Sprache bedeuten.
Stewie Griffin

Antworten:


10

Jelly , 19 18 Bytes

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

Probieren Sie es online!

Leider hat Jelly noch keine π- Konstante und der Vektorisierer behandelt Floats nicht richtig.

Um diese Probleme zu überwinden, multiplizieren wir nicht mit 4π / 3 , sondern mit 1420 und dividieren durch 339 . Da 1420 ÷ 339 = 4,18879056… und 4π / 3 = 4,18879020… , ist dies ausreichend genau, um die Regeln einzuhalten.

Die neueste Version von Jelly könnte diese Aufgabe in 14 Bytes mit besserer Präzision erledigen .

Zµ*3×240°Ḣo@PS

Probieren Sie es online!

Wie es funktioniert

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.

In der nicht konkurrierenden Version wird ×240°stattdessen verwendet ×1420÷339, was sich mit 240 multipliziert und die Produkte in Bogenmaß umwandelt.


9

Haskell, 40 Bytes

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

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

So funktioniert es: Für jedes Element der Eingabeliste: Wenn es ein einzelnes Element enthält, xberechnen Sie das Volumen der Kugel product. Fass es zusammen.


1
Ist diese Art des Zählens von Bytes allgemein gültig? Ich hätte gesagt p=sum.map q(und dann gesagt, pauf einer Liste von Listen von Zahlen zu verwenden)
Leif Willerts

1
@LeifWillerts: Es gibt ein aktuelles Thema zu Meta, das unbenannte Funktionen ermöglicht, die auf globalen Definitionen basieren . sum.map qist eine unbenannte Funktion, die davon abhängt q, also denke ich, dass es in Ordnung ist.
nimi

9

Pyth, 19 18 Bytes

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

1 Byte danke an Dennis

Demonstration

Das Eingabeformat ist eine Liste von Listen:

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

Die Dimensionen werden einfach multipliziert, um das Würfelvolumen zu berechnen. Wenn dies zu Null wird, wird das Kugelvolumen berechnet.

Die Kugelkonstante 4/3*piwird mit 240 Grad im Bogenmaß berechnet. .t ... 7konvertiert eine Eingabe in Grad in Bogenmaß und C\ðberechnet den Codepunkt von ð240.


7

Python 2, 86-70 Bytes

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

Ich bekomme deine Byteanzahl als 86, wie bist du zu deiner gekommen?
wnnmaw

Außerdem können Sie Bytes sparen, indem Sie einfach manuell einen Wert für pi 3.14159265358979323
eingeben.

@wnnmaw Ich habe vergessen, den Import -.-
TFeld

Ich glaube, Ihr fester Wert für pi ist ein bisschen
falsch

4
@ Wnnmaw Das ist nicht Pi; es ist 4Pi / 3.
Dennis

5

Mathematica, 34 Bytes

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

Eine unbenannte Funktion, die eine verschachtelte Liste von Längen annimmt und das Volume als reelle Zahl zurückgibt.

Wir ersetzen zunächst einzelne Werte durch das Volumen der entsprechenden Kugel mit /.{r_}:>{4r^3/3Pi}. Dann multiplizieren wir den Inhalt jeder Liste mit 1.##&@@@. Schließlich berechnen wir die Summe als die Spur des Vektors mit 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

Die sinnvollere .reduce Version ist 1 Byte länger

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

Sie könnten ein paar Bytes einsparen, indem Sie 4.11879anstelle von verwenden 4/3*Math.PI, da dies genau genug sein sollte, um sich zu qualifizieren.
ETHproductions

@ETHproductions ja, aber In case your language doesn't have a Pi-constant,und meine Sprache hat eine PI-Konstante, so dass ich nicht weiß, ob es qualifiziert ist
edc65

5

Python, 49 Bytes

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

Verwendet die Darstellung von Kugeln als (a,0,0). Als Quader behandelt, hat dieser das Volumen 0, in diesem Fall wird stattdessen das Kugelvolumen verwendet. Mir ist nicht klar, wie genau die Konstante sein muss, also hoffe ich, dass dies ausreicht.


4

MATL , 20 Bytes

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

Das Eingabeformat ist eine Matrix, in der jede Zeile einen Würfel oder eine Kugel beschreibt. Eine Kugel wird nur durch die erste Zahl in dieser Zeile definiert. Die anderen beiden Zahlen sind Null. Das erste Beispiel für die Herausforderung wäre also:

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

Hierbei wird die aktuelle Version der Sprache 2.0.2 verwendet , die älter als diese Herausforderung ist.

Beispiele:

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

Erläuterung:

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 Bytes

Code:

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

Erklärt:

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

Beispiele:

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

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

Probieren Sie es hier online aus

Bearbeiten: 15 Bytes durch Definieren eines dyadischen Prädikats gespeichert.


3

Perl, 52 47 Bytes

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

46 + 1 für -p(das war üblich; lass es mich wissen, wenn es hier anders ist und ich aktualisiere)

Verwendung: in eine Datei einfügen und echo 1,4,3 2,2,2 3 4,4,4 | perl -p x.pl

Mit Kommentaren:

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 Danke an @Dennis für das Speichern einiger Bytes mit diesem Trick .


s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g;}{spart ein paar Bytes.
Dennis

@ Tennis Danke! Ich habe es zuvor mit $ \ versucht, aber das Zurücksetzen hat $_genauso viel gekostet. Immer noch unklar, warum $_in einem neuen Block zurückgesetzt wird$_ block-local in while(<>){}?
Kenney

Ja, $_ist die Standardvariable des aktuellen Bereichs. Im END-Block ist es undefiniert.
Dennis

2

CJam, 24 21 Bytes

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

Teste es hier.

Erläuterung

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

Hier passiert schwarze Magie. Ich werde versuchen, reibungslos durchzugehen.

Wir nehmen zuerst unsere Eingabe, die wir als einzelne durch Kommas getrennte Arrays erwarten (1,4,3) (2,2,2) (3) (4,4,4), und leiten sie in eine Schleife |%{}.

In der Schleife prüfen wir zunächst, ob $_das betreffende Array nur ein einziges Element enthält, und indizieren es dann in ein Array (im Wesentlichen eine kürzere if / else-Konstruktion). Wenn es sich um mehrere Elemente handelt, nehmen Sie an(1,4,3) als Eingabe an, dass wir die erste Hälfte ausführen, bei der das Array einfach ausgespuckt wird $_, z (1,4,3). Andernfalls erstellen wir ein neues dynamisches Array, das aus dem Element dreimal besteht, (,$_*3)und nähern uns 4/3 * Pi. Bei der Eingabe (3)führt dies zur (3,3,3,4.18879)Ausgabe.

Ja, PowerShell verfügt über eine Pi-Konstante, auf die über einen .NET-Aufruf zugegriffen werden kann. Diese [math]::PIist jedoch länger und ich möchte sie nicht verwenden. : p

Unabhängig davon verketten wir dieses Ausgabearray mit Sternchen über -join'*' , also "1*4*3". Sobald wir die Schleife vollständig durchlaufen haben, haben wir jetzt eine Sammlung von Zeichenfolgen. Wir -join'+'alle zusammen für unsere Addition und iexden Ausdruck, um das Ergebnis zu berechnen.

Puh.


1

Ruby, 58 Zeichen

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

Probelauf:

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 Zeichen

Verbesserungsidee schamlos aus der JavaScript-Antwort von edc65 gestohlen .

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

Probelauf:

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 Bytes

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

Übernimmt Eingaben als durch Leerzeichen getrennte Arrays. Probieren Sie es online!

Wie es funktioniert

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 Bytes

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

Es gibt verschiedene Möglichkeiten, dieses Programm zu unterstützen. Jedes Geschenk kann als Befehlszeilenargument für drei durch Leerzeichen getrennte Zahlen verwendet werden (die in Anführungszeichen eingeschlossen werden müssen:) pip.py present.pip "1 4 3" "3 0 0". -rGeben Sie alternativ das Flag an und geben Sie jedes Geschenk als Standardzeile an, die aus drei durch Leerzeichen getrennten Zahlen besteht. Probieren Sie es online!

Wie?

                         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 Bytes

Führen Sie mit -pin der Befehlszeile aus und geben Sie mit einem Komma getrennte Zahlen wie folgt ein:

5,0,0 oder (5,0,0)

würde produzieren

523.598820058997

Es gibt kein piSchlüsselwort in Perl. In den meisten Fällen stimmt dies mit den angegebenen signifikanten Zahlen überein. Selbst wenn ich alle mir bekannten Zahlen von pi eingetippt hätte, wäre dies für einige Berechnungen nicht sehr genau. Also habe ich es mit gelassen3.1415 . Ich bin mir nicht sicher, ob dies akzeptabel ist oder nicht.

Code:

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

Bearbeitet für mehr Präzision nach dem Rat von Dennis, der besser in Grundrechenarten als ich ist, und nach einem Vorschlag von MichaelT, Bytes zu sparen und dabei präzise zu bleiben.


2
1. Wie würden Sie analysieren 1511? 2. 3.1415 ist weder richtig noch ausreichend genau gerundet. Wenn meine Berechnungen korrekt sind, darf der Fehler nicht größer als 0,0000017 sein . 3. (4/3)*3.1415kann durch einen einzigen Schwimmer ersetzt werden.
Dennis

1. Das OP besagt, dass wir für Sphären nachgestellte Nullen annehmen können (das ist in der Tat die von mir bereitgestellte Beispieleingabe). 2. Ich weiß nicht, welche Berechnungen Sie verwenden, aber sicher, ich werde die Genauigkeit erhöhen. Und 3 guter Vorschlag, den habe ich verpasst. Vielen Dank!
Codefun64

Ich habe im Moment nicht die Ressourcen vor mir, obwohl ich mich frage, ob 1420/339Ihnen dies ein paar Bytes mit einer vernünftigen Annäherung zurückgeben würde. (Dies ist 4/3 * 355/113). Der Unterschied zwischen dem Bruch und dem Wert, den Sie haben, ist -8.49130615e-8

@MichaelT Das ist das Interessanteste. Haben Sie ein Skript, das die kleinste gebrochene Darstellung von Zahlen findet? ;)
Codefun64

Codefun64 Ich habe gerade von der anderen gebräuchlichen Näherung für pi abgearbeitet . 22/7 nicht innerhalb genug Toleranz, so dass ich auf einen Blick en.wikipedia.org/wiki/Approximations_of_%CF%80 ein die nächsten verwendet , um zu sehen , ob es eine Toleranz besser war als das, was @ Dennis für bittet.

0

Lua, 115 104 Bytes

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

Einfache Lösung, ich muss die pseudoternäre Operation <condition> and <non-false> or <value if false>in Klammern setzen, sonst würde b mit beiden Bereichen summieren.

Die Eingabe muss in der Form erfolgen array={{1,4,3},{2,2,2},{3},{4,4,4}}und das Ergebnis kann durch Ausführen von angezeigt werden print(f(array)).


0

05AB1E , 18 16 Bytes

εDgi3m4žq*3/*]PO

Probieren Sie es online aus.

Erläuterung:

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

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

Verwendet Standardargumente, um zwischen den Fällen zu wechseln: Mit drei Argumenten wird das Produkt berechnet, und mit einem Argument wird die Kugelformel berechnet.


brauchst du das f<-und das {}?
Giuseppe

Dieser Code wird für den Testfall nicht korrekt ausgegeben (5,0,0). Außerdem wird der Testfall nicht berücksichtigt, bei dem mehrere Geschenke vorhanden sind und die Volumina summiert werden müssen.
Robert S.

Für (5,0,0) bekomme ich Null - stimmt das nicht? Für die Verwendung bearbeitet sum(und einige Dinge entfernt, die laut Giuseppes Vorschlag nicht erforderlich waren)
JDL
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.