Puede determinar el volumen de objetos en función de un conjunto dado de dimensiones:
- El volumen de una esfera se puede determinar usando un solo número, el radio (
r
) - El volumen de un cilindro se puede determinar usando dos números, el radio (
r
) y la altura (h
) - El volumen de una caja se puede determinar usando tres números, la longitud (
l
), el ancho (w
) y la altura (h
) - El volumen de una pirámide triangular irregular se puede determinar usando cuatro números, las longitudes laterales (
a, b, c
) y la altura (h
).
El desafío es determinar el volumen de un objeto dada una de las siguientes entradas:
- Un solo número
(r)
o(r, 0, 0, 0)
=>V = 4/3*pi*r^3
- Dos números
(r, h)
o(r, h, 0, 0)
=>V = pi*r^2*h
- Tres números
(l, w, h)
o(l, w, h, 0)
=>V = l*w*h
- Cuatro números
(a, b, c, h)
=>V = (1/3)*A*h
, dondeA
viene dado por la fórmula de Heron :A = 1/4*sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c))
Reglas y aclaraciones:
- La entrada puede ser tanto enteros como decimales
- Puede asumir que todas las dimensiones de entrada serán positivas
- Si Pi se codifica difícil que debe ser precisa hasta:
3.14159
. - La salida debe tener al menos 6 dígitos significativos, excepto los números que se pueden representar con precisión con menos dígitos. Puede generar
3/4
como0.75
, pero4/3
debe ser1.33333
(más dígitos están bien)- Cómo redondear valores inexactos es opcional
- El comportamiento de la entrada no válida no está definido
- Reglas estándar para E / S. La entrada puede ser una lista o argumentos separados
Este es el código de golf, por lo que gana la solución más corta en bytes.
Casos de prueba:
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
fuente
fuente
Respuestas:
MATL ,
57535144 bytesLa entrada es una matriz con 1, 2, 3 o 4 números.
Pruébalo en línea!
Explicación
En lugar de usar
if
bucles anidados , lo cual es costoso en términos de bytes, calcula cuatro resultados posibles para cualquier entrada y luego selecciona el resultado apropiado según la longitud de la entrada.Al calcular los resultados, aunque solo uno de ellos debe ser válido, los otros no pueden dar errores. Esto significa, por ejemplo, que la indexación del cuarto elemento de la entrada no está permitida, porque la entrada puede tener menos de cuatro elementos.
fuente
Vitsy, 49 bytes
Pensé que me entregaste este en un plato, pero encontré un error sin resolver para solucionar. Sin embargo, no me hizo daño.
Básicamente, dado que la entrada tiene una cierta longitud para diferentes funciones, me das la sintaxis de mi método para hacer esto. Entonces, ¡éxito!
Explicación, una línea a la vez:
La entrada se acepta como argumentos de línea de comando en el reverso exacto tal como aparecen en la pregunta, sin ceros finales.
Pruébalo en línea!
Como comentario, aquí hay algo que está actualmente en desarrollo.
Paquete Java con Vitsy
Tenga en cuenta que este paquete es un trabajo en progreso; esto es sólo para mostrar cómo va a funcionar en el futuro (documentación para esto todavía no se carga) y se no jugó golf, y es una traducción literal:
fuente
C,
10097 byteseditar 1: eliminar decimales innecesarios
.
, gracias Immibis!fuente
4./3.
ser solo4/3.
? ¿Y puede2.
y12.
solo ser2
y12
?JavaScript ES6,
12912612511611490 bytes¡Ahorré muchos bytes (9) con una fórmula maravillosa, gracias a Stewie Griffin! Como la entrada debe ser distinta de cero,
variable?
será suficiente para una verificación de definición.¡Pruébalo!
fuente
Uncaught SyntaxError: Unexpected token =
(refiriéndose aZ=a*a
)h
, lo que parece un poco descuidado.Haskell,
11410910710199 bytesToma una lista de números y devuelve un volumen. Llámalo como
para una esfera, etc. La función es polimórfica para cualquier tipo que implemente
sqrt
(básicamente,Float
oDouble
).No va a ganar ningún concurso por brevedad. Pero tenga en cuenta lo legible que es. Incluso si realmente no conoce a Haskell, puede decir lo que hace con bastante facilidad. La sintaxis de coincidencia de patrones de Haskell hace que sea realmente fácil definir funciones extrañas que hacen algo totalmente diferente dependiendo de la forma de la entrada.
fuente
(1/3)*(1/4)*h
,,, por qué noh/12
? ¡Te ahorra muchos bytes!.
y#
y$
y se convierte en sopa de Mathematica.PowerShell,
165161 bytesEntonces ... Muchos ... Dólares ... (31 de los 161 caracteres son
$
, para el 19.25% del código) ... pero, ¡ahorraron 4 bytes gracias a Stewie Griffin!Tomamos cuatro entradas y luego las indexamos progresivamente en declaraciones pseudoternarias basadas en ellas en orden inverso. Por ejemplo, el exterior
(..., ...)[!$h]
prueba si la cuarta entrada está presente. Si es así, la!$h
voluntad será igual0
y se ejecutará la primera mitad (el volumen de una pirámide triagonal irregular). De lo contrario,!$h
con$h = $null
(ya que no está inicializado) será igual1
, por lo que pasa a la segunda mitad, que es un pseudoternario basado en[!$c]
y así sucesivamente.Es probable que esto sea casi óptimo, ya que la fórmula supuestamente más corta que (por ejemplo) Cᴏɴᴏʀ O'B is está usando es en realidad 2 bytes más larga en PowerShell gracias a la falta de un
^
operador ... Los únicos ahorros reales provienen del(1/3)*(1/4)*A*$h
golfA*$h/12
y configurando$p
más tarde para guardar un par de bytes en lugar de la larga[math]::PI
llamada.fuente
CJam,
6766 bytesTrabajaré para acortarlo pronto. Pruébalo en línea !
Explicación por venir.
fuente
En serio,
655955 bytesPruébalo en línea!
Explicación
Este es un doozy. Voy a dividir la explicación en varias partes.
Cuerpo principal:
Función 0:
Función 1:
Función 2:
Función 3 (21 bytes; ¡casi la mitad de la longitud del programa!)
fuente
Matlab, 78 bytes
Muy seguro de que no puede ser más corto que esto.
~b
,~c
y~d
,0
si cada una de las dimensiones no es cero. Una fórmula con una dimensión cero solo dará cero. De esa manera, cada una de las fórmulas puede simplemente sumarse. Noif
yelse
requerido.Llámalo así (o pruébalo en línea aquí ):
fuente
Python
32,127119116 bytesGracias a alguien y a Mego por toda su ayuda con el golf. También le doy crédito a Cᴏɴᴏʀ O'Bʀɪᴇɴ y Josh cuando tomé prestadas partes de sus respuestas para esta.
Sin golf:
fuente
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]
asumiendo que la entrada está rellenada con0
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)
Función pura: 114
Sin golf:
Uso:
Si se permiten funciones con nombre: 103
Uso:
fuente
#1==#
, CreoQuiet[x_]:=Quiet[x,All]
y π (Alt-P en una Mac) encaja en ASCII extendido.#1 #2 #3
con1##
? No lo olvides#==#1
Factor, 783 bytes
Bueno, esto tomó una eternidad.
Llamada
{ array of numbers } volume
.fuente