Você está tentando encaixar uma esfera em uma caixa de 5 lados, mas às vezes ela não se encaixa completamente. Escreva uma função para calcular quanto da esfera está fora (acima da borda) da caixa.
Existem 3 situações possíveis:
- A esfera se encaixa completamente na caixa. A resposta será 0.
- A esfera fica na borda da caixa. A resposta será mais da metade do volume total.
- A esfera fica no fundo da caixa.
Você pode ver cada situação aqui:
Você deve escrever um programa ou função para calcular esse valor em pelo menos 4 dígitos significativos.
Entrada: 4 números reais não negativos, em qualquer formato que seja conveniente * - largura, comprimento, profundidade da caixa (medidas internas) e diâmetro da esfera.
Saída: 1 número real não negativo em um formato utilizável * - o volume total (não a porcentagem) da esfera fora da caixa.
* deve ser conversível em / de uma sequência decimal
Você é encorajado a limitar o uso de trigonometria o máximo possível.
Este é um concurso de popularidade, então pense fora da caixa!
fonte
Respostas:
Adiante
Por favor, encontre, abaixo, uma esfera fora da caixa.
A "esfera" é a função de computação de volume
f
. Os casos de teste de referência compõem a "caixa".Resultado:
fonte
Java - baseado em número inteiro
Este programa não usa pi e não chama nenhuma função externa - nem mesmo o sqrt. Ele utiliza apenas aritmética simples -
+
,-
,*
e/
. Além disso, além de uma etapa de dimensionamento, funciona exclusivamente com números inteiros. Basicamente, divide a esfera em pequenos cubos e conta os que estão fora da caixa.Resultado:
Nesta forma, o programa requer mais de 2 GB de memória (funciona
-Xmx2300m
aqui) e é muito lento. Ele usa a memória para pré-calcular um monte de raízes quadradas (aritmeticamente); não é realmente necessário, mas sem isso seria MUITO mais lento. Para melhorar as necessidades e a velocidade da memória, reduza o valor daMIN
constante (que diminuirá a precisão).fonte
Python 2 (abordagem baseada em matriz)
Ele cria uma matriz de matrizes com valores de verdade se um quadrado específico nessa grade estiver dentro do círculo ou fora do círculo. Deve ficar mais preciso quanto maior o círculo que você desenhar. Em seguida, ele seleciona uma área abaixo ou acima de uma determinada linha e conta a quantidade de quadrados que pertencem ao círculo e divide-os pela quantidade de quadrados que estão no círculo inteiro.
fonte
Python 2.7, fórmula de tampa esférica
Esta versão emitirá um aviso de tempo de execução em alguns casos, mas ainda gera a resposta correta.
Para mais 11 caracteres, posso me livrar do aviso.
Aqui estão os casos de teste executados na versão 1:
fonte
import numpy as n
afrom numpy import*
e tirar todo on.
seu código.Mathematica
Usando integração numérica com limites adequados.
fonte
Implementação de referência - C #
Resultado:
fonte
Rubi
Vamos ver ...
Se a caixa estiver totalmente dentro, largura> diâmetro; comprimento> diâmetro e altura> diâmetro.
Essa deve ser a primeira verificação a ser executada.
Se estiver no fundo, então w> d; l> deh
V=(pi*h^2 /3)*(3r-h)
Então, nesse caso, apenas obtemos a altura e a percorremos.Se estiver travado, usamos uma fórmula semelhante (
V=(pi*h/6)*(3a^2 + h^2)
). De fato, nossa fórmula anterior é baseada nessa! Basicamente, usamos isso, e a é simplesmente o menor de w e l. (dica, podemos obter altura fazendoh=r-a
)Agora o código!
Nota ** Eu não testei muito, então um erro pode ter surgido, se alguém perceber um, diga!
A matemática é sólida embora.
Versão mais curta:
(Agora eu tenho certeza que obter h para a v2 é feito de maneira diferente, mas vou corrigi-lo mais tarde.
fonte
h=r-a
" Eu estava lendo as fórmulas de tampa esférica , e o diagrama não sugere um relacionamento tão simples. Vou fazer outra leitura.a = wi > le ? le : wi
deve funcionar. Caso contrário, você tem um bug.a = wi>le?le:wi
não funcionou. Eu acho que é porque estou executando o git ruby (desenvolvedor 2.2), pode ter dito desequilíbrio.c ++
Meu código encontra o volume do sólido de rotação do gráfico de uma parte de um semicírculo.
pdbd
mantém a distância linear da projeção de um ponto na superfície da esfera que toca o lábio da caixa com o diâmetro da esfera que, se estendida, seria normal ao fundo da caixa. As duas expressões que contêmM_PI
são basicamente o anti-derivado da integral depi * -(x^2)+2rx
em relação a x (onde x é uma medida do comprimento ao longo do diâmetro acima mencionado através da esfera e onde r é o raio da esfera) avaliado em umapdbd
ou a diferença do diâmetro da esfera e da profundidade da caixa, dependendo do caso específico que ocorre com as diferentes dimensões.fonte