Problem:
Twoim zadaniem jest napisanie programu, który przyjmuje jako dane wejściowe wysokość (w metrach) i wagę (w kilogramach) i wyświetla odpowiednią kategorię BMI.
BMI jest miarą stosunku masy ciała do wzrostu. Jest przestarzały i niedokładny dla wielu osób , ale to nie ma znaczenia tutaj!
BMI można obliczyć za pomocą następującego równania:
BMI = (mass in kilograms) / (height in meters)^2
Kategorie zostaną zdefiniowane w następujący sposób:
BMI <18,5: „Niedowaga”
18,5 <= BMI <25: „Normalny”
25 <= BMI: „Nadwaga”
Ze względu na wyzwanie ignoruję wszystkie kategorie „ekstremalne”. Ponadto, ponieważ niektóre liczby, takie jak „25”, mieszczą się między 2 kategoriami, nieznacznie dostosowałem granice, aby uzyskać jednoznaczną odpowiedź.
Możesz napisać funkcję lub pełny program.
Wkład:
Dane wejściowe mogą mieć dowolną rozsądną formę. Dwie liczby (lub ciągi), albo jako 2 osobne argumenty, albo jako pojedynczy ciąg. Tablica / lista 2 liczb, słownik z klawiszami „waga” i „wzrost” ... Wartości dziesiętne powinny być obsługiwane. Możesz założyć, że dane wejściowe będą zawsze prawidłowe (brak wartości ujemnych, a wysokość nigdy nie będzie wynosić 0).
Wydajność:
Dane wyjściowe będą ciągiem zawierającym nazwy kategorii bez rozróżniania wielkości liter . Ciągi muszą pasować do nazw kategorii dokładnie tak, jak powyżej, ignorując wielkość liter. Może być wyprowadzony na standardowe wyjście, zwrócony (w przypadku funkcji) lub zapisany w pliku.
Przypadki testowe (waga, wzrost => wynik):
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)
Oto pseudokod pokazujący przykładową implementację:
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"
To jest golf golfowy, więc wygrywa najmniejsza liczba bajtów.
(Tak, to zadanie jest niezwykle trywialne w większości języków. Większość wyzwań wydaje się ostatnio trudniejsza niż zwykle, więc pomyślałem, że opublikuję bardziej dostępne).
UWAGA! Godzinę po opublikowaniu tego wyzwania musiałem nieco zmodyfikować zakresy, ponieważ podane zakresy miały „dziury”, jak wskazano w komentarzach. Zobacz nowe zakresy.
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 bajtów
Wypróbuj online!
Porównaj z 72 bajtami:
źródło
TI-Basic,
5854 bajtówPonadto, dla zabawy, oto bardziej kompaktowa wersja, która ma więcej bajtów:
Wszystko, co mogę powiedzieć, to dziękuję za uczynienie tego bez rozróżniania wielkości liter;)
PS
Input
pobiera dane wejściowe z wykresuX
iY
podobnePrompt X,Y
źródło
ERWEIGHT
Mathematica, 67 bajtów
Wykorzystuje fakt, że
a[b,c][[Sign@d]]
zwraca,a
jeślid
jest równe 0, zwraca,b
jeślid
jest dodatnia, i zwraca,c
jeślid
jest ujemna.⌊...⌋
toFloor
funkcja Mathematica wykorzystująca trzy bajtowe znaki U + 230A i U + 230B. Nie mogłem wymyślić, jak to zrobić lepiej, niżweight
dwa razy.źródło
Ruby,
91777467 bajtówPierwsza naiwna próba:
Druga próba z „inspiracją” z poprzednich odpowiedzi:
Trzecia próba:
Czwarta próba:
Wypróbuj online!
źródło
JavaScript (ES6),
70 67 6463 bajtówZaoszczędź 4B dzięki Arnauldowi
Stosowanie
Wydajność
Wyjaśnienie
Ta odpowiedź jest dość banalna, choć istnieje jeden sprytny trik:
Underweight
aOverweight
oba kończą sięerweight
, więc mamy tylko zmienić te znaki.Zakładam, że
Normal
oznacza to BMI między 25 (wyłączny) a 18,5 (włącznie).Underweight
oznacza BMI mniejsze niż 18,5 iOverweight
oznacza BMI większe lub równe 25.źródło
C, 81 bajtów
źródło
05AB1E , 28 bajtów
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
QBIC ,
6158 bajtów@Luke użył Mocy i odciął dwa bajty. Dzięki!
Zmiana reguł zapisała kolejny bajt.
Wyjaśnienie:
źródło
Python 2 , 72 bajty
Wypróbuj online!
źródło
<!-- language-all: lang-python -->
automatycznie wstawia dla mnie TIO.Python 3,
9795 bajtówPełny program
Pomnóż przez pięć, aby zapisać bajt. Dzięki Jonathan Allan.
Linia po linii:
Zamapuj dwie oddzielone spacjami liczby wejściowe użytkownika na ints. Rozpakuj do a i b.
Obliczać
Jeśli wartość bmi wynosi między 18,6 a 25 włącznie, wyrażenie po prawej stronie będzie miało wartość True. Wartości logiczne mogą mieć wartość 0 lub 1, gdy są używane jako indeksy list, więc otrzymujemy albo „Normalny”, albo skonstruowany ciąg w indeksie zerowym. „waga” to wspólny sufiks pozostałych dwóch opcji, więc nie trzeba go powtarzać. Następnie używamy wzorca [start: stop: step] w krojeniu list / ciągów znaków w języku Python. c> 18,6 oceni na 0 lub 1 (Fałsz lub Prawda) i stanie się naszym początkiem. Stop nie jest wskazany, więc przechodzimy do końca dosłowności. Krok 2, więc bierzemy co drugi indeks. Jeśli start start ma wartość 1, otrzymujemy „Ov”, w przeciwnym razie otrzymujemy „Und”. Tak czy inaczej, dołączamy „wagę” do tego, co otrzymaliśmy i mamy końcowy wynik.
źródło
def f(h,w):c=h/w/w;print(["UOnvd"[c>18.6::2]+"erweight","Normal"][18.6<=c<=25])
93
i125
. Jeśli używasz lambda, musisz obliczyćc
w obu miejscach, ale nie musisz nazywać funkcji ani używaćprint()
, więc możesz zrobić tolambda h,w:["UOnvd"[h/w/w*5>93::2]+"erweight","Normal"][93<=h/w/w*5<=125]
dla 73.c
dwukrotność pomnożenia przez 5 kosztuje więcej niż to oszczędza w lambda, więc tylkolambda h,w:["UOnvd"[h/w/w>18.6::2]+"erweight","Normal"][18.6<=h/w/w<=25]
dla 72R,
89848074 bajtyPrzytakując do odpowiedzi Octave StewieGriffina, tworzy tablicę ciągów, a następnie sumuje wynik
BMI < c(18.5,25)
i odwołuje się do tablicy w tej pozycji + 1.Pierwszym argumentem musi być wzrost, a następnie waga; jeśli to nie jest dozwolone, to
działa dla 4 kolejnych bajtów.
źródło
Clojure, 63 bajty
źródło
dc , 58 bajtów
Pobiera dane wejściowe jako 2 liczby oddzielone spacjami w formacie
<mass> <height>
. Wysyła ciąg w osobnej linii.Wypróbuj online!
Wyjaśnienie
Dla celów tego objaśnienia dane wejściowe to
80 1
.źródło
Oktawa, 64 bajty
Wypróbuj online
Jest to anonimowa funkcja, która pobiera dwa argumenty wejściowe
h
(wysokość) iw
(ciężar).Funkcja tworzy tablicę komórek zawierającą tam łańcuchy
'Underweight','Normal','Overweight'
i wyświetla numer łańcucha3-sum(2*w/h^2<'%2')
.Tak, ten wygląda trochę dziwnie. Chcemy pierwszy ciąg, jeśli
w/h^2<=18.5
, drugi ciąg if(w/h^2 > 18.5) & (w/h^2 < 25)
i trzeci ciąg if, jeśli żaden z powyższych warunków nie jest spełniony. Zamiast tworzyć wiele porównań, moglibyśmy po prostu porównać ciąg znaków do :, co zwróciłobyw/h^2 < [18.5, 25]
jedną z następujących tablic odpowiednio[1 1], [0 1], [0,0]
dla Niedowagi, Normalnej i Nadwagi.[18.5,25]
zajmuje 9 bajtów, co jest dużo. Zamiast tego mnożymy BMI przez 2 i porównujemy wynik z[37, 50]
lub'%2'
w ASCII. To oszczędza trzy bajty.źródło
Perl 6 , 59 bajtów
Jak to działa
Szkoda, że ciąg
erweight
musi być powtórzony, ale wszystkie odmiany, które próbowałem, aby tego uniknąć, spowodowały zwiększenie ogólnej liczby bajtów:Z podstawieniem łańcucha 62 bajty:
Z interpolacją ciągów, 67 bajtów:
Z grubsza tłumaczenie rozwiązania xnor w języku Python , 65 bajtów:
źródło
PowerShell , 81 bajtów
Wypróbuj online!
Wyjaśnienie
Najważniejszy bit, który wymaga wyjaśnienia, to
18.5,25 -lt $b
(gdzie zastępuję$b
BMI, który jest obliczany na miejscu w kodzie). Większość operatorów w PowerShell, gdy otrzymuje tablicę po lewej stronie, zwraca tablicę elementów, które spełniają test, zamiast zwracać wartość logiczną. To zwróci pustą tablicę if$b
jest mniejsza niż 18,5, tablicę zawierającą tylko 18,5, jeśli jest w środku, i tablicę zawierającą zarówno 18,5, jak i 25, jeśli jest większa niż 25.Liczenia elementów używam jako indeksu w tablicy ciągów, więc count
0
pobiera element,0
który jest'Underweight'
itd.źródło
OCaml, 93 bajty
źródło
Python,
7574 bajtówWypróbuj online!
Dość podstawowe rozwiązanie, które wykorzystuje techniki rozwiązywania problemów innych osób.
Dzięki @ovs za zapisanie bajtu.
Alternatywy
1. 73 bajty
Odrzuciłem to, ponieważ było zbyt podobne do innej odpowiedzi, którą widziałem.
2. 71 bajtów
Odrzuciłem to, ponieważ pomimo pracy nad wszystkimi testami w pytaniu, istnieją pewne liczby, na których może się nie powieść, ponieważ brakuje
=
w nim<=
.źródło
25
ielse
- ale w każdym razie użycie zwarciaand/or
(jak skomentował @ovs) jest krótsze.25
ielse
, na pewno zrobić to potrzebne niektóre (większość?) Tłumaczy (w tym CPython, IIRC). Jeśli napiszesz jako25else
,25e
interpretowany jest jako początek literału liczbowego z notacją naukową, a tłumacz interpretuje, gdy nie ma kolejnych cyfr.C #,
636261 bajtówZaoszczędził jeszcze 1 bajt dzięki TheLethalCoder .
Zapisano 1 bajt dzięki anonimowemu użytkownikowi.
Dość prosta anonimowa funkcja. Cała sztuczka polega na użyciu operatora trójskładnikowego do bezpośredniego powrotu (pomijając
return
słowo kluczowe, parę nawiasów klamrowych oraz zmienną deklarację i przypisanie).Pełny program z przypadkami testowymi:
źródło
Common Lisp,
8987858483 bajtówFunkcja:
Przykład użycia:
Wypróbuj online! (Dodałem funkcję drukowania, aby zobaczyć wyjście w TIO)
Pomysły na ulepszenia są mile widziane.
źródło
MATL,
54454442 bajtówWypróbuj na matl.suever.net
Zaczyna się od obliczenia BMI i podwojenia go
U\E
, a następnie tworzy wektor[37 50]
z literałem „% 2”. Porównuje BMI do tego wektora i używa instrukcji if, aby uzyskać odpowiedź, wykorzystującnormal
jako predefiniowany literał17Y0
.źródło
[BC]UQ
ze'%2'
i zapisać 2 bajty.Java 8, 61 bajtów
Przypisz do
DoubleFunction<DoubleFunction<String>>
i wywołaj w ten sposób:źródło
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
Nie można przypisać do w.int w = ... , h = ... ; System.out.println((w/=h*h)<18.5?"Underweight":w<25?"Normal":"Overweight")
przepraszam :)dc , 64 bajty
Wypróbuj online!
źródło
3k[Overweight]??2^/dsp[[Normal]][[Underweight]]sasb25>blp18.5>ap
.JavaScript (ES6), 63 bajty
Przykład
źródło
Szybki, 97 bajtów
źródło
Japt , 46 bajtów
Wypróbuj online!
Zainspirowany @ Łukasza odpowiedź .
Wyjaśnienie
Dekompresuje do:
Japt ma niejawny wkład
U
. Drugie wejście toV
.Japt używa biblioteki shoco do kompresji ciągów. Wsteczne są używane do dekompresji ciągów.
Zastosowane skróty Unicode:
źródło
PHP , 121 bajtów
Wypróbuj online!
źródło
Scala, 124 bajty
źródło
REXX, 113 bajtów
źródło