Está tratando de encajar una esfera en una caja de 5 lados, pero a veces no cabe completamente. Escribe una función para calcular la cantidad de la esfera que está fuera (por encima del borde) del cuadro.
Hay 3 situaciones posibles:
- La esfera cabe completamente en la caja. La respuesta será 0.
- La esfera se encuentra en el borde de la caja. La respuesta será más de la mitad del volumen total.
- La esfera se encuentra en el fondo de la caja.
Puedes ver cada situación aquí:
Debe escribir un programa o función para calcular este valor en al menos 4 dígitos significativos.
Entrada: 4 números reales no negativos en cualquier formato que sea conveniente *: ancho, largo, profundidad de la caja (medidas interiores) y diámetro de la esfera.
Salida: 1 número real no negativo en un formato utilizable *: el volumen total (no el porcentaje) de la esfera fuera de la caja.
* debe ser convertible a / desde una cadena decimal
Se le recomienda que limite su uso de trigonometría tanto como sea posible.
Este es un concurso de popularidad, ¡así que piense fuera de la caja!
fuente
Respuestas:
Adelante
Encuentra, debajo, una esfera fuera de la caja.
La "esfera" es la función de cálculo de volumen
f
. Los casos de prueba de referencia componen la "caja".Salida:
fuente
Java - basado en enteros
Este programa no usa pi y no llama a ninguna función externa, ni siquiera sqrt. Sólo utiliza aritmética simple -
+
,-
,*
y/
. Además, aparte de un paso de escala, funciona exclusivamente con enteros. Básicamente divide la esfera en pequeños cubos y cuenta los que están fuera de la caja.Salida:
De esta forma, el programa requiere más de 2 GB de memoria (funciona
-Xmx2300m
aquí) y es bastante lento. Utiliza la memoria para calcular previamente un montón de raíces cuadradas (aritméticamente); no es realmente necesario, pero sin eso sería MUCHO más lento. Para mejorar las necesidades de memoria y la velocidad, reduzca el valor de laMIN
constante (aunque eso disminuirá la precisión).fuente
Python 2 (enfoque basado en matriz)
Crea una matriz de matrices con valores de verdad si un cuadrado específico en esa cuadrícula está dentro del círculo o fuera del círculo. Debería ser más preciso cuanto mayor sea el círculo que dibujes. Luego selecciona un área debajo o encima de una fila determinada y cuenta la cantidad de cuadrados que pertenecen al círculo y la divide por la cantidad de cuadrados que están en todo el círculo.
fuente
Python 2.7, Fórmula de tapa esférica
Esta versión arrojará una advertencia de tiempo de ejecución en algunos casos, pero aún muestra la respuesta correcta.
Para 11 caracteres más, puedo deshacerme de la advertencia.
Estos son los casos de prueba ejecutados en la versión 1:
fuente
import numpy as n
afrom numpy import*
y quitar todo eln.
en el código.Mathematica
Uso de integración numérica con límites adecuados.
fuente
Implementación de referencia - C #
Salida:
fuente
Rubí
Veamos ...
Si la caja está completamente adentro, entonces ancho> diámetro; longitud> diámetro y altura> diámetro.
Esa debería ser la primera verificación que se ejecute.
Si se encuentra en la parte inferior, entonces w> d; l> d y h
V=(pi*h^2 /3)*(3r-h)
Entonces, en ese caso, solo obtenemos la altura y la pasamos por eso.Si está atascado, usamos una fórmula similar (
V=(pi*h/6)*(3a^2 + h^2)
). De hecho, nuestra fórmula anterior se basa en esta. Esencialmente, usamos eso, y a es simplemente el más pequeño de w y l. (pista, podemos obtener altura haciendoh=r-a
)¡Ahora el código!
Nota ** No lo probé demasiado, por lo que es posible que se haya introducido un error, si alguien lo nota, ¡dígalo!
Sin embargo, las matemáticas son sólidas.
Versión más corta:
(Ahora sé con certeza que obtener h para v2 se realiza de manera diferente, pero lo arreglaré más adelante.
fuente
h=r-a
" Estaba leyendo las fórmulas esféricas de la tapa , y el diagrama no sugiere una relación tan simple. Le daré otra lectura.a = wi > le ? le : wi
debería funcionar. De lo contrario, tienes un error.a = wi>le?le:wi
no funcionó. Supongo que es porque estoy ejecutando git ruby (desarrollador 2.2), podría haber dicho desequilibrio.c ++
Mi código encuentra el volumen del sólido de rotación del gráfico de alguna parte de un semicírculo.
pdbd
mantiene la distancia lineal de la proyección de un punto en la superficie de la esfera que toca el borde de la caja con el diámetro de la esfera que, de extenderse, sería normal al fondo de la caja. Las dos expresiones que contienenM_PI
son básicamente la anti-derivada de la integral depi * -(x^2)+2rx
con respecto a x (donde x es una medida de la longitud a lo largo del diámetro mencionado anteriormente a través de la esfera y donde r es el radio de la esfera) evaluada en cualquierapdbd
o la diferencia del diámetro de la esfera y la profundidad de la caja según el caso particular que ocurra con las diferentes dimensiones.fuente