Problema:
Su tarea es escribir un programa que tome como entrada una altura (en metros) y un peso (en kilogramos), y genere la categoría de IMC correspondiente.
El IMC es una medida de la relación entre su peso y su altura. Es anticuado e inexacto para muchas personas , ¡pero eso no importa aquí!
El IMC se puede calcular usando la siguiente ecuación:
BMI = (mass in kilograms) / (height in meters)^2
Las categorías se definirán de la siguiente manera:
IMC <18.5: "bajo peso"
18.5 <= IMC <25: "Normal"
25 <= IMC: "Sobrepeso"
Por el bien del desafío, estoy ignorando todas las categorías "extremas". Además, dado que algunos números como "25" se ubican entre 2 categorías, ajusté los límites ligeramente para que haya una respuesta definitiva.
Puede escribir una función o un programa completo.
Entrada:
La entrada puede ser de cualquier forma razonable. Dos números (o cadenas), ya sea como 2 argumentos separados, o como una sola cadena. Una matriz / lista de 2 números, un diccionario con las teclas "peso" y "altura" ... Se deben admitir valores decimales. Puede suponer que la entrada siempre será válida (sin valores negativos, y la altura nunca será 0).
Salida:
La salida será una cadena que contiene los nombres de categoría que no distinguen entre mayúsculas y minúsculas . Las cadenas deben coincidir con los nombres de categoría exactamente como se indica arriba, ignorando mayúsculas y minúsculas. Puede enviarse a la salida estándar, devolverse (en el caso de una función) o escribirse en un archivo.
Casos de prueba (peso, altura => resultado):
80, 1 => "Overweight"
80, 2 => "Normal"
80, 3 => "Underweight"
50, 1 => "Overweight"
50, 1.5 => "Normal"
50, 2 => "Underweight"
Edge Cases:
41, 1.5 => "Underweight" (18.2 BMI)
42, 1.5 => "Normal" (18.667 BMI)
56, 1.5 => "Normal" (24.889 BMI)
57, 1.5 => "Overweight" (25.3 BMI)
73, 2 => "Underweight" (18.25 BMI)
74, 2 => "Normal" (18.5 BMI)
99, 2 => "Normal" (24.75 BMI)
100, 2 => "Overweight" (25 BMI)
Aquí hay un pseudocódigo que muestra una implementación de ejemplo:
function bmi_category(weight, height):
var bmi = (weight / (height**2))
if (bmi < 18.5):
return "Underweight"
if (18.5 <= bmi < 25):
return "Normal"
if (25 <= bmi):
return "Overweight"
Este es el código de golf, por lo que gana la menor cantidad de bytes.
(Sí, esta tarea es extremadamente trivial en la mayoría de los idiomas. La mayoría de los desafíos últimamente parecen ser más difíciles de lo normal, así que pensé en publicar uno más accesible).
¡NOTA! Una hora después de publicar este desafío, tuve que modificar ligeramente los rangos ya que los rangos como se indicaron tenían "agujeros" como se señala en los comentarios. Por favor vea las nuevas gamas.
1C 1C 89 AF FE 25 32 FC 3E 53 D8 FE 24 8D 0B FE 3B F0 BD FE 26 E8 29 FB
Python , 69 bytes
Pruébalo en línea!
Comparar a 72 bytes:
fuente
TI-Basic,
5854 bytesAdemás, por diversión, aquí hay una versión más compacta que tiene más bytes:
Todo lo que puedo decir es, gracias por hacer esto insensible a mayúsculas y minúsculas;)
PS
Input
toma entrada de gráficoX
yY
similar aPrompt X,Y
fuente
ERWEIGHT
Mathematica, 67 bytes
Utiliza el hecho de que
a[b,c][[Sign@d]]
devuelvea
sid
es igual a 0, devuelveb
sid
es positivo y devuelvec
sid
es negativo.⌊...⌋
es laFloor
función de Mathematica que usa los caracteres de tres bytes U + 230A y U + 230B. No pude descubrir cómo hacerlo mejor que usarweight
dos veces.fuente
Ruby,
91777467 bytesPrimer intento ingenuo:
Segundo intento con "inspiración" de respuestas anteriores:
Tercer intento:
Cuarto intento:
Pruébalo en línea!
fuente
JavaScript (ES6),
70 67 6463 bytesGuardado 4B gracias a Arnauld
Uso
Salida
Explicación
Esta respuesta es bastante trivial, aunque hay un truco inteligente:
Underweight
yOverweight
ambos terminanerweight
, por lo que solo tenemos que cambiar esos caracteres.Supuse que eso
Normal
significa un IMC entre 25 (exclusivo) y 18.5 (inclusive).Underweight
significa un IMC menor a 18.5 yOverweight
significa un IMC mayor o igual a 25.fuente
C, 81 bytes
fuente
05AB1E , 28 bytes
Utiliza la codificación CP-1252 . Pruébalo en línea!
fuente
QBIC ,
6158 bytes@Luke usó la Fuerza y cortó dos bytes. ¡Gracias!
El cambio de reglas salvó otro byte.
Explicación:
fuente
Python 2 , 72 bytes
Pruébalo en línea!
fuente
<!-- language-all: lang-python -->
que TIO insertó automáticamente para mí.Python 3,
9795 bytesPrograma completo
Multiplique por cinco para guardar un byte. Gracias Jonathan Allan
Linea por linea:
Asigne los dos números de entrada de usuario separados por espacios a ints. Desempaquete a a y b.
Calcular
Si el IMC está entre 18.6 y 25, inclusive, la expresión de la derecha se evaluará como Verdadero. Los booleanos pueden ser 0 o 1 cuando se usan como índices de lista, por lo que obtenemos "Normal" o la cadena construida en el índice cero. "erweight" es un sufijo compartido para las dos opciones restantes, por lo que no es necesario repetirlo. Luego usamos el patrón [start: stop: step] de la lista de Python / segmentación de cadenas. c> 18.6 se evaluará a 0 o 1 (Falso o Verdadero) y se convierte en nuestro comienzo. Stop no está indicado, así que vamos al final del literal. El paso es 2, así que tomamos cada segundo índice. Si start start se evalúa en 1, obtenemos "Ov", de lo contrario obtenemos "Und". De cualquier manera, agregamos "erweight" a lo que obtuvimos y tenemos nuestro resultado final.
fuente
def f(h,w):c=h/w/w;print(["UOnvd"[c>18.6::2]+"erweight","Normal"][18.6<=c<=25])
93
y125
. Si usa una lambda, tiene que calcularc
en ambos lugares, pero no necesita nombrar la función o el usoprint()
, también puede hacerlolambda h,w:["UOnvd"[h/w/w*5>93::2]+"erweight","Normal"][93<=h/w/w*5<=125]
para 73.c
doble de la multiplicación por 5 cuesta más de lo que ahorra en el lambda, así que sololambda h,w:["UOnvd"[h/w/w>18.6::2]+"erweight","Normal"][18.6<=h/w/w<=25]
por 72R,
89848074 bytesCon un guiño a la respuesta Octave de StewieGriffin, crea una matriz de cadenas, luego suma el resultado
BMI < c(18.5,25)
y hace referencia a la matriz en esa posición + 1.El primer argumento debe ser la altura, luego el peso; si eso no está permitido, entonces
funciona para 4 bytes más.
fuente
Clojure, 63 bytes
fuente
dc , 58 bytes
Toma la entrada como 2 números separados por espacios en el formato
<mass> <height>
. Emite una cadena en una línea separada.Pruébalo en línea!
Explicación
A los fines de esta explicación, la entrada es
80 1
.fuente
Octava, 64 bytes
Pruébalo en línea
Esta es una función anónima que toma dos argumentos de entrada,
h
(altura) yw
(peso).La función crea una matriz de celdas que contiene sus cadenas
'Underweight','Normal','Overweight'
y genera un número de cadena3-sum(2*w/h^2<'%2')
.Sí, ese se ve un poco extraño. Queremos la primera cadena if
w/h^2<=18.5
, la segunda cadena if(w/h^2 > 18.5) & (w/h^2 < 25)
y la tercera cadena if ninguna de las condiciones anteriores es verdadera. En lugar de crear un montón de comparaciones, podríamos simplemente comparar la cadena con:,w/h^2 < [18.5, 25]
lo que devolvería una de las siguientes matrices[1 1], [0 1], [0,0]
para Underweight, Normal y Overweight respectivamente.[18.5,25]
toma 9 bytes, que es mucho. En cambio, lo que hacemos es multiplicar el IMC por 2 y comparar el resultado con[37, 50]
o'%2'
en ASCII. Esto ahorra tres bytes.fuente
Perl 6 , 59 bytes
Cómo funciona
Lástima que la cadena
erweight
deba repetirse, pero todas las variaciones que intenté para evitar eso terminaron aumentando el recuento de bytes general:Con sustitución de cadena, 62 bytes:
Con interpolación de cadenas, 67 bytes:
Traducción aproximada de la solución Python de xnor , 65 bytes:
fuente
PowerShell , 81 bytes
Pruébalo en línea!
Explicación
El bit principal que necesita explicación es
18.5,25 -lt $b
(donde estoy sustituyendo$b
el IMC que se calcula en el lugar en el código). La mayoría de los operadores en PowerShell, cuando reciben una matriz en el lado izquierdo, devuelven una matriz de elementos que satisfacen la prueba, en lugar de devolver un valor booleano. Entonces esto devolverá una matriz vacía si$b
es menor que 18.5, una matriz que contiene solo 18.5 si está en el medio y una matriz que contiene 18.5 y 25 si es mayor que 25.Utilizo el recuento de los elementos como un índice en una matriz de cadenas, por lo que count
0
obtiene el elemento0
que es'Underweight'
, etc.fuente
OCaml, 93 bytes
fuente
Python,
7574 bytesPruébalo en línea!
Solución bastante básica que aprovecha las técnicas de otras personas para resolverlo.
Gracias @ovs por guardar un byte.
Alternativas
1. 73 bytes
Rechacé esto porque era demasiado similar a otra respuesta que vi.
2. 71 bytes
Rechacé esto porque, a pesar de trabajar en todas las pruebas en la pregunta, hay algunos números en los que puede fallar, ya que faltan
=
en el<=
.fuente
25
yelse
, pero de todos modos, el uso de cortocircuitoand/or
(como comentó @ovs) es más corto.25
yelse
, definitivamente lo necesita con algunos (¿la mayoría?) Intérpretes (incluidos CPython, IIRC). Si lo escribe como25else
,25e
se interpreta como el comienzo de un literal numérico de notación científica, y el intérprete luego interrumpe cuando no hay dígitos siguientes.C #,
636261 bytesAhorró 1 byte más gracias a TheLethalCoder .
Guardado 1 byte gracias a un usuario anónimo.
Una función anónima bastante sencilla. Todo el truco es usar el operador ternario para regresar directamente (omitiendo así el
return
palabra clave, un par de llaves y una declaración y asignación variable).Programa completo con casos de prueba:
fuente
Lisp común,
8987858483 bytesUna función:
Ejemplo de uso:
Pruébalo en línea! (Agregué la función de impresión para ver la salida en TIO)
Ideas de mejora son bienvenidas.
fuente
MATL,
54454442 bytesPruébalo en matl.suever.net
Comienza calculando el IMC y duplicándolo
U\E
, luego crea el vector[37 50]
con la cadena literal '% 2'. Compara el IMC con este vector y usa declaraciones if para obtener la respuesta, aprovechandonormal
como un literal predefinido17Y0
.fuente
[BC]UQ
con'%2'
y guardar 2 bytes.Java 8, 61 bytes
Asignar a a
DoubleFunction<DoubleFunction<String>>
y llamar así:fuente
w
:w->h->(w/=h*h)<18.5?"Underweight":w<25?"Normal":"Overweight"
.Error: local variables referenced from a lambda expression must be final or effectively final
No se puede asignar a w.int w = ... , h = ... ; System.out.println((w/=h*h)<18.5?"Underweight":w<25?"Normal":"Overweight")
, lo siento :)dc , 64 bytes
Pruébalo en línea!
fuente
3k[Overweight]??2^/dsp[[Normal]][[Underweight]]sasb25>blp18.5>ap
.Javascript (ES6), 63 bytes
Ejemplo
fuente
Swift, 97 bytes
fuente
Japt , 46 bytes
Pruébalo en línea!
Inspirado por @ Luke's respuesta de .
Explicación
Descomprime a:
Japt tiene una entrada implícita
U
. La segunda entrada esV
.Japt usa la biblioteca shoco para la compresión de cadenas. Los backticks se usan para descomprimir cadenas.
Accesos directos Unicode utilizados:
fuente
PHP , 121 bytes
Pruébalo en línea!
fuente
Scala, 124 bytes
fuente
REXX, 113 bytes
fuente