Sim, como muito , não quantas ...
Como todos sabemos, um presente grande é muito melhor que um pequeno. Portanto, o valor dos presentes sempre deve ser medido em volume total, não em número de presentes, peso ou mesmo preço combinado.
Como é desajeitado comparar a quantidade de presentes que se recebe, você não quer um longo script que seja facilmente visto e lido por outras pessoas na festa de Natal. Portanto, você precisa manter o número de bytes em seu script no mínimo.
Sua tarefa é simples: crie um programa que obtenha uma lista de dimensões como entrada, em qualquer formato adequado, e produz o volume combinado de seus presentes. A dimensão de cada presente será um conjunto de três números ou um único número. Se a entrada tiver três números ( L, W, H
), o presente será um cubo de dimensões L x W x H
. Se for um número único ( R
), o presente é uma esfera de raio R
.
Regras:
- Pode ser um programa completo ou uma função
- A entrada pode estar em qualquer formato conveniente
- Se desejável, uma esfera pode ser representada por um número seguido por dois zeros
- Um cubóide sempre terá todas as dimensões diferentes de zero.
- A saída deve ser um único número decimal
- Saída adicional é aceita, desde que seja óbvio qual é a resposta
- A saída deve ter pelo menos dois dígitos após o ponto decimal
- A saída pode estar na forma padrão / notação científica se o número for maior que 1000.
- Caso seu idioma não tenha uma constante Pi, a resposta deve ser precisa até 9999,99.
Exemplos:
((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
Entre os melhores
O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
## [><>](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)
é apenas um exemplo parcial e nosso código só precisa lidar((5))
.Respostas:
Geléia ,
1918 bytesExperimente online!
Infelizmente, o Jelly ainda não possui uma constante π , e o vetorizador não manipula os flutuadores corretamente.
Para superar esses problemas, em vez de multiplicar por 4π / 3 , multiplicamos por 1420 e dividimos por 339 . Como 1420 ÷ 339 = 4,18879056… e 4π / 3 = 4,18879020… , isso é suficientemente preciso para cumprir as regras.
A versão mais recente do Jelly poderia realizar essa tarefa em 14 bytes , com melhor precisão.
Experimente online!
Como funciona
A versão não concorrente usa em
×240°
vez de×1420÷339
, que multiplica por 240 e converte os produtos em radianos.fonte
Haskell, 40 bytes
Exemplo de uso:
sum.map q $ [[1,4,3],[2,2,2],[3],[4,4,4]]
->197.09733552923254
.Como funciona: Para cada elemento da lista de entrada: se ele tiver um único elemento,
x
calcule o volume da esfera, então pegue oproduct
. Resumir.fonte
p=sum.map q
(e, em seguida, disse para usop
em uma lista de listas de números)sum.map q
é uma função sem nome que dependeq
, então eu acho que está bem.Pitão,
1918 bytes1 byte graças a Dennis
Demonstração
O formato de entrada é uma lista de listas:
Simplesmente multiplica as dimensões para calcular o volume do cubo. Se isso der zero, calcula o volume da esfera.
A constante da esfera
4/3*pi
é calculada como 240 graus em radianos..t ... 7
converte uma entrada em graus em radianos eC\ð
calcula o ponto de código deð
, que é 240.fonte
Python 2,
8670 bytesfonte
3.14159265358979323
Mathematica, 34 bytes
Uma função sem nome que pega uma lista aninhada de comprimentos e retorna o volume como um número real.
Primeiro, substituímos valores únicos pelo volume da esfera correspondente por
/.{r_}:>{4r^3/3Pi}
. Em seguida, multiplicamos o conteúdo de cada lista com1.##&@@@
. Finalmente, calculamos a soma como o traço do vetor comTr[...]
.fonte
JavaScript (ES6), 56
A versão mais sensata
.reduce
é 1 byte maisfonte
4.11879
no lugar de4/3*Math.PI
, pois isso deve ser preciso o suficiente para se qualificar.In case your language doesn't have a Pi-constant,
e minha língua tem uma constante PI, então eu não sei se ela se qualificaPython, 49 bytes
Usa a representação de esferas como
(a,0,0)
. Tratado como um cuboide, ele possui o volume 0; nesse caso, o volume da esfera é usado. Não sei ao certo quão precisa é a constante, por isso espero que isso seja suficiente.fonte
MATL , 20 bytes
O formato de entrada é uma matriz na qual cada linha descreve um cubo ou uma esfera. Uma esfera é definida apenas pelo primeiro número nessa linha; os outros dois números são zero. Portanto, o primeiro exemplo do desafio seria:
Isso usa a versão atual do idioma, 2.0.2 , que é anterior a esse desafio.
Exemplos:
Explicação:
fonte
Prolog,
115100 bytesCódigo:
Explicado:
Exemplos:
Experimente online aqui
Editar: salvou 15 bytes, definindo um predicado diádico.
fonte
Perl,
5247 bytes46 + 1 para
-p
(isso tem sido comum; deixe-me saber se é diferente aqui e eu atualizarei)Uso: coloque em um arquivo e
echo 1,4,3 2,2,2 3 4,4,4 | perl -p x.pl
Com comentários:
atualização 47 Obrigado a @Dennis por salvar alguns bytes usando este truque .
fonte
s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g;}{
salva alguns bytes.$_
custo tanto. Ainda não está claro por que$_
é redefinido em um novo bloco. O$_
local do bloco está ativadowhile(<>){}
?$_
é a variável padrão do escopo atual. No bloco END, é indefinido.CJam,
2421 bytesTeste aqui.
Explicação
fonte
PowerShell, 67 bytes
Alguma magia negra acontecendo aqui. Vou tentar passar por isso sem problemas.
Primeiro, pegamos nossa entrada, esperada como matrizes individuais separadas por vírgula
(1,4,3) (2,2,2) (3) (4,4,4)
, por exemplo , e colocamos isso em um loop|%{}
.Dentro do loop, primeiro verificamos se
$_
, a matriz em particular que estamos considerando, possui apenas um item e a usamos para indexar em uma matriz (essencialmente uma construção if / else mais curta). Se houver mais de um item, suponha(1,4,3)
como entrada, executamos a primeira metade, que é simplesmente cuspir a matriz via$_
, como(1,4,3)
. Caso contrário, criamos uma nova matriz dinâmica que consiste no elemento três vezes com(,$_*3)
e aproximamos uma aproximação de 4 / 3rd * Pi. Para entrada(3)
, isso resultará em(3,3,3,4.18879)
saída.Sim, o PowerShell tem uma constante Pi, acessada via chamada .NET
[math]::PI
, mas é mais longa e não quero usá-la. : pIndependentemente disso, concatenamos essa matriz de saída com asteriscos via
-join'*'
, então"1*4*3"
. Depois que passamos completamente pelo loop, agora temos uma coleção de strings. Todos nós-join'+'
juntos para nossa adição eiex
a expressão para calcular o resultado.Ufa.
fonte
Ruby, 58 caracteres
Exemplo de execução:
Ruby, 50 caracteres
Ideia melhoria descaradamente roubado de edc65 's resposta JavaScript .
Exemplo de execução:
fonte
Japonês,
2722 bytesRecebe entrada como matrizes separadas por espaço. Experimente online!
Como funciona
fonte
R , 70 bytes
Experimente online!
fonte
Pip , 23 bytes
Existem algumas maneiras de dar entrada neste programa. Pode levar cada presente como um argumento da linha de comando de três números separados por espaço (que precisarão ser colocados entre aspas:)
pip.py present.pip "1 4 3" "3 0 0"
. Como alternativa, especifique o-r
sinalizador e dê a cada presente como uma linha de stdin composta por três números separados por espaço. Experimente online!Quão?
fonte
Perl 5, 142 bytes
Execute
-p
na linha de comando e digite os números delimitados por vírgula, assim:5,0,0
ou(5,0,0)
produziria
523.598820058997
Não há
pi
palavras-chave no Perl. Isso é, na maioria dos casos, preciso para os números significativos especificados, no entanto, mesmo se eu digitar todos os números de pi que eu conheço, não seria muito preciso para alguns cálculos. Então eu deixei com3.1415
. Não tenho certeza se isso é aceitável ou não.Código:
Editado para maior precisão, seguindo o conselho de Dennis, que é melhor em matemática básica do que eu, e de uma sugestão de MichaelT para salvar bytes, mantendo-se preciso.
fonte
1511
? 2. 3.1415 não é arredondado de forma adequada nem suficientemente precisa. Se meus cálculos estiverem corretos, o erro não deve ser maior que 0,0000017 . 3.(4/3)*3.1415
pode ser substituído por um único flutuador.1420/339
lhe daria alguns bytes de volta com uma aproximação razoável. (este é 4/3 * 355/113). A diferença entre a fração e o valor que você tem é -8.49130615e-8 #Lua,
115104 bytesSolução direta, eu tenho que envolver a operação pseudo-ternária
<condition> and <non-false> or <value if false>
entre parênteses, caso contrário b somaria com ambas as áreas.A entrada deve estar no formato
array={{1,4,3},{2,2,2},{3},{4,4,4}}
e o resultado pode ser visto executandoprint(f(array))
.fonte
05AB1E ,
1816 bytesExperimente online.
Explicação:
fonte
R,
3836 bytesUsa argumentos padrão para alternar entre os casos: com três argumentos calcula o produto e com um argumento calcula a fórmula da esfera.
fonte
f<-
e do{}
?(5,0,0)
. Além disso, ele não acomoda o caso de teste em que há vários presentes e os volumes precisam ser somados.sum
(e removido algumas coisas que não era necessário por sugestão de Giuseppe)