Sí, cómo mucho , no es cuántos ...
Como todos sabemos, un regalo grande es mucho mejor que uno pequeño. Por lo tanto, el valor de los regalos siempre debe medirse en volumen total, no en número de regalos, peso o incluso precio combinado.
Como está mal visto comparar la cantidad de regalos que uno recibe, no querrás un guión largo que otros puedan ver y leer fácilmente en la fiesta de Navidad. Por lo tanto, debe mantener el número de bytes en su script como mínimo.
Su tarea es simple: cree un programa que tome una lista de dimensiones como entrada, en cualquier formato adecuado, y genere el volumen combinado de sus regalos. La dimensión de cada presente será un conjunto de tres números o un solo número. Si la entrada es tres números ( L, W, H
), el presente es un cuboide de dimensiones L x W x H
. Si es un solo número ( R
), el presente es una esfera de radio R
.
Reglas:
- Puede ser un programa completo o una función
- La entrada puede estar en cualquier formato conveniente
- Si es deseable, una esfera puede estar representada por un número seguido de dos ceros
- Un cuboide siempre tendrá todas las dimensiones distintas de cero.
- La salida debe ser un solo número decimal
- Se acepta salida adicional siempre que sea obvio cuál es la respuesta
- La salida debe tener al menos dos dígitos después del punto decimal
- La salida puede estar en forma estándar / notación científica si el número es mayor que 1000.
- En caso de que su idioma no tenga una constante Pi, la respuesta debe ser precisa hasta 9999.99.
Ejemplos:
((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
Tabla de clasificación
El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
## [><>](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)
es solo un ejemplo parcial y nuestro código solo tiene que manejar((5))
.Respuestas:
Jalea ,
1918 bytesPruébalo en línea!
Desafortunadamente, Jelly aún no tiene una constante π , y el vectorizador no maneja los flotadores correctamente.
Para superar estos problemas, en lugar de multiplicar por 4π / 3 , multiplicamos por 1420 y dividimos por 339 . Desde 1420 ÷ 339 = 4.18879056 ... y 4π / 3 = 4.18879020 ... , esto es lo suficientemente preciso para cumplir con las reglas.
La versión más nueva de Jelly podría realizar esta tarea en 14 bytes , con mayor precisión.
Pruébalo en línea!
Cómo funciona
La versión no competitiva usa en
×240°
lugar de×1420÷339
, que se multiplica por 240 y convierte los productos a radianes.fuente
Haskell, 40 bytes
Ejemplo de uso:
sum.map q $ [[1,4,3],[2,2,2],[3],[4,4,4]]
->197.09733552923254
.Cómo funciona: Para cada elemento de la lista de entrada: si tiene un solo elemento,
x
calcule el volumen de la esfera, de lo contrario tome elproduct
. Añádelo.fuente
p=sum.map q
(y luego le dije que lo usarap
en una lista de listas de números)sum.map q
es una función sin nombre que dependeq
, así que supongo que está bien.Pyth,
1918 bytes1 byte gracias a Dennis
Demostración
El formato de entrada es una lista de listas:
Simplemente multiplica las dimensiones para calcular el volumen del cubo. Si eso sale a cero, calcula el volumen de la esfera.
La constante de esfera,
4/3*pi
se calcula como 240 grados en radianes..t ... 7
convierte una entrada en grados a radianes yC\ð
calcula el punto de código deð
, que es 240.fuente
Python 2,
8670 bytesfuente
3.14159265358979323
Mathematica, 34 bytes
Una función sin nombre que toma una lista anidada de longitudes y devuelve el volumen como un número real.
Primero reemplazamos los valores individuales con el volumen de la esfera correspondiente con
/.{r_}:>{4r^3/3Pi}
. Luego multiplicamos el contenido de cada lista con1.##&@@@
. Finalmente calculamos la suma como la traza del vector conTr[...]
.fuente
JavaScript (ES6), 56
La versión más sensata
.reduce
es 1 byte más largafuente
4.11879
en lugar de4/3*Math.PI
, ya que eso debería ser lo suficientemente preciso como para calificar.In case your language doesn't have a Pi-constant,
mi lenguaje tiene una constante PI, así que no sé si calificaPython, 49 bytes
Utiliza la representación de esferas como
(a,0,0)
. Si se trata como un cuboide, tiene el volumen 0, en cuyo caso se usa el volumen de la esfera. No tengo claro qué tan precisa debe ser la constante, así que espero que sea suficiente.fuente
MATL , 20 bytes
El formato de entrada es una matriz en la que cada fila describe un cubo o una esfera. Una esfera se define solo por el primer número de esa fila; Los otros dos números son cero. Entonces, el primer ejemplo del desafío sería:
Utiliza la versión actual del lenguaje 2.0.2 , que es anterior a este desafío.
Ejemplos:
Explicación:
fuente
Prolog,
115100bytesCódigo:
Explicado:
Ejemplos:
Pruébalo en línea aquí
Editar: ahorró 15 bytes definiendo un predicado diádico.
fuente
Perl,
5247 bytes46 + 1 para
-p
(eso ha sido común; avíseme si es diferente aquí y lo actualizaré)Uso: poner en un archivo y
echo 1,4,3 2,2,2 3 4,4,4 | perl -p x.pl
Con comentarios:
actualización 47 Gracias a @Dennis por guardar algunos bytes usando este truco .
fuente
s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g;}{
Guarda algunos bytes.$_
costo tanto. Sin embargo, todavía no está claro por qué$_
se restablece en un nuevo bloque. ¿Está$_
bloqueado localwhile(<>){}
?$_
es la variable predeterminada del alcance actual. En el bloque END, no está definido.CJam,
2421 bytesPruébalo aquí.
Explicación
fuente
PowerShell, 67 bytes
Un poco de magia negra sucediendo aquí. Trataré de atravesarlo sin problemas.
Primero tomamos nuestra entrada, esperada como matrices individuales delimitadas por comas, por ejemplo
(1,4,3) (2,2,2) (3) (4,4,4)
, y la canalizamos en un bucle|%{}
.Dentro del ciclo, primero verificamos si
$_
, la matriz particular que estamos considerando, tiene solo un elemento y lo usamos para indexar en una matriz (esencialmente una construcción if / else más corta). Si es más de un elemento, supongamos que(1,4,3)
como entrada, ejecutamos la primera mitad, que es simplemente escupir la matriz a través de$_
, como(1,4,3)
. De lo contrario, creamos una nueva matriz dinámica que consiste en el elemento tres veces con(,$_*3)
una aproximación de 4/3 * Pi. Para la entrada(3)
, esto dará como resultado la(3,3,3,4.18879)
salida.Sí, PowerShell tiene una constante Pi, a la que se accede mediante una llamada .NET
[math]::PI
, pero es más larga y no quiero usarla. :pagsDe todos modos, concatenamos esa matriz de salida con asteriscos vía
-join'*'
, entonces"1*4*3"
. Una vez que hemos pasado por completo el ciclo, ahora tenemos una colección de cadenas. Todos-join'+'
juntos para nuestra suma, yiex
la expresión para calcular el resultado.Uf.
fuente
Ruby, 58 caracteres.
Ejecución de muestra:
Ruby, 50 caracteres.
Idea de mejora robada descaradamente de la respuesta JavaScript de edc65 .
Ejecución de muestra:
fuente
Japt,
2722 bytesToma datos como matrices separadas por espacios. Pruébalo en línea!
Cómo funciona
fuente
R , 70 bytes
Pruébalo en línea!
fuente
Pip , 23 bytes
Hay un par de formas de dar su opinión a este programa. Puede tomar cada presente como un argumento de línea de comandos de tres números separados por espacios (que deberán estar entre comillas
pip.py present.pip "1 4 3" "3 0 0"
). Alternativamente, especifique la-r
bandera y dé a cada presente como una línea de stdin que consta de tres números separados por espacios. Pruébalo en línea!¿Cómo?
fuente
Perl 5, 142 bytes
Ejecute con
-p
en la línea de comando y escriba números delimitados con una coma, así:5,0,0
o(5,0,0)
produciría
523.598820058997
No hay
pi
palabra clave en Perl. Esto, en la mayoría de los casos, es exacto para las cifras significativas especificadas, sin embargo, incluso si escribí todas las cifras de pi que conozco, no sería muy preciso para algunos cálculos. Entonces lo dejé con3.1415
. No estoy seguro de si esto es aceptable o no.Código:
Editado para una mayor precisión siguiendo el consejo de Dennis, que es mejor en matemáticas básicas que yo, y de una sugerencia de MichaelT para guardar bytes sin dejar de ser preciso.
fuente
1511
? 2. 3.1415 no se redondea adecuadamente ni es lo suficientemente precisa. Si mis cálculos son correctos, el error no debe ser mayor que 0.0000017 . 3.(4/3)*3.1415
se puede reemplazar con un solo flotador.1420/339
le devolvería unos pocos bytes con una aproximación razonable. (Esto es 4/3 * 355/113). La diferencia entre la fracción y el valor que tiene es -8.49130615e-8Lua,
115104bytesSolución directa, tengo que envolver la operación pseudoternaria
<condition> and <non-false> or <value if false>
entre paréntesis, de lo contrario b sumaría con ambas áreas.La entrada debe estar en el formulario
array={{1,4,3},{2,2,2},{3},{4,4,4}}
y el resultado se puede ver ejecutandoprint(f(array))
.fuente
05AB1E ,
1816 bytesPruébalo en línea.
Explicación:
fuente
R,
3836 bytesUtiliza argumentos predeterminados para cambiar entre los casos: con tres argumentos calcula el producto y con un argumento calcula la fórmula de la esfera.
fuente
f<-
y el{}
?(5,0,0)
. Además, no se adapta al caso de prueba donde hay múltiples regalos y los volúmenes deben sumarse.sum
(y eliminé algunas cosas que no eran necesarias según la sugerencia de Giuseppe)