Escribe un programa que tome dos números como entrada. El primero es el número de dimensiones: 0 para un punto, 1 para una línea recta, 2 para un círculo, 3 para una esfera. El segundo número es el radio del objeto o, si es unidimensional, el número mismo. Salida 0 para 0 dimensiones. La salida es la longitud / área / volumen del objeto.
Si llamamos al primer número n
, al segundo r
y a la salida x
, obtenemos que:
para n = 0, x = 1
para n = 1, x = 2 × r
para n = 2, x = r 2 × π
para n = 3, x = ( 4 / 3 ) x r 3 × π
y así sucesivamente ... si quieres, sin embargo.
Notas:
Los casos en que uno o ambos números son negativos, o cuando el primer número no es entero, no necesitan ser cubiertos.
El programa no debe leer de ningún archivo y la única entrada son esos dos números.
La salida debe usar solo números (por ejemplo, no "14 * pi") y debe tener una precisión de al menos dos dígitos decimales.
En cuanto a n = 0, puede generar 0 si acorta el código.
¡Botín extra para una respuesta que cubre incluso 4 "esferas" y más dimensionales!
Es código de golf , por lo que gana la respuesta más corta en bytes.
Ejemplos:
1 1 -> 2
2 3 -> 28,27
3 1 -> 4,19
3 4,5 -> 381,70
1 9.379 -> 18.758
0 48 -> 1
== r
es la esfera, el conjunto de puntos con distancia desde el origen<= r
es la bola. Entonces estos son 0 bolas = punto, 1 bola = segmento, 2 bolas = disco, 3 bolas = bola, 4 bolas, 5 bolas, etc. c. (aparece como "n
-ball = nombre común").Respuestas:
Jalea , 13 bytes + botín extra
Pruébalo en línea!
Funciona para cualquier dimensión, siempre que el valor fijo de π producido por
ØP
(3.141592653589793
) sea lo suficientemente preciso.¿Cómo?
fuente
Mathematica, 18 bytes, hasta ~ 168.15 billones de dimensiones
Función anónima. Toma dos números como entrada y devuelve un número inexacto como salida. Funciona con cualquier cantidad de dimensiones. Salidas
1.
para n = 0. Utiliza la fórmula del Volumen de una bola n en Wikipedia.Explicación
Estamos intentando calcular π n / 2 / Γ ( n / 2 + 1) · R n , o
N[Pi^(n/2)/Gamma[n/2 + 1] R^n]
en Mathematica. En nuestro caso,#
(primer argumento) es n y#2
(segundo argumento) es R . Esto nos dejaN[Pi^(#/2)/Gamma[#/2 + 1] #2^#] &
, que se pueden jugar de la siguiente manera:y así, nuestro programa original.
fuente
!
funciona para no integrales. Usar Mathematica para esto casi se siente como hacer trampa ... :)JavaScript (ES6), 45 bytes + botín adicional
La fórmula recursiva de wikipedia debería funcionar para cualquier cantidad de dimensiones
fuente
R,
754038 bytes (más botín adicional)Bueno, parece que podría jugar al golf cediendo y usando la función gamma en lugar de las funciones recursivas.
Define una función anónima para calcular el volumen de una
n
hiperesfera de radio tridimensionalr
.Algunos ejemplos:
Solución sin botín,
3834 bytesPor unos pocos bytes menos, puede tener una función anónima que solo funciona para las dimensiones 1 a 3. Devuelve
numeric(0)
paran=0
yNA
paran>3
. (numeric(0)
es un vector numérico de longitud 0;NA
es para "no disponible".) El rendimiento es idéntico a la solución general anterior.fuente
Haskell,
746536 bytes + botín extraLa fórmula recursiva funciona para todas las dimensiones que se pueden presentar exactamente como un número de coma flotante de doble precisión, pero se repetirá infinitamente para las dimensiones no integrales. La versión anterior por el bien de la posterioridad:
Funciona para todas las dimensiones. Utiliza la fórmula del manifiesto tau .product[n,n-2..1.1]
es un hack factorial doble que no contará cero paran==2
fuente
JavaScript,
61514943 bytes0-3 dimensiones son compatibles porque no hay 4ta dimensión .
Gracias a @Hedi por guardar 7 bytes
Crea función
d
. Luego suber
a lan
potencia th y luego la multiplica con un número dependiendo deln
uso de operadores ternarios. Salidas1
paran=0
Da salida a al menos 2 decimales (10+ dp)
Aquí hay un fragmento de merienda!
fuente
3 dimensions that behave in the same way and one that behaves in a different way
- En ese momento parece estar diciendo que hay una 4ta dimensión, ¡pero no 1ra, 2da o 3ra!MATL , 17 bytes
Esto funciona solo hasta 3 dimensiones. Las entradas están en orden inverso, es decir:,
r
entoncesn
.Pruébalo en línea!
Considere
r=3
,n=2
como un ejemplo.fuente
Java / C / C ++ / C #,
6967 bytes + botín extra!Editar: Guardado 2 bytes gracias a @AlexRacer
Una función diádica: el primer argumento es el número de dimensiones, el segundo es el radio de la bola n.
float v(int n,float r){return n<1?1:n<2?2*r:6.283f*r*r*v(n-2,r)/n;}
Fórmula recursiva para el volumen de una bola n: V n = (2πr 2 V n-2 ) ⁄ n
Whoa! ¡Java (mi lenguaje de prueba) supera a Scala aquí, gracias a la
?:
sintaxis ternaria! Esta función es sintácticamente correcta en los 4 idiomas del encabezado, y la he probado con C (MinGW GCC 5.4.0) y C # (VS Ultimate 2016, C # 6.0). Supongo que también funcionará en C ++, así que allí. Como esta función es bastante independiente de la biblioteca, debería funcionar en cualquier lenguaje tipo C con una sintaxis similar.fuente
n==0
se puede acortarn<1
y tambiénn==1
an<2
Haskell,
52 bytes para sangría de pestaña42 bytes + botín adicionalEditar: guardado 10 bytes gracias a @WChargin
Una función curry diádica: el primer argumento es el número de dimensiones, el segundo es el radio de la bola n.
Fórmula recursiva para el volumen de una bola n: V n = (2πr 2 V n-2 ) ⁄ n
Guardar esto como un archivo separado guión y carrera con GHCi, con una función para probar
v
para la salida, por ejemplo,show (v 3 4.5)
. No probé esto, avíseme si esto no funciona.Programa anterior con una aproximación de 6.2832 para 2π reemplazados (50 bytes con sangría de tabulación):
Esto se puede usar con GHCi en modo multilínea (usando
:set +m
o encerrando el código entre:{
&:}
, los gabinetes están en sus propias líneas. Se requiere la función de prueba.Aquí entra en juego la escritura estática con inferencia de tipo de programa completo, lo que permite a Haskell hacerlo mucho mejor que Scala, y se acerca a Groovy, pero no lo supera gracias a la coincidencia de patrones en lugar de un ternario, que implica cierta repetición de caracteres.
fuente
2*pi
por6.2832
, y 47 si se le cae el paréntesis alrededor de la llamada recursiva:let{v 0 r=1;v 1 r=2*r;v n r=2*pi*r*r*v(n-2)r/n}
...let{}
y reemplace mis puntos y comas con saltos de línea para obtener solo 42 bytes (sin arrastrar nueva línea).Raqueta 69 bytes (más botín extra)
Utiliza una fórmula recursiva de https://en.wikipedia.org/w/index.php?title=Volume_of_an_n-ball§ion=3#Recursions
Incluyendo sugerencias de @wchargin
Sin golf (v = volumen, d = dimensiones, r = radio):
Pruebas:
Salida:
fuente
v
que no está consolidada (sin mencionar los otros parámetros). ¿Seguramente necesitas contar(define(v d r))
también? Esto le trae hasta 82 bytes ...cond
conif
expresiones anidadas , reduciéndolo a 78 bytes con(define(v d r)(if(= d 0)1(if(= d 1)(* 2 r)(*(/(* 2 pi(* r r))d)(v(- d 2)r)))))
.match
para obtener(define(v d r)(match d[0 1][1(* 2 r)][_(*(/(* 2 pi(* r r))d)(v(- d 2)r))]))
.Perl, 63 bytes + botín extra
Acepta dos enteros n y r, uno a la vez, luego genera el volumen n para un radio dado r de una esfera n. Cuando n = 0, V = 1, y cuando n = 1, V = 2r. Todas las dimensiones adicionales se calculan mediante la siguiente fórmula:
Desde r n es el factor del radio en cada fórmula, lo dejo fuera del cálculo base y solo lo aplico al final.
2π se aproxima en el código por 6.283.
fuente
Scala, 53 bytes
Lo siento, no hay botín extra para mí :(
Explicación:
fuente
JavaScript (ES6), 39 bytes, sin botín
fuente
Python 3,
767268 bytes + botín extra!¡Solución recursiva con botín extra!
Devoluciones
0
paran=0
Enfoque antiguo (
1
paran=1
):Fórmula recursiva de Wikipedia .
Pruébalo en línea.
fuente
Python 3, 56 bytes + botín extra!
Directo con botín extra!
Fórmula estándar
Pruébalo en línea
fuente
Scala,
8179 bytes + botín extra!Editar: Guardado 2 bytes gracias a @AlexRacer
Una función diádica: el primer argumento es el número de dimensiones, el segundo es el radio de la bola n.
def v(n:Int,r:Float):Float=if n<1 1 else if n<2 2*r else 6.2832f*r*r*v(n-2,r)/n
Fórmula recursiva para el volumen de una bola n: V n = (2πr 2 V n-2 ) ⁄ n
La falta de inferencia de tipos de Scala para los tipos de retorno de funciones recursivas y parámetros de función y sintaxis ternaria detallada duele bastante aquí :(
fuente
Groovy,
4947 bytes + botín extra!Editar: Guardado 2 bytes gracias a @AlexRacer
Una función diádica: el primer argumento es el número de dimensiones, el segundo es el radio de la bola n.
def v(n,r){n<1?1:n<2?2*r:6.2832*r*r*v(n-2,r)/n}
Fórmula recursiva para el volumen de una bola n: V n = (2πr 2 V n-2 ) ⁄ n
Typing dinámico FTW!
Mis respuestas de Scala y Java usan la misma lógica, pero con el tipeo estático, un recuento de bytes más alto debido a anotaciones de tipo :(. Sin embargo, Scala y Groovy me permiten omitir el
return
y el punto y coma, por lo que ayuda al recuento de bytes, a diferencia de Java / C ...fuente
Lithp , 96 caracteres + botín extra
Línea dividida en 2 para facilitar la lectura:
Pensando que necesito actualizar mi analizador para requerir menos espacios. El tamaño del código se reduciría muy bien, especialmente en esa
((/ (* (* (* (*
sección.Uso:
Gracias a Rudolf por recortar unos pocos bytes.
fuente
3.141592653589793
" a "3.1416
", guardar 11 bytes y seguir encajando en las reglas?CJam (27 bytes con crédito adicional)
Conjunto de pruebas en línea . Este es un bloque anónimo (función) que toma argumentos
d r
en la pila y deja el resultado en la pila.Disección
La fórmula general n-dimensional se puede reescribir como
fuente