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 N
ist 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
var QUESTION_ID=67027,OVERRIDE_USER=44713;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
(5)
ist nur ein Teilbeispiel und unser Code muss nur damit umgehen((5))
.Antworten:
Jelly ,
1918 BytesProbieren 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 .
Probieren Sie es online!
Wie es funktioniert
In der nicht konkurrierenden Version wird
×240°
stattdessen verwendet×1420÷339
, was sich mit 240 multipliziert und die Produkte in Bogenmaß umwandelt.quelle
Haskell, 40 Bytes
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,
x
berechnen Sie das Volumen der Kugelproduct
. Fass es zusammen.quelle
p=sum.map q
(und dann gesagt,p
auf einer Liste von Listen von Zahlen zu verwenden)sum.map q
ist eine unbenannte Funktion, die davon abhängtq
, also denke ich, dass es in Ordnung ist.Pyth,
1918 Bytes1 Byte danke an Dennis
Demonstration
Das Eingabeformat ist eine Liste von Listen:
Die Dimensionen werden einfach multipliziert, um das Würfelvolumen zu berechnen. Wenn dies zu Null wird, wird das Kugelvolumen berechnet.
Die Kugelkonstante
4/3*pi
wird mit 240 Grad im Bogenmaß berechnet..t ... 7
konvertiert eine Eingabe in Grad in Bogenmaß undC\ð
berechnet den Codepunkt vonð
240.quelle
Python 2,
86-70Bytesquelle
3.14159265358979323
Mathematica, 34 Bytes
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 mit1.##&@@@
. Schließlich berechnen wir die Summe als die Spur des Vektors mitTr[...]
.quelle
JavaScript (ES6), 56
Die sinnvollere
.reduce
Version ist 1 Byte längerquelle
4.11879
anstelle von verwenden4/3*Math.PI
, da dies genau genug sein sollte, um sich zu qualifizieren.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 istPython, 49 Bytes
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.quelle
MATL , 20 Bytes
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:
Hierbei wird die aktuelle Version der Sprache 2.0.2 verwendet , die älter als diese Herausforderung ist.
Beispiele:
Erläuterung:
quelle
Prolog,
115100 BytesCode:
Erklärt:
Beispiele:
Probieren Sie es hier online aus
Bearbeiten: 15 Bytes durch Definieren eines dyadischen Prädikats gespeichert.
quelle
Perl,
5247 Bytes46 + 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:
update 47 Danke an @Dennis für das Speichern einiger Bytes mit diesem Trick .
quelle
s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g;}{
spart ein paar Bytes.$_
genauso viel gekostet. Immer noch unklar, warum$_
in einem neuen Block zurückgesetzt wird$_
block-local inwhile(<>){}
?$_
ist die Standardvariable des aktuellen Bereichs. Im END-Block ist es undefiniert.CJam,
2421 BytesTeste es hier.
Erläuterung
quelle
PowerShell, 67 Bytes
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]::PI
ist jedoch länger und ich möchte sie nicht verwenden. : pUnabhä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 undiex
den Ausdruck, um das Ergebnis zu berechnen.Puh.
quelle
Ruby, 58 Zeichen
Probelauf:
Ruby, 50 Zeichen
Verbesserungsidee schamlos aus der JavaScript-Antwort von edc65 gestohlen .
Probelauf:
quelle
Japt,
2722 BytesÜbernimmt Eingaben als durch Leerzeichen getrennte Arrays. Probieren Sie es online!
Wie es funktioniert
quelle
R , 70 Bytes
Probieren Sie es online!
quelle
Pip , 23 Bytes
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"
.-r
Geben 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?
quelle
Perl 5, 142 Bytes
Führen Sie mit
-p
in 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
pi
Schlü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:
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.
quelle
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.1415
kann durch einen einzigen Schwimmer ersetzt werden.1420/339
Ihnen 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-8Lua,
115104 BytesEinfache 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 werdenprint(f(array))
.quelle
05AB1E ,
1816 BytesProbieren Sie es online aus.
Erläuterung:
quelle
R,
3836 BytesVerwendet Standardargumente, um zwischen den Fällen zu wechseln: Mit drei Argumenten wird das Produkt berechnet, und mit einem Argument wird die Kugelformel berechnet.
quelle
f<-
und das{}
?(5,0,0)
. Außerdem wird der Testfall nicht berücksichtigt, bei dem mehrere Geschenke vorhanden sind und die Volumina summiert werden müssen.sum
(und einige Dinge entfernt, die laut Giuseppes Vorschlag nicht erforderlich waren)