Oui, combien plus , pas combien ...
Comme nous le savons tous, un grand cadeau est bien meilleur qu'un petit. Par conséquent, la valeur des cadeaux doit toujours être mesurée en volume total et non en nombre de cadeaux, en poids ou même en prix combiné.
Comme il est mal vu de comparer la quantité de cadeaux que l'on reçoit, vous ne voulez pas d'un long script facilement visible et lisible par les autres lors de la fête de Noël. Par conséquent, vous devez conserver le nombre d'octets dans votre script au minimum.
Votre tâche est simple: créez un programme qui prend une liste de dimensions en entrée, sur n'importe quel format approprié, et sort le volume combiné de vos cadeaux. La dimension de chaque cadeau sera soit un ensemble de trois nombres, soit un seul nombre. Si l'entrée est composée de trois nombres ( L, W, H
), le présent est un cuboïde de dimensions L x W x H
. S'il s'agit d'un seul nombre ( R
), le présent est une sphère de rayon R
.
Règles:
- Il peut s'agir d'un programme complet ou d'une fonction
- L'entrée peut être dans n'importe quel format pratique
- Si cela est souhaitable, une sphère peut être représentée par un nombre suivi de deux zéros
- Un cuboïde aura toujours toutes les dimensions non nulles.
- La sortie doit être un seul nombre décimal
- Une sortie supplémentaire est acceptée tant qu'il est évident quelle est la réponse
- La sortie doit avoir au moins deux chiffres après le point décimal
- La sortie peut être sous forme standard / notation scientifique si le nombre est supérieur à 1000.
- Dans le cas où votre langue n'a pas de constante Pi, la réponse doit être précise jusqu'à 9999,99.
Exemples:
((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
Classement
L'extrait de pile au bas de cet article génère le catalogue à partir des réponses a) en tant que liste des solutions les plus courtes par langue et b) en tant que classement général.
Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:
## Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs numéros dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou si vous souhaitez répertorier séparément les pénalités d'indicateur d'interprétation), assurez-vous que le score réel est le dernier numéro de l'en-tête:
## Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:
## [><>](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)
n'est qu'un exemple partiel et que notre code n'a qu'à le gérer((5))
.Réponses:
Gelée ,
1918 octetsEssayez-le en ligne!
Malheureusement, Jelly n'a pas encore de constante π et le vectoriseur ne gère pas correctement les flottants.
Pour surmonter ces problèmes, au lieu de multiplier par 4π / 3 , nous multiplions par 1420 et divisons par 339 . Puisque 1420 ÷ 339 = 4.18879056… et 4π / 3 = 4.18879020… , cela est suffisamment précis pour respecter les règles.
La dernière version de Jelly pourrait accomplir cette tâche en 14 octets , avec une meilleure précision.
Essayez-le en ligne!
Comment ça marche
La version non concurrente utilise
×240°
au lieu de×1420÷339
, qui se multiplie par 240 et convertit les produits en radians.la source
Haskell, 40 octets
Exemple d'utilisation:
sum.map q $ [[1,4,3],[2,2,2],[3],[4,4,4]]
->197.09733552923254
.Comment ça marche: Pour chaque élément de la liste d'entrée: s'il a un seul élément
x
calculer le volume de la sphère, sinon prenez leproduct
. Résumer.la source
p=sum.map q
(et ensuite dit d'utiliserp
sur une liste de listes de numéros)sum.map q
est une fonction sans nom qui dépendq
, donc je suppose que ça va.Pyth,
1918 octets1 octet merci à Dennis
Manifestation
Le format d'entrée est une liste de listes:
Il multiplie simplement les dimensions ensemble pour calculer le volume du cube. Si cela revient à zéro, il calcule le volume de la sphère.
La constante de sphère
4/3*pi
est calculée à 240 degrés en radians..t ... 7
convertit une entrée en degrés en radians etC\ð
calcule le point de code deð
, qui est 240.la source
Python 2,
8670 octetsla source
3.14159265358979323
atteindre le seuil de rentabilitéMathematica, 34 octets
Une fonction sans nom qui prend une liste imbriquée de longueurs et renvoie le volume comme un nombre réel.
Nous remplaçons d'abord les valeurs simples par le volume de la sphère correspondante avec
/.{r_}:>{4r^3/3Pi}
. Ensuite, nous multiplions le contenu de chaque liste avec1.##&@@@
. Enfin, nous calculons la somme comme la trace du vecteur avecTr[...]
.la source
JavaScript (ES6), 56
La version la plus sensible
.reduce
est 1 octet de plusla source
4.11879
à la place de4/3*Math.PI
, car cela devrait être suffisamment précis pour être qualifié.In case your language doesn't have a Pi-constant,
et ma langue a une constante PI, donc je ne sais pas si elle est admissiblePython, 49 octets
Utilise la représentation des sphères comme
(a,0,0)
. Traitée comme un cuboïde, elle a le volume 0, auquel cas le volume de la sphère est utilisé à la place. Je ne suis pas sûr de la précision de la constante, donc j'espère que cela suffit.la source
MATL , 20 octets
Le format d'entrée est une matrice dans laquelle chaque ligne décrit un cube ou une sphère. Une sphère est définie uniquement par le premier nombre de cette ligne; les deux autres nombres sont nuls. Le premier exemple du défi serait donc:
Cela utilise la version actuelle du langage, 2.0.2 , qui est antérieure à ce défi.
Exemples:
Explication:
la source
Prolog,
115100octetsCode:
A expliqué:
Exemples:
Essayez-le en ligne ici
Edit: économisé 15 octets en définissant un prédicat dyadique.
la source
Perl,
5247 octets46 + 1 pour
-p
(c'est courant; faites-moi savoir si c'est différent ici et je mettrai à jour)Utilisation: mettre dans un fichier et
echo 1,4,3 2,2,2 3 4,4,4 | perl -p x.pl
Avec commentaires:
mise à jour 47 Merci à @Dennis d' avoir enregistré quelques octets en utilisant cette astuce .
la source
s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g;}{
enregistre quelques octets.$_
coût autant. Toujours pas clair de savoir pourquoi$_
est remis à zéro dans un nouveau bloc, mais .. est -$_
bloc localwhile(<>){}
?$_
est la variable par défaut de la portée actuelle. Dans le bloc END, il n'est pas défini.CJam,
2421 octetsTestez-le ici.
Explication
la source
PowerShell, 67 octets
De la magie noire se produit ici. Je vais essayer de le parcourir en douceur.
Nous prenons d'abord notre entrée, attendue en tant que tableaux séparés par des virgules
(1,4,3) (2,2,2) (3) (4,4,4)
, par exemple , et les canalisons dans une boucle|%{}
.À l'intérieur de la boucle, nous vérifions d'abord si
$_
, le tableau particulier que nous considérons, n'a qu'un seul élément et nous l'utilisons pour indexer dans un tableau (essentiellement une construction if / else plus courte). S'il s'agit de plusieurs éléments, supposons(1,4,3)
en entrée, nous exécutons la première moitié, qui consiste simplement à cracher le tableau via$_
, comme(1,4,3)
. Sinon, nous créons un nouveau tableau dynamique composé de l'élément trois fois avec(,$_*3)
et clouant sur une approximation de 4 / 3rd * Pi. Pour l'entrée(3)
, cela se traduira par une(3,3,3,4.18879)
sortie.Oui, PowerShell a une constante Pi, accessible via un appel .NET
[math]::PI
, mais c'est plus long et je ne veux pas l'utiliser. : pQuoi qu'il en soit, nous concaténons ce tableau de sortie avec des astérisques via
-join'*'
, donc"1*4*3"
. Une fois que nous avons complètement parcouru la boucle, nous avons maintenant une collection de chaînes. Nous-join'+'
tous tous ensemble pour notre ajout, etiex
l'expression pour calculer le résultat.Phew.
la source
Ruby, 58 caractères
Échantillon échantillon:
Ruby, 50 caractères
Idée d'amélioration sans vergogne dérobée à la réponse JavaScript d' edc65 .
Échantillon échantillon:
la source
Japt,
2722 octetsPrend les entrées sous forme de tableaux séparés par des espaces. Essayez-le en ligne!
Comment ça marche
la source
R , 70 octets
Essayez-le en ligne!
la source
Pip , 23 octets
Il existe deux façons de contribuer à ce programme. Il peut prendre chaque présent comme argument de ligne de commande de trois nombres séparés par des espaces (qui devront être entourés de guillemets:)
pip.py present.pip "1 4 3" "3 0 0"
. Alternativement, spécifiez le-r
drapeau et donnez à chaque cadeau une ligne de stdin composée de trois nombres séparés par des espaces. Essayez-le en ligne!Comment?
la source
Perl 5, 142 octets
Exécutez avec
-p
dans la ligne de commande et tapez des nombres délimités par une virgule, comme ceci:5,0,0
ou(5,0,0)
produirait
523.598820058997
Il n'y a pas de
pi
mot clé en Perl. C'est, dans la plupart des cas, exacts par rapport aux chiffres significatifs spécifiés, mais même si j'ai tapé tous les chiffres de pi que je connais, ce ne serait pas très précis pour certains calculs. Alors je l'ai laissé avec3.1415
. Je ne sais pas si cela est acceptable ou non.Code:
Édité pour plus de précision sur les conseils de Dennis, qui est meilleur en mathématiques de base que moi, et sur une suggestion de MichaelT pour économiser des octets tout en restant précis.
la source
1511
? 2. 3.1415 n'est ni arrondi correctement ni suffisamment précis. Si mes calculs sont corrects, l'erreur ne doit pas être supérieure à 0,0000017 . 3.(4/3)*3.1415
peut être remplacé par un seul flotteur.1420/339
rendrait quelques octets avec une approximation raisonnable. (c'est le 4/3 * 355/113). La différence entre la fraction et la valeur que vous avez est de -8.49130615e-8Lua,
115104octetsSolution simple, je dois encapsuler l'opération pseudo-ternaire
<condition> and <non-false> or <value if false>
entre parenthèses, sinon b résumerait les deux zones.L'entrée doit être sous la forme
array={{1,4,3},{2,2,2},{3},{4,4,4}}
et le résultat peut être vu en exécutantprint(f(array))
.la source
05AB1E ,
1816 octetsEssayez-le en ligne.
Explication:
la source
R,
3836 octetsUtilise des arguments par défaut pour basculer entre les cas: avec trois arguments calcule le produit et avec un argument calcule la formule de la sphère.
la source
f<-
et du{}
?(5,0,0)
. En outre, il ne convient pas au cas de test où il y a plusieurs cadeaux et les volumes doivent être additionnés ensemble.sum
(et supprimé des éléments qui n'étaient pas nécessaires selon la suggestion de Giuseppe)