Problème:
Votre tâche consiste à écrire un programme qui prend en entrée une hauteur (en mètres) et un poids (en kilogrammes), et sort la catégorie d'IMC correspondante.
L'IMC est une mesure du rapport de votre poids à votre taille. C'est daté et inexact pour beaucoup de gens , mais ça n'a pas d'importance ici!
L'IMC peut être calculé à l'aide de l'équation suivante:
BMI = (mass in kilograms) / (height in meters)^2
Les catégories seront définies comme suit:
IMC <18,5: «insuffisance pondérale»
18,5 <= IMC <25: "Normal"
25 <= IMC: "Surpoids"
Pour relever le défi, j'ignore toutes les catégories «extrêmes». De plus, comme certains nombres comme "25" se situent entre 2 catégories, j'ai légèrement ajusté les limites pour qu'il y ait une réponse définitive.
Vous pouvez écrire soit une fonction, soit un programme complet.
Contribution:
L'entrée peut être sous n'importe quelle forme raisonnable. Deux nombres (ou chaînes), soit sous forme de 2 arguments séparés, soit sous forme de chaîne unique. Un tableau / liste de 2 nombres, un dictionnaire avec les touches "poids" et "hauteur" ... Les valeurs décimales doivent être prises en charge. Vous pouvez supposer que l'entrée sera toujours valide (pas de valeurs négatives et la hauteur ne sera jamais 0).
Sortie:
La sortie sera une chaîne contenant les noms de catégorie insensibles à la casse . Les chaînes doivent correspondre exactement aux noms de catégorie ci-dessus, en ignorant la casse. Il peut être sorti sur la sortie standard, retourné (dans le cas d'une fonction) ou écrit dans un fichier.
Cas de test (poids, taille => résultat):
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)
Voici un pseudocode qui montre un exemple d'implémentation:
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"
Il s'agit de code-golf, donc le plus petit nombre d'octets gagne.
(Oui, cette tâche est extrêmement triviale dans la plupart des langues. La plupart des défis semblent être plus difficiles ces derniers temps que la normale, j'ai donc pensé en publier une plus accessible).
REMARQUE! Une heure après avoir posté ce défi, j'ai dû modifier légèrement les gammes car les gammes comme indiqué avaient des "trous" comme indiqué dans les commentaires. Veuillez voir les nouvelles gammes.
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 octets
Essayez-le en ligne!
Comparé à 72 octets:
la source
TI-Basic,
5854 octetsAussi, pour le plaisir, voici une version plus compacte qui est plus d'octets:
Tout ce que je peux dire, c'est merci d'avoir rendu ce cas insensible;)
PS
Input
prend l'entrée du graphique dansX
etY
similaire àPrompt X,Y
la source
ERWEIGHT
Mathematica, 67 octets
Utilise le fait que
a[b,c][[Sign@d]]
renvoiea
sid
est égal à 0, renvoieb
sid
est positif et renvoiec
sid
est négatif.⌊...⌋
est laFloor
fonction de Mathematica utilisant les caractères à trois octets U + 230A et U + 230B. Impossible de comprendre comment faire mieux que d'utiliserweight
deux fois.la source
Rubis,
91777467 octetsPremier essai naïf:
Deuxième essai avec «inspiration» des réponses précédentes:
Troisième essai:
Quatrième essai:
Essayez-le en ligne!
la source
JavaScript (ES6),
70 67 6463 octetsEnregistré 4B grâce à Arnauld
Usage
Sortie
Explication
Cette réponse est assez banale, bien qu'il existe une astuce astucieuse:
Underweight
etOverweight
deux se terminenterweight
, nous n'avons donc qu'à changer ces caractères.J'ai supposé que cela
Normal
signifie un IMC compris entre 25 (exclusif) et 18,5 (inclus).Underweight
signifie un IMC inférieur à 18,5 etOverweight
un IMC supérieur ou égal à 25.la source
C, 81 octets
la source
05AB1E , 28 octets
Utilise l' encodage CP-1252 . Essayez-le en ligne!
la source
QBIC ,
6158 octets@Luke a utilisé la Force et a coupé deux octets. Merci!
Le changement de règles a sauvé un autre octet.
Explication:
la source
Python 2 , 72 octets
Essayez-le en ligne!
la source
<!-- language-all: lang-python -->
ce que TIO a inséré automatiquement pour moi.Python 3,
9795 octetsProgramme complet.
Multipliez par cinq pour enregistrer un octet. Merci Jonathan Allan.
Ligne par ligne:
Mappez les deux numéros d'entrée utilisateur séparés par des espaces en pouces. Déballez vers a et b.
Calculer
Si le bmi est compris entre 18,6 et 25 inclus, l'expression de droite sera évaluée à True. Les booléens peuvent être 0 ou 1 lorsqu'ils sont utilisés comme index de liste, nous obtenons donc "Normal" ou la chaîne construite dans l'index zéro. "erweight" est un suffixe partagé pour les deux options restantes, il n'a donc pas besoin d'être répété. Ensuite, nous utilisons le modèle [start: stop: step] de découpage de liste / chaîne Python. c> 18,6 sera évalué à 0 ou 1 (Faux ou Vrai) et devient notre point de départ. L'arrêt n'est pas indiqué, nous allons donc à la fin du littéral. L'étape est 2 donc nous prenons chaque index sur deux. Si start start est évalué à 1, nous obtenons "Ov", sinon nous obtenons "Und". Quoi qu'il en soit, nous ajoutons "erweight" à ce que nous avons obtenu et nous avons notre sortie finale.
la source
def f(h,w):c=h/w/w;print(["UOnvd"[c>18.6::2]+"erweight","Normal"][18.6<=c<=25])
93
et125
. Si vous utilisez un lambda, vous devez calculerc
aux deux endroits mais n'avez pas besoin de nommer la fonction ou d'utiliserprint()
, donc vous pouvez le fairelambda h,w:["UOnvd"[h/w/w*5>93::2]+"erweight","Normal"][93<=h/w/w*5<=125]
pour 73.c
deux fois la multiplication par 5 coûte plus cher que ce qu'il économise dans le lambda, donc justelambda h,w:["UOnvd"[h/w/w>18.6::2]+"erweight","Normal"][18.6<=h/w/w<=25]
pour 72R,
89848074 octetsAvec un clin d'œil à la réponse Octave de StewieGriffin, crée un tableau de chaînes, puis additionne le résultat
BMI < c(18.5,25)
et référence le tableau à cette position + 1.Le premier argument doit être la taille, puis le poids; si ce n'est pas permis, alors
fonctionne pour 4 octets de plus.
la source
Clojure, 63 octets
la source
dc , 58 octets
Prend l'entrée sous forme de 2 nombres séparés par des espaces dans le format
<mass> <height>
. Génère une chaîne sur une ligne distincte.Essayez-le en ligne!
Explication
Aux fins de cette explication, l'entrée est
80 1
.la source
Octave, 64 octets
Essayez-le en ligne
Il s'agit d'une fonction anonyme qui prend deux arguments d'entrée,
h
(hauteur) etw
(poids).La fonction crée un tableau de cellules contenant ses chaînes
'Underweight','Normal','Overweight'
et affiche le numéro de chaîne3-sum(2*w/h^2<'%2')
.Oui, celui-là a l'air un peu étrange. Nous voulons la première chaîne if
w/h^2<=18.5
, la deuxième chaîne if(w/h^2 > 18.5) & (w/h^2 < 25)
et la troisième chaîne si aucune des conditions ci-dessus n'est vraie. Au lieu de créer un tas de comparaisons, nous pourrions simplement comparer la chaîne à:,w/h^2 < [18.5, 25]
qui retournerait l'un des tableaux suivants[1 1], [0 1], [0,0]
pour Underweight, Normal et Overweight respectivement.[18.5,25]
prend 9 octets, ce qui est beaucoup. À la place, nous multiplions l'IMC par 2 et comparons le résultat avec[37, 50]
ou'%2'
en ASCII. Cela économise trois octets.la source
Perl 6 , 59 octets
Comment ça marche
Dommage que la chaîne
erweight
doive être répétée, mais toutes les variations que j'ai essayées afin d'éviter cela ont fini par augmenter le nombre d'octets global:Avec substitution de chaîne, 62 octets:
Avec interpolation de chaîne, 67 octets:
Traduction approximative de la solution Python de xnor , 65 octets:
la source
PowerShell , 81 octets
Essayez-le en ligne!
Explication
Le bit principal qui doit être expliqué est
18.5,25 -lt $b
(où je remplace$b
l'IMC qui est calculé en place dans le code). La plupart des opérateurs dans PowerShell, lorsqu'ils reçoivent un tableau sur le côté gauche, retournent un tableau d'éléments qui satisfont le test, au lieu de renvoyer une valeur booléenne. Donc, cela retournera un tableau vide si$b
est inférieur à 18,5, un tableau contenant seulement 18,5 s'il se trouve au milieu et un tableau contenant à la fois 18,5 et 25 s'il est supérieur à 25.J'utilise le nombre d'éléments comme index dans un tableau de chaînes, donc nombre
0
obtient l'élément0
qui est'Underweight'
, etc.la source
OCaml, 93 octets
la source
Python,
7574 octetsEssayez-le en ligne!
Solution assez basique qui tire parti des techniques des autres pour la résoudre.
Merci @ovs d'avoir enregistré un octet.
Alternatives
1. 73 octets
J'ai rejeté cela car c'était trop similaire à une autre réponse que j'ai vue.
2. 71 octets
J'ai rejeté cela parce que, malgré tous les tests de la question, il peut y avoir des chiffres sur lesquels il peut échouer car il manque le
=
dans le<=
.la source
25
etelse
- mais de toute façon, l'utilisation du court-circuitand/or
(comme l'a commenté @ovs) est plus courte.25
etelse
, vous avez certainement faire besoin avec certains ( la plupart?) Des interprètes (y compris CPython, IIRC). Si vous l'écrivez en tant que25else
, le25e
est interprété comme le début d'un littéral numérique de notation scientifique, et l'interprète recule alors lorsqu'il n'y a pas de chiffres suivants.C #,
636261 octetsEnregistré 1 octet de plus grâce à TheLethalCoder .
Enregistré 1 octet grâce à un utilisateur anonyme.
Une fonction anonyme assez simple. L'astuce consiste à utiliser l'opérateur ternaire pour retourner directement (omettant ainsi
return
mot clé, une paire d'accolades et une déclaration et une affectation de variable).Programme complet avec cas de test:
la source
Lisp commun,
8987858483 octetsUne fonction:
Exemple d'utilisation:
Essayez-le en ligne! (J'ai ajouté la fonction d'impression pour voir la sortie dans TIO)
Les idées d'amélioration sont les bienvenues.
la source
MATL,
54454442 octetsEssayez-le sur matl.suever.net
Commence par calculer l'IMC et le doubler
U\E
, puis crée le vecteur[37 50]
avec la chaîne littérale «% 2». Compare l'IMC à ce vecteur et utilise les instructions if pour obtenir la réponse, en tirant parti d'normal
un littéral prédéfini17Y0
.la source
[BC]UQ
avec'%2'
et enregistrer 2 octets.Java 8, 61 octets
Attribuez à a
DoubleFunction<DoubleFunction<String>>
et appelez ainsi:la source
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
Impossible d'assigner à W.int w = ... , h = ... ; System.out.println((w/=h*h)<18.5?"Underweight":w<25?"Normal":"Overweight")
, désolé :)dc , 64 octets
Essayez-le en ligne!
la source
3k[Overweight]??2^/dsp[[Normal]][[Underweight]]sasb25>blp18.5>ap
.Javascript (ES6), 63 octets
Exemple
la source
Swift, 97 octets
la source
Japt , 46 octets
Essayez-le en ligne!
Inspiré par @ Luke's réponse de .
Explication
Décompresse pour:
Japt a une entrée implicite
U
. La deuxième entrée estV
.Japt utilise la bibliothèque shoco pour la compression de chaînes. Les backticks sont utilisés pour décompresser les chaînes.
Raccourcis Unicode utilisés:
la source
PHP , 121 octets
Essayez-le en ligne!
la source
Scala, 124 octets
la source
REXX, 113 octets
la source