Você pode determinar o volume de objetos com base em um determinado conjunto de dimensões:
- O volume de uma esfera pode ser determinado usando um único número, o raio (
r
) - O volume de um cilindro pode ser determinado usando dois números, o raio (
r
) e a altura (h
) - O volume de uma caixa pode ser determinado usando três números, comprimento (
l
), largura (w
) e altura (h
) - O volume de uma pirâmide triangular irregular pode ser determinado usando quatro números, os comprimentos laterais (
a, b, c
) e a altura (h
).
O desafio é determinar o volume de um objeto, com uma das seguintes entradas:
- Um único número
(r)
ou(r, 0, 0, 0)
=>V = 4/3*pi*r^3
- Dois números
(r, h)
ou(r, h, 0, 0)
=>V = pi*r^2*h
- Três números
(l, w, h)
ou(l, w, h, 0)
=>V = l*w*h
- Quatro números
(a, b, c, h)
=>V = (1/3)*A*h
, ondeA
é dado pela fórmula de Heron :A = 1/4*sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c))
Regras e esclarecimentos:
- A entrada pode ser números inteiros e / ou decimais
- Você pode assumir que todas as dimensões de entrada serão positivas
- Se Pi é codificado deve ser preciso até:
3.14159
. - A saída deve ter pelo menos 6 dígitos significativos, exceto os números que podem ser representados com precisão com menos dígitos. Você pode produzir
3/4
como0.75
, mas4/3
deve ser1.33333
(mais dígitos estão OK)- Como arredondar valores imprecisos é opcional
- O comportamento para entrada inválida é indefinido
- Regras padrão para E / S. A entrada pode ser uma lista ou argumentos separados
Isso é código de golfe, então a solução mais curta em bytes vence.
Casos de teste:
calc_vol(4)
ans = 268.082573106329
calc_vol(5.5, 2.23)
ans = 211.923986429533
calc_vol(3.5, 4, 5)
ans = 70
calc_vol(4, 13, 15, 3)
ans = 24
code-golf
math
arithmetic
geometry
Stewie Griffin
fonte
fonte
Respostas:
MATL ,
57535144 bytesA entrada é uma matriz com 1, 2, 3 ou 4 números.
Experimente online!
Explicação
Em vez de usar
if
loops aninhados , que são caros em termos de bytes, isso calcula quatro resultados possíveis para qualquer entrada e escolhe o resultado apropriado, dependendo do comprimento da entrada.Ao calcular os resultados, mesmo que apenas um deles precise ser válido, os outros não podem cometer erros. Isso significa, por exemplo, que a indexação do quarto elemento da entrada não é permitida, porque a entrada pode ter menos de quatro elementos.
fonte
Vitsy, 49 bytes
Eu pensei que você me entregou este em um prato, mas achei um bug não resolvido para contornar. Não me machucou, no entanto.
Basicamente, com a entrada tendo um certo comprimento para diferentes funções, você me fornece minha sintaxe de método para fazer essas coisas. Então, sim, sucesso!
Explicação, uma linha de cada vez:
A entrada é aceita como argumentos de linha de comando no reverso exato, conforme aparecem na pergunta, sem zeros à direita.
Experimente online!
Como um aparte, aqui está algo que está atualmente em desenvolvimento.
Pacote Java com Vitsy
Observe que este pacote está em andamento; isto é apenas para mostrar como isso funcionará no futuro (a documentação para isso ainda não foi carregada) e não é jogada no golfe, e é uma tradução literal:
fonte
C,
10097 byteseditar 1: remover decimal desnecessário
.
, obrigado Immibis!fonte
4./3.
ser apenas4/3.
? E pode2.
e12.
apenas ser2
e12
?JavaScript ES6,
12912612511611490 bytesEconomizei muitos bytes (9) com uma fórmula maravilhosa, graças a Stewie Griffin! Como a entrada deve ser diferente de zero,
variable?
será suficiente para uma verificação de definição.Teste!
fonte
Uncaught SyntaxError: Unexpected token =
(referindo-seZ=a*a
)h
, o que parece um pouco de supervisão.Haskell,
11410910710199 bytesPega uma lista de números e retorna um volume. Chame como
para uma esfera, etc. A função é polimórfica para qualquer tipo que implemente
sqrt
(então, basicamenteFloat
ouDouble
).Não vai ganhar nenhum concurso por brevidade. Mas observe como é legível . Mesmo se você realmente não conhece Haskell, pode dizer o que faz com bastante facilidade. A sintaxe de correspondência de padrões de Haskell facilita muito a definição de funções estranhas que fazem algo totalmente diferente dependendo da forma da entrada.
fonte
(1/3)*(1/4)*h
,,, por que nãoh/12
? Economiza muitos bytes!.
e#
e$
torna-se Sopa Mathematica.PowerShell,
165161 bytesEntão ... Muitos ... Dólares ... (31 dos 161 caracteres representam
$
19,25% do código) ... mas salvou 4 bytes graças a Stewie Griffin!Tomamos quatro entradas e depois indexamos progressivamente em declarações pseudo-ternárias com base nelas em ordem inversa. Por exemplo, o exterior
(..., ...)[!$h]
testa se a quarta entrada está presente. Nesse caso, a!$h
vontade é igual0
e a primeira metade é executada (o volume de uma pirâmide irregular triagonal). Caso contrário,!$h
com$h = $null
(como não inicializado) será igual1
, então ele vai para a segunda metade, que por si só é um pseudo-ternário baseado[!$c]
e assim por diante.Provavelmente, isso é quase ideal, já que a fórmula supostamente mais curta que (por exemplo) Cᴏɴᴏʀ O'Bʀɪᴇɴ está usando é na verdade 2 bytes a mais no PowerShell, graças à falta de um
^
operador ... A única economia real advinda do(1/3)*(1/4)*A*$h
golfeA*$h/12
e configuração$p
posterior para salvar alguns bytes em vez da[math]::PI
chamada longa .fonte
CJam,
6766 bytesVou trabalhar para encurtá-lo em breve. Experimente online !
Explicação para vir.
fonte
Sério,
655955 bytesExperimente online!
Explicação
Este é um doozy. Vou dividir a explicação em várias partes.
Corpo Principal:
Função 0:
Função 1:
Função 2:
Função 3 (21 bytes; quase metade do comprimento do programa!)
fonte
Matlab, 78 bytes
Certamente não pode ficar mais curto que isso.
~b
,~c
e~d
, são0
se cada uma das dimensões for diferente de zero. Uma fórmula com uma dimensão zero dará apenas zero. Dessa forma, cada uma das fórmulas pode ser simplesmente resumida. Nãoif
eelse
obrigatório.Chame assim (ou tente online aqui ):
fonte
Python
32,127119116 bytesAgradecemos a alguém e à Mego por toda sua ajuda no golfe. Agradeço também a Cᴏɴᴏʀ O'Bʀɪᴇɴ e Josh quando peguei emprestadas partes de suas respostas por essa.
Ungolfed:
fonte
def v(a,b,c,d):z=a*a;p=355/113;return[x for x in[(4*z*b*b-(z+b*b-c*c)**2)**.5*d/12,a*b*c,p*z*b,p*z*a*4/3]if x][0]
assumindo que a entrada é preenchida com0
s.def v(a,b,c,d):z=a*a;P=3.14159;return filter(int,[(4*z*b*b-(z+b*b-c*c)**2)**.5*d/12,a*b*c,P*z*b,P*z*a*4/3])[0]
Mathematica, 114 (103)
Função pura: 114
Ungolfed:
Uso:
Se funções nomeadas forem permitidas: 103
Uso:
fonte
#1==#
, Eu achoQuiet[x_]:=Quiet[x,All]
e π (Alt-P em um Mac) se encaixa em ASCII estendido.#1 #2 #3
com1##
? Não se esqueça#==#1
Fator, 783 bytes
Bem, isso levou uma eternidade.
Ligue
{ array of numbers } volume
.fonte