Problema:
Sua tarefa é escrever um programa que tenha como entrada uma altura (em metros) e peso (em quilogramas) e produza a categoria de IMC correspondente.
O IMC é uma medida da relação entre seu peso e sua altura. É datado e impreciso para muitas pessoas , mas isso não importa aqui!
O IMC pode ser calculado usando a seguinte equação:
BMI = (mass in kilograms) / (height in meters)^2
As categorias serão definidas da seguinte forma:
IMC <18,5: "Baixo peso"
18,5 <= IMC <25: "Normal"
25 <= IMC: "Excesso de peso"
Para o desafio, estou ignorando todas as categorias "extremas". Além disso, como alguns números como "25" se situam entre duas categorias, ajustei os limites levemente para que haja uma resposta definitiva.
Você pode escrever uma função ou um programa completo.
Entrada:
A entrada pode estar em qualquer forma razoável. Dois números (ou cadeias), como 2 argumentos separados ou como uma única cadeia. Uma matriz / lista de 2 números, um dicionário com as teclas "peso" e "altura" ... Os valores decimais devem ser suportados. Você pode assumir que a entrada sempre será válida (sem valores negativos e a altura nunca será 0).
Saída:
A saída será uma sequência que contém os nomes de categoria que não diferenciam maiúsculas de minúsculas . As strings devem corresponder aos nomes das categorias exatamente como acima, ignorando maiúsculas e minúsculas. Pode ser enviado para o stdout, retornado (no caso de uma função) ou gravado no arquivo.
Casos de teste (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)
Aqui está um pseudocódigo que mostra um exemplo de implementação:
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"
Isso é código-golfe, então o menor número de bytes vence.
(Sim, essa tarefa é extremamente trivial na maioria dos idiomas. Atualmente, a maioria dos desafios parece ser mais difícil do que o normal, então pensei em publicar um mais acessível).
NOTA! Uma hora depois de postar esse desafio, tive que modificar os intervalos levemente, pois os intervalos declarados tinham "buracos", conforme apontado nos comentários. Por favor, veja os novos intervalos.
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
Experimente online!
Compare com 72 bytes:
fonte
TI-Basic,
5854 bytesAlém disso, por diversão, aqui está uma versão mais compacta com mais bytes:
Tudo o que posso dizer é: obrigado por tornar esse caso insensitivo;)
PS
Input
leva entrada gráficaX
eY
semelhante aPrompt X,Y
fonte
ERWEIGHT
Mathematica, 67 bytes
Usa o fato de
a[b,c][[Sign@d]]
retornara
se ford
igual a 0, retornarb
sed
for positivo e retornarc
sed
for negativo.⌊...⌋
é aFloor
função do Mathematica usando os caracteres de três bytes U + 230A e U + 230B. Não foi possível descobrir como fazer melhor do que usarweight
duas vezes.fonte
Ruby,
91777467 bytesPrimeira tentativa ingênua:
Segunda tentativa com "inspiração" de respostas anteriores:
Terceira tentativa:
Quarta tentativa:
Experimente online!
fonte
JavaScript (ES6),
70 67 6463 bytesGuardado 4B graças a Arnauld
Uso
Saída
Explicação
Essa resposta é bastante trivial, embora exista um truque inteligente:
Underweight
eOverweight
ambas terminamerweight
, então só precisamos mudar esses caracteres.Supus que isso
Normal
significa um IMC entre 25 (exclusivo) e 18,5 (inclusive).Underweight
significa IMC menor que 18,5 eOverweight
IMC maior ou igual a 25.fonte
C, 81 bytes
fonte
05AB1E , 28 bytes
Usa a codificação CP-1252 . Experimente online!
fonte
QBIC ,
6158 bytes@Luke usou o Force e cortou dois bytes. Obrigado!
A alteração das regras salvou outro byte.
Explicação:
fonte
Python 2 , 72 bytes
Experimente online!
fonte
<!-- language-all: lang-python -->
que o TIO inseriu automaticamente para mim.Python 3,
9795 bytesPrograma completo.
Multiplique por cinco para salvar um byte. Obrigado Jonathan Allan.
Linha por linha:
Mapeie os dois números de entrada do usuário separados por espaço para ints. Descompacte para a e b.
Calcular
Se o IMC estiver entre 18,6 e 25, inclusive, a expressão à direita será avaliada como True. Os booleanos podem ser 0 ou 1 quando usados como índices de lista, portanto, obtemos "Normal" ou a string construída no índice zero. "erweight" é um sufixo compartilhado para as duas opções restantes, portanto, não precisa ser repetido. Em seguida, usamos o padrão [start: stop: step] da lista de Python / fatia de strings. c> 18.6 será avaliado em 0 ou 1 (Falso ou Verdadeiro) e se tornará o nosso começo. Stop não é indicado, então vamos para o final do literal. O passo é 2, então pegamos cada segundo índice. Se start start for avaliado como 1, obteremos "Ov", caso contrário, obteremos "Und". De qualquer forma, anexamos "erweight" ao que obtivemos e temos nossa produção final.
fonte
def f(h,w):c=h/w/w;print(["UOnvd"[c>18.6::2]+"erweight","Normal"][18.6<=c<=25])
93
e125
. Se você usar um lambda você tem que calcularc
em ambos os lugares, mas não precisa nomear a função ou o usoprint()
, por isso pode fazerlambda h,w:["UOnvd"[h/w/w*5>93::2]+"erweight","Normal"][93<=h/w/w*5<=125]
para 73.c
o dobro do multiplique por 5 custos mais do que economiza no lambda, então apenaslambda h,w:["UOnvd"[h/w/w>18.6::2]+"erweight","Normal"][18.6<=h/w/w<=25]
para 72R,
89848074 bytesCom um aceno para a resposta Octave de StewieGriffin, cria uma matriz de seqüências de caracteres e depois soma o resultado de
BMI < c(18.5,25)
e faz referência à matriz nessa posição + 1.O primeiro argumento precisa ser altura, depois peso; se isso não for permitido, então
funciona para mais 4 bytes.
fonte
Clojure, 63 bytes
fonte
dc , 58 bytes
Aceita entrada como 2 números separados por espaço no formato
<mass> <height>
. Produz uma string em uma linha separada.Experimente online!
Explicação
Para os fins desta explicação, a entrada é
80 1
.fonte
Oitava, 64 bytes
Experimente online
Esta é uma função anônima que recebe dois argumentos de entrada,
h
(altura) ew
(peso).A função cria uma matriz de células contendo as strings
'Underweight','Normal','Overweight'
e gera o número da string3-sum(2*w/h^2<'%2')
.Sim, esse parece um pouco estranho. Queremos a primeira string se
w/h^2<=18.5
, a segunda string se(w/h^2 > 18.5) & (w/h^2 < 25)
e a terceira string se nenhuma das condições acima for verdadeira. Em vez de criar várias comparações, poderíamos simplesmente comparar a string com:,w/h^2 < [18.5, 25]
que retornaria uma das seguintes matrizes[1 1], [0 1], [0,0]
para Abaixo do Peso, Normal e Acima do Peso, respectivamente.[18.5,25]
leva 9 bytes, o que é muito. O que fazemos é multiplicar o IMC por 2 e comparar o resultado com[37, 50]
, ou'%2'
em ASCII. Isso economiza três bytes.fonte
Perl 6 , 59 bytes
Como funciona
Pena que a string
erweight
precisa ser repetida, mas todas as variações que tentei para evitar isso acabaram aumentando a contagem geral de bytes:Com substituição de cadeia, 62 bytes:
Com interpolação de cadeia, 67 bytes:
Tradução aproximada da solução Python do xnor , 65 bytes:
fonte
PowerShell , 81 bytes
Experimente online!
Explicação
O principal ponto que precisa ser explicado é
18.5,25 -lt $b
(onde eu estou substituindo$b
o IMC, que é calculado no lugar no código). A maioria dos operadores do PowerShell, quando recebe uma matriz no lado esquerdo, retorna uma matriz de itens que satisfazem o teste, em vez de retornar um valor booleano. Portanto, isso retornará uma matriz vazia se$b
for menor que 18,5, uma matriz contendo apenas 18,5 se estiver no meio e uma matriz contendo 18,5 e 25 se for maior que 25.Eu uso a contagem dos elementos como um índice em uma matriz de seqüências de caracteres, então a contagem
0
obtém o elemento0
que é'Underweight'
etc.fonte
OCaml, 93 bytes
fonte
Python,
7574 bytesExperimente online!
Solução bastante básica que tira proveito das técnicas de outras pessoas para resolvê-lo.
Obrigado @ovs por salvar um byte.
Alternativas
1. 73 bytes
Rejeitei isso, pois era muito semelhante a outra resposta que vi.
2. 71 bytes
Rejeitei isso porque, apesar de trabalhar em todos os testes da pergunta, existem alguns números em que ele pode falhar, pois está faltando
=
no<=
.fonte
25
eelse
- mas, de qualquer maneira, o uso de curto-circuitoand/or
(como @ovs comentou) é mais curto.25
eelse
, você definitivamente fazer necessidade com alguns intérpretes (incluindo CPython, IIRC) (a maioria?). Se você escrever como25else
, o25e
será interpretado como o início de um literal numérico de notação científica, e o intérprete entrará em baulks quando não houver dígitos seguintes.C #,
636261 bytesEconomizou mais 1 byte graças ao TheLethalCoder .
Economizou 1 byte graças ao usuário anônimo.
Uma função anônima bem direta. O truque é usar o operador ternário para retornar diretamente (omitindo o
return
palavra chave, um par de chaves e uma declaração e atribuição de variáveis).Programa completo com casos de teste:
fonte
Lisp comum,
8987858483 bytesUma função:
Exemplo de uso:
Experimente online! (Adicionei a função de impressão para ver a saída no TIO)
Idéias para melhoria são bem-vindas.
fonte
MATL,
54454442 bytesExperimente em matl.suever.net
Começa calculando o IMC e dobrando-o
U\E
, depois cria o vetor[37 50]
com a string literal '% 2'. Compara o IMC com esse vetor e usa instruções if para obter a resposta, aproveitando-senormal
como um literal predefinido17Y0
.fonte
[BC]UQ
por'%2'
e salvar 2 bytes.Java 8, 61 bytes
Atribua a
DoubleFunction<DoubleFunction<String>>
e chame assim:fonte
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
Não é possível atribuir a w.int w = ... , h = ... ; System.out.println((w/=h*h)<18.5?"Underweight":w<25?"Normal":"Overweight")
, desculpe :)dc , 64 bytes
Experimente online!
fonte
3k[Overweight]??2^/dsp[[Normal]][[Underweight]]sasb25>blp18.5>ap
.Javascript (ES6), 63 bytes
Exemplo
fonte
Rápido, 97 bytes
fonte
Japt , 46 bytes
Experimente online!
Inspirado por @ Luke's resposta de .
Explicação
Descomprime para:
Japt tem uma entrada implícita
U
. A segunda entrada éV
.Japt usa o biblioteca shoco para compactação de strings. Backticks são usados para descomprimir seqüências de caracteres.
Atalhos Unicode usados:
fonte
PHP , 121 bytes
Experimente online!
fonte
Scala, 124 bytes
fonte
REXX, 113 bytes
fonte