Problem:
Ihre Aufgabe ist es, ein Programm zu schreiben, das eine Größe (in Metern) und ein Gewicht (in Kilogramm) als Eingabe verwendet und die entsprechende BMI-Kategorie ausgibt.
Der BMI ist ein Maß für das Verhältnis Ihres Gewichts zu Ihrer Körpergröße. Es ist veraltet und für viele Leute ungenau , aber das spielt hier keine Rolle!
Der BMI kann mit der folgenden Gleichung berechnet werden:
BMI = (mass in kilograms) / (height in meters)^2
Die Kategorien werden wie folgt definiert:
BMI <18.5: "Untergewicht"
18,5 <= BMI <25: "Normal"
25 <= BMI: "Übergewicht"
Um der Herausforderung willen ignoriere ich alle "extremen" Kategorien. Da einige Zahlen wie "25" zwischen zwei Kategorien liegen, habe ich die Grenzen leicht angepasst, damit es eine eindeutige Antwort gibt.
Sie können entweder eine Funktion oder ein vollständiges Programm schreiben.
Eingang:
Die Eingabe kann in jeder vernünftigen Form erfolgen. Zwei Zahlen (oder Zeichenfolgen), entweder als zwei separate Argumente oder als einzelne Zeichenfolge. Ein Array / eine Liste mit 2 Zahlen, ein Wörterbuch mit den Tasten "weight" und "height" ... Dezimalwerte sollten unterstützt werden. Sie können davon ausgehen, dass die Eingabe immer gültig ist (keine negativen Werte, und die Höhe wird niemals 0 sein).
Ausgabe:
Die Ausgabe erfolgt als Zeichenfolge mit den Kategorienamen , bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird. Die Zeichenfolgen müssen genau wie oben mit den Kategorienamen übereinstimmen, Groß- und Kleinschreibung wird ignoriert. Es kann auf die Standardausgabe ausgegeben, zurückgegeben (im Falle einer Funktion) oder in eine Datei geschrieben werden.
Testfälle (Gewicht, Größe => Ergebnis):
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)
Hier ist ein Pseudocode, der eine Beispielimplementierung zeigt:
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"
Das ist Code-Golf, also gewinnt die geringste Anzahl von Bytes.
(Ja, diese Aufgabe ist in den meisten Sprachen äußerst trivial. Die meisten Herausforderungen scheinen in letzter Zeit schwieriger als normal zu sein, daher dachte ich, ich würde eine zugänglichere Aufgabe veröffentlichen .)
HINWEIS! Eine Stunde, nachdem ich diese Herausforderung gepostet hatte, musste ich die Bereiche geringfügig ändern, da die angegebenen Bereiche "Löcher" aufwiesen, wie in den Kommentaren ausgeführt. Bitte beachten Sie die neuen Sortimente.
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
Probieren Sie es online!
Vergleichen Sie mit 72 Bytes:
quelle
TI-Basic,
5854 BytesAußerdem ist hier zum Spaß eine kompaktere Version mit mehr Bytes:
Ich kann nur sagen, danke, dass Sie die Groß- und Kleinschreibung ignoriert haben.
PS
Input
nimmt Grapheneingaben anX
undY
ähneltPrompt X,Y
quelle
ERWEIGHT
Mathematica, 67 Bytes
Nutzt die Tatsache , dass
a[b,c][[Sign@d]]
Erträge ,a
wennd
gleich 0 ist , kehrt ,b
wennd
positiv ist, und kehrt ,c
wennd
negativ ist.⌊...⌋
ist dieFloor
Funktion von Mathematica, die die Drei-Byte-Zeichen U + 230A und U + 230B verwendet. Konnte nicht herausfinden, wie man es besser macht alsweight
zweimal.quelle
Ruby,
91777467 BytesErster naiver Versuch:
Zweiter Versuch mit „Inspiration“ aus früheren Antworten:
Dritter Versuch:
Vierter Versuch:
Probieren Sie es online!
quelle
JavaScript (ES6),
70 67 6463 Byte4B dank Arnauld gerettet
Verwendung
Ausgabe
Erläuterung
Diese Antwort ist ziemlich trivial, obwohl es einen cleveren Trick gibt:
Underweight
undOverweight
beide enden inerweight
, also müssen wir nur diese Zeichen ändern.Ich nahm an, dass
Normal
dies einen BMI zwischen 25 (exklusiv) und 18,5 (inklusive) bedeutet.Underweight
bedeutet einen BMI von weniger als 18,5 undOverweight
bedeutet einen BMI von größer oder gleich 25.quelle
C 81 Bytes
quelle
05AB1E , 28 Bytes
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
QBIC ,
6158 Bytes@Luke benutzte die Kraft und schnitt zwei Bytes ab. Vielen Dank!
Die Regeländerung hat ein weiteres Byte gespeichert.
Erläuterung:
quelle
Python 2 , 72 Bytes
Probieren Sie es online!
quelle
<!-- language-all: lang-python -->
welche TIO automatisch für mich eingefügt.Python 3,
97 bis95 BytesVolles Programm.
Mit fünf multiplizieren, um ein Byte zu speichern. Vielen Dank Jonathan Allan.
Zeile für Zeile:
Ordnen Sie die zwei durch Leerzeichen getrennten Benutzereingaben den Zeichen ints zu. Auspacken nach a und b.
Berechnung
Wenn das BMI zwischen 18,6 und einschließlich 25 liegt, wird der Ausdruck auf der rechten Seite mit Wahr bewertet. Boolesche Werte können 0 oder 1 sein, wenn sie als Listenindizes verwendet werden. Daher erhalten wir entweder "Normal" oder die erstellte Zeichenfolge im Nullindex. "erweight" ist ein gemeinsames Suffix für die verbleibenden zwei Optionen, sodass es nicht wiederholt werden muss. Dann verwenden wir das Muster [start: stop: step] des Python-Listen- / String-Slicing. c> 18.6 ergibt entweder 0 oder 1 (False oder True) und wird unser Start. Stopp wird nicht angezeigt, daher gehen wir zum Ende des Buchstabens. Schritt ist 2, also nehmen wir jeden zweiten Index. Wenn start start 1 ergibt, erhalten wir "Ov", andernfalls "Und". In jedem Fall hängen wir "erweight" an das an, was wir haben, und wir haben unsere endgültige Ausgabe.
quelle
def f(h,w):c=h/w/w;print(["UOnvd"[c>18.6::2]+"erweight","Normal"][18.6<=c<=25])
93
und vergleichen125
. Wenn Sie ein Lambda verwenden, müssen Sie anc
beiden Stellen rechnen , müssen aber weder die Funktion noch die Verwendung benennen.print()
lambda h,w:["UOnvd"[h/w/w*5>93::2]+"erweight","Normal"][93<=h/w/w*5<=125]
c
Doppelte der Multiplikation mit 5 mehr kosten, als es im Lambda spart, also nurlambda h,w:["UOnvd"[h/w/w>18.6::2]+"erweight","Normal"][18.6<=h/w/w<=25]
für 72R,
89848074 BytesWenn Sie auf StewieGriffins Oktavantwort nicken, erstellen Sie ein Array von Zeichenfolgen, summieren dann das Ergebnis
BMI < c(18.5,25)
und verweisen auf das Array an dieser Position + 1.Das erste Argument muss Größe sein, dann Gewicht; wenn das nicht erlaubt ist, dann
funktioniert für 4 weitere Bytes.
quelle
Clojure, 63 Bytes
quelle
Gleichstrom , 58 Bytes
Nimmt die Eingabe als 2 durch Leerzeichen getrennte Zahlen im Format
<mass> <height>
. Gibt eine Zeichenfolge in einer separaten Zeile aus.Probieren Sie es online!
Erläuterung
Für die Zwecke dieser Erklärung ist die Eingabe
80 1
.quelle
Oktave, 64 Bytes
Probieren Sie es online aus
Dies ist eine anonyme Funktion, die zwei Eingabeargumente
h
(height) und (height) akzeptiertw
(Gewicht) akzeptiert.Die Funktion erstellt ein Zellenarray, das die Zeichenfolgen enthält
'Underweight','Normal','Overweight'
, und gibt die Zeichenfolgennummer aus3-sum(2*w/h^2<'%2')
.Ja, das sieht ein bisschen seltsam aus. Wir wollen die erste Zeichenfolge if
w/h^2<=18.5
, die zweite Zeichenfolge if(w/h^2 > 18.5) & (w/h^2 < 25)
und die dritte Zeichenfolge, wenn keine der oben genannten Bedingungen erfüllt ist. Anstatt eine Reihe von Vergleichen zu erstellen, können Sie die Zeichenfolge einfach mit: vergleichenw/h^2 < [18.5, 25]
, wodurch eines der folgenden Arrays[1 1], [0 1], [0,0]
für Untergewicht, Normal und Übergewicht zurückgegeben wird.[18.5,25]
dauert 9 Bytes, was sehr viel ist. Stattdessen multiplizieren wir den BMI mit 2 und vergleichen das Ergebnis mit[37, 50]
oder'%2'
in ASCII. Das spart drei Bytes.quelle
Perl 6 , 59 Bytes
Wie es funktioniert
Schade, dass die Zeichenfolge
erweight
wiederholt werden muss, aber alle Variationen, die ich ausprobiert habe, um dies zu vermeiden, haben die Gesamtanzahl der Bytes erhöht:Bei Zeichenfolgensubstitution 62 Bytes:
Bei String-Interpolation 67 Bytes:
Grobe Übersetzung der Python-Lösung von xnor , 65 Byte:
quelle
PowerShell , 81 Byte
Probieren Sie es online!
Erläuterung
Das Hauptbit, das erklärt werden muss, ist
18.5,25 -lt $b
(wo ich$b
den BMI ersetze, der im Code berechnet wird). Die meisten Operatoren in PowerShell geben bei Angabe eines Arrays auf der linken Seite ein Array von Elementen zurück, die den Test erfüllen, anstatt einen booleschen Wert zurückzugeben. Dies gibt also ein leeres Array zurück, wenn$b
es kleiner als 18,5 ist, ein Array, das nur 18,5 enthält, wenn es sich in der Mitte befindet, und ein Array, das sowohl 18,5 als auch 25 enthält, wenn es größer als 25 ist.Ich verwende die Anzahl der Elemente als Index für ein Array der Zeichenfolgen, also
0
erhält count das Element,0
das ist'Underweight'
usw.quelle
OCaml, 93 Bytes
quelle
Python,
7574 BytesProbieren Sie es online!
Ziemlich einfache Lösung, die die Techniken anderer Leute nutzt, um sie zu lösen.
Vielen Dank an @ovs für das Speichern eines Bytes.
Alternativen
1,73 Bytes
Ich lehnte dies ab, da es einer anderen Antwort, die ich sah, zu ähnlich war.
2. 71 Bytes
Ich lehnte diese , denn trotz der Arbeit an allen Tests in der Frage, gibt es einige Zahlen es nicht auf , wie es die fehlenden
=
in der<=
.quelle
25
und ist nicht erforderlich. Dieelse
Verwendung von Kurzschlüssenand/or
(wie in @ovs kommentiert) ist jedoch kürzer.25
undelse
, Sie auf jeden Fall tun müssen es mit einigen ( die meisten?) Dolmetscher (einschließlich CPython, IIRC). Wenn Sie es so schreiben25else
,25e
wird das als Beginn eines numerischen Literales in wissenschaftlicher Notation interpretiert, und der Interpreter fängt an zu blinken, wenn es keine folgenden Ziffern gibt.C #,
636261 BytesDank TheLethalCoder 1 weiteres Byte gespeichert .
1 Byte dank anonymen Benutzers gespeichert.
Eine ziemlich unkomplizierte anonyme Funktion. Der ganze Trick besteht darin, den ternären Operator zu verwenden, um direkt zurückzukehren
return
Schlüsselwort, ein Paar geschweifte Klammern und eine Variablendeklaration und -zuweisung werden ).Volles Programm mit Testfällen:
quelle
Common Lisp,
8987858483 BytesEine Funktion:
Anwendungsbeispiel:
Probieren Sie es online! (Ich habe die Druckfunktion hinzugefügt, um die Ausgabe in TIO zu sehen.)
Verbesserungsvorschläge sind willkommen.
quelle
MATL,
54454442 BytesProbieren Sie es bei matl.suever.net
Beginnt damit, den BMI zu berechnen und zu verdoppeln
U\E
, und erstellt dann den Vektor[37 50]
mit dem String-Literal '% 2'. Vergleicht den BMI mit diesem Vektor und verwendet if-Anweisungen, um die Antwort zu erhalten. Dabei wirdnormal
ein vordefiniertes Literal verwendet17Y0
.quelle
[BC]UQ
mit'%2'
und 2 Bytes speichern.Java 8, 61 Bytes
Ordne a zu
DoubleFunction<DoubleFunction<String>>
und rufe so auf:quelle
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
Kann nicht w zuweisen.int w = ... , h = ... ; System.out.println((w/=h*h)<18.5?"Underweight":w<25?"Normal":"Overweight")
, sorry :)Gleichstrom , 64 Bytes
Probieren Sie es online!
quelle
3k[Overweight]??2^/dsp[[Normal]][[Underweight]]sasb25>blp18.5>ap
.Javascript (ES6), 63 Byte
Beispiel
quelle
Schnell, 97 Bytes
quelle
Japt , 46 Bytes
Probieren Sie es online!
Inspiriert von der Antwort von @ Luke .
Erläuterung
Dekomprimiert zu:
Japt hat eine implizite Eingabe
U
. Die zweite Eingabe istV
.Japt benutzt das Shoco-Bibliothek zur Komprimierung von Strings. Backticks werden zum Dekomprimieren von Strings verwendet.
Verwendete Unicode-Verknüpfungen:
quelle
PHP , 121 Bytes
Probieren Sie es online!
quelle
Scala, 124 Bytes
quelle
REXX, 113 Bytes
quelle