Apa Indeks Massa Tubuh saya?

21

Masalah:

Tugas Anda adalah menulis program yang memasukkan tinggi (dalam meter) dan berat (dalam kilogram), dan menampilkan kategori BMI yang sesuai.

BMI adalah ukuran rasio berat Anda dengan tinggi badan Anda. Itu tanggal dan tidak akurat untuk banyak orang , tetapi itu tidak masalah di sini!

BMI dapat dihitung dengan menggunakan persamaan berikut:

BMI = (mass in kilograms) / (height in meters)^2

Kategori akan didefinisikan sebagai berikut:

  • BMI <18.5: "Kurang Berat"

  • 18,5 <= BMI <25: "Normal"

  • 25 <= BMI: "Kegemukan"

Demi tantangan, saya mengabaikan semua kategori "ekstrem". Juga, karena beberapa angka seperti "25" berada di antara 2 kategori, saya menyesuaikan batasnya sedikit sehingga ada jawaban yang pasti.

Anda dapat menulis fungsi, atau program lengkap.

Memasukkan:

Masukan bisa dalam bentuk apa pun yang masuk akal. Dua angka (atau string), baik sebagai 2 argumen terpisah, atau sebagai string tunggal. Array / daftar 2 angka, kamus dengan kunci "berat" dan "tinggi" ... Nilai desimal harus didukung. Anda dapat mengasumsikan input akan selalu valid (tidak ada nilai negatif, dan tinggi tidak akan pernah menjadi 0).

Keluaran:

Output akan berupa string yang berisi nama kategori case-insensitive . String harus cocok dengan nama kategori persis seperti di atas, mengabaikan case. Ini bisa menjadi output ke stdout, dikembalikan (dalam kasus fungsi), atau ditulis ke file.

Kasus Uji (berat, tinggi => hasil):

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)

Inilah beberapa pseudocode yang memperlihatkan contoh implementasi:

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"

Ini adalah kode-golf, sehingga jumlah byte terkecil yang menang.

(Ya, tugas ini sangat sepele dalam kebanyakan bahasa. Sebagian besar tantangan belakangan ini tampaknya lebih sulit daripada biasanya, jadi saya pikir saya akan memposting yang lebih mudah diakses).


CATATAN! Satu jam setelah saya memposting tantangan ini, saya harus memodifikasi rentang sedikit karena rentang yang dinyatakan memiliki "lubang" seperti yang ditunjukkan dalam komentar. Silakan lihat rentang baru.

Carcigenicate
sumber

Jawaban:

9

Jelly , 24 byte

÷÷⁹Ḥ“%2‘>Sị“$⁽¿“;ṅẒ“&ċ)»

Cobalah online!

Bagaimana?

Menghitung BMI, menggandakannya, membandingkannya dengan yang lebih besar dari operator dengan masing-masing angka 37 dan 50 (18,5 dan 25 dua kali lipat), menjumlahkan yang dihasilkan dan nol (menghasilkan 1, 2, atau 0 untuk Normal, Underweight, dan Overweight) masing-masing) dan indeks ke dalam daftar string ["Normal","Underweight","Overweight"].

÷÷⁹Ḥ“%2‘>Sị“$⁽¿“;ṅẒ“&ċ)» - Main link: weight, height
÷                        - weight ÷ height
  ⁹                      - right argument, height
 ÷                       - ÷ by height again to get the BMI
   Ḥ                     - double the BMI
    “%2‘                 - list of code page indexes [37,50]
        >                - greater than? (vectorises) - i.e [18.5>bmi, 25>bmi]
         S               - sum -- both:=2 (Underweight), just 50:=1 (Normal) or neither:=0 (Overweight)
          ị              - index into (1-based)
           “$⁽¿“;ṅẒ“&ċ)» - compressed list of strings ["Normal","Underweight","Overweight"]
                         - implicit print
Jonathan Allan
sumber
1
Wow. Bicara tentang kebingungan. Jika ini golf, saya pikir Anda punya satu lubang! Atau 24 ...
Cullub
2
@cullub terdiri dari 24 karakter dan 24 byte - Jelly menggunakan kode-halamannya sendiri yang terhubung dengan kata "byte" dalam heading, mothereff.in menghitung Unicode, saya percaya.
Jonathan Allan
1
@ TheBitByte, ya, lihat penghitung tautan TIO "24 chars, 24 byte (SBCS)" atau hitung dengan tangan menggunakan halaman kode yang ditautkan oleh byte dalam tajuk.
Jonathan Allan
... as hex:1C 1C 89 AF FE 25 32 FC 3E 53 D8 FE 24 8D 0B FE 3B F0 BD FE 26 E8 29 FB
Jonathan Allan
21

Python , 69 byte

lambda w,h:["UOnvd"[w/h/h>20::2]+"erweight","Normal"][18.5<=w/h/h<25]

Cobalah online!

Bandingkan dengan 72 byte:

lambda w,h:"Underweight"*(w/h/h<18.5)or"Normal"*(w/h/h<25)or"Overweight"
Tidak
sumber
10

TI-Basic, 58 54 byte

Input 
X/Y²→C
"NORMAL
If 2C≤37
"UNDERWEIGHT
If C≥26
"OVERWEIGHT

Juga, untuk bersenang-senang, inilah versi yang lebih ringkas yang lebih banyak byte:

Prompt A,B
sub("UNDERWEIGHTNORMAL      OVERWEIGHT ",sum(A/B²≥{18.5,25})11+1,11

Yang bisa saya katakan adalah, terima kasih telah membuat case-insensitive ini;)

PS Inputmengambil input grafik ke Xdan Ymirip denganPrompt X,Y

Timtech
sumber
Juga, saya telah melihat ini berkali-kali, dan saya tidak berpikir ada cara untuk menyimpan byte meskipun dua yang terakhir berbagi stringERWEIGHT
Timtech
Karena penasaran, bagaimana hal itu akan mengubah jawaban Anda jika saya menerapkan sensitivitas huruf besar-kecil?
Carcigenicate
1
@Carcigenicate Dalam TI-Basic, huruf kecil masing-masing dua byte. Dengan demikian, itu akan meningkatkan jumlah byte dengan banyak.
Timtech
1
Ah, begitu. Itu aneh.
Carcigenicate
1
@Carcigenicate Penting untuk diingat bahwa versi TI-Basic ini diperkenalkan pada tahun 1990 sebagai bahasa kalkulator ... tidak ada yang tahu saya akan bermain golf 27 tahun kemudian
Timtech
6

Mathematica, 67 byte

"Normal"["Underweight","Overweight"][[Sign@⌊(2#/#2^2-37)/13⌋]]&

Menggunakan fakta yang a[b,c][[Sign@d]]mengembalikan ajika dsama dengan 0, mengembalikan bjika dpositif, dan mengembalikan cjika dnegatif. ⌊...⌋adalah Floorfungsi Mathematica menggunakan karakter tiga byte U + 230A dan U + 230B. Tidak dapat menemukan cara melakukan lebih baik daripada menggunakan weightdua kali.

Greg Martin
sumber
3
Surprised Mathematica tidak memiliki bawaan untuk ini
Daniel
1
Anda harus pergi ke fiksi penggemar untuk itu;)
Greg Martin
5

Ruby, 91 77 74 67 byte

Percobaan naif pertama:

->(w,h){case w/h/h
when 0..18.5
'underweight'
when 18.5..25
'normal'
else
'overweight'
end}

Percobaan kedua dengan "inspirasi" dari jawaban sebelumnya:

->w,h{["#{(w/=h*h)<18.5?'und':'ov'}erweight",'normal'][(18.5..25)===(w)?1:0]}

Percobaan ketiga:

->w,h{["#{(w/=h*h)<18.5?'und':'ov'}erweight",'normal'][w>=18.5&&w<25?1:0]}

Percobaan keempat:

->w,h{18.5<=(w/=h*h)&&w<25?'normal':"#{w<18.5?'und':'ov'}erweight"}

Cobalah online!

Reitermarkus
sumber
reitermarkus dari homebrew-tong? Woah, tidak berharap melihat Anda di sini! : o
numbermaniac
1
@numbermaniac, haha, ya, ini aku! 😂
reitermarkus
5

JavaScript (ES6), 70 67 64 63 byte

Disimpan 4B berkat Arnauld

a=>b=>(a/=b*b)<25&a>=18.5?"Normal":(a<19?"Und":"Ov")+"erweight"

Pemakaian

f=a=>b=>(a/=b*b)<25&a>=18.5?"Normal":(a<19?"Und":"Ov")+"erweight"
f(80)(1)

Keluaran

"Overweight"

Penjelasan

Jawaban ini cukup sepele, meskipun ada satu trik pintar: Underweightdan Overweightkeduanya berakhir erweight, jadi kita hanya perlu mengubah karakter tersebut.

Saya berasumsi itu Normalberarti BMI antara 25 (eksklusif) dan 18,5 (inklusif). Underweightberarti BMI kurang dari 18,5, dan Overweightberarti BMI lebih besar dari atau sama dengan 25.

Luke
sumber
1
Sekarang jawabannya tidak mengandung fitur ES7 ;-)
ETHproduksi
4

C, 81 byte

f(float m,float h){m/=h*h;puts(m<26?m<18.6?"Underweight":"Normal":"Overweight");}
Steadybox
sumber
4

05AB1E , 28 byte

n/©37;‹®25‹O’‚Š‰ß î ‚â‰ß’#è

Menggunakan pengkodean CP-1252 . Cobalah online!

Adnan
sumber
4

QBIC , 61 58 byte

::m=a/b^2~m<18.5|?@Und`+@erweight`\~m>=25|?@Ov`+B\?@Normal

@ Lukas menggunakan the Force dan memotong dua byte. Terima kasih!

Perubahan aturan disimpan byte lain.

Penjelasan:

::          gets weight and height as a and b
m=a/b^2     Calculates BMI
~m<18.5|    If BMI < 18.5 then
?@Und`      Print the string literal 'Und' (which is now A$)
+@erweight` and the string literal 'erweight'  (which is now B$)
\~m>=25|    else if the BMI is greater than or equal to 25
?@Ov`+B     Print 'Ov' and B$ ('erweight')
\?@Normal   Else, if we're here, BMI is normal.
steenbergh
sumber
3

Python 2 , 72 byte

lambda a,b:"UNOnovdreemrrawwlee ii gg hh tt"[(18.6<a/b/b)+(a/b/b>25)::3]

Cobalah online!

DJMcMayhem
sumber
Bagaimana Anda mendapatkan warna untuk Python? Saya tidak pernah menemukan jawabannya.
@JackBates Hanya saja <!-- language-all: lang-python -->TIO secara otomatis dimasukkan untuk saya.
DJMcMayhem
3

Python 3, 97 95 byte

a,b=map(int,input().split())
a/=b*b*5
print(["UOnvd"[a>93::2]+"erweight","Normal"][93<=a<=125])

Program lengkap.

Kalikan dengan lima untuk menghemat satu byte. Terima kasih Jonathan Allan.

Baris demi baris:

  1. Memetakan dua nomor input pengguna yang dipisahkan ruang ke int. Buka paket ke a dan b.

  2. Menghitung

  3. Jika bmi adalah antara 18,6 dan 25, termasuk, ekspresi di sebelah kanan akan dievaluasi menjadi True. Boolean dapat berupa 0 atau 1 saat digunakan sebagai indeks daftar, jadi kita mendapatkan "Normal" atau string yang dikonstruksi dalam indeks nol. "erweight" adalah sufiks bersama untuk dua opsi yang tersisa, jadi itu tidak perlu diulang. Kemudian kita menggunakan pola [start: stop: step] dari daftar Python / slicing string. c> 18.6 akan mengevaluasi ke 0 atau 1 (Salah atau Benar) dan menjadi awal kami. Berhenti tidak diindikasikan jadi kami pergi ke akhir literal. Langkah 2 jadi kami ambil setiap indeks detik. Jika mulai mulai evaluasi ke 1, kami mendapatkan "Ov", jika tidak, kami akan "Und". Apa pun yang terjadi, kami menambahkan "penghapusan" pada apa yang kami dapatkan dan kami memiliki hasil akhir.

mypetlion
sumber
1
Tulis sebagai fungsi untuk 79:def f(h,w):c=h/w/w;print(["UOnvd"[c>18.6::2]+"erweight","Normal"][18.6<=c<=25])
Jonathan Allan
Jika Anda mengalikannya dengan lima pertama, Anda dapat menyimpan byte dengan membandingkan ke 93dan 125. Jika Anda menggunakan lambda, Anda harus menghitung cdi kedua tempat tetapi tidak perlu menyebutkan fungsi atau penggunaannya print(), begitu juga lambda h,w:["UOnvd"[h/w/w*5>93::2]+"erweight","Normal"][93<=h/w/w*5<=125]dengan 73.
Jonathan Allan
... sebenarnya karena Anda akan menghitung cdua kali lipat dengan 5 biaya lebih banyak daripada yang dihemat di lambda, jadi hanya lambda h,w:["UOnvd"[h/w/w>18.6::2]+"erweight","Normal"][18.6<=h/w/w<=25]untuk 72
Jonathan Allan
Jonathan Allan Seseorang sudah melakukannya hanya sebagai fungsi.
mypetlion
Tidak apa-apa, jalan Anda akan mengalahkan mereka: D
Jonathan Allan
3

R, 89 84 80 74 byte

f=pryr::f(c('Overweight','Normal','Underweight')[sum(w/h^2<c(18.5,25),1)])

Dengan anggukan pada jawaban Oktaf StewieGriffin, menciptakan serangkaian string, lalu merangkum hasilnya BMI < c(18.5,25) dan mereferensikan array pada posisi itu +1.

Argumen pertama harus tinggi, lalu berat; jika itu tidak diizinkan, maka

f=pryr::f(w,h,c('Overweight','Normal','Underweight')[sum(w/h^2<c(18.5,25),1)])

bekerja untuk 4 byte lagi.

BLT
sumber
2

Clojure, 63 byte

#(condp <(/ %(* %2 %2))25"Overweight"18.5"Normal""Underweight")
NikoNyrh
sumber
Mengutuk. Seperti biasa, ini adalah versi yang lebih pendek dari apa yang saya pikirkan.
Carcigenicate
2

dc , 58 byte

Fk[Ov]?2^/d[[Normal]pq][[Und]26]sasb18.5>a25>bn[erweight]p

Mengambil input sebagai 2 angka yang dipisahkan spasi dalam format <mass> <height>. Menghasilkan string pada baris yang terpisah.

Cobalah online!

Penjelasan

Untuk keperluan penjelasan ini, masukannya adalah 80 1.

Fk                                                         # Set decimal precision to `16`.
  [Ov]                                                     # Push the string "Ov" onto the main stack.
                                                           # Main Stack: [[Ov]]
      ?2^/d                                                # Take and evaluate input, squaring the 2nd one, and the dividing by the first one by the 2nd. Then duplicate the result.
                                                           # Main Stack: [[Ov],80.000000000000000,80.000000000000000]
           [[Normal]pq][[Und]26]sasb                       # Push and store the executable macros "[Normal]pq" and "[Und]26" on registers "a" and "b", respectively.
                                                           # Main Stack: [[Ov],80.000000000000000,80.000000000000000], reg. a: [[[Normal]pq]], reg. b: [[[Und]26]]
                                    18.5>a25>b             # Push, "18.5" onto stack, and then pop top 2 values. If "18.5 > (top of stack)", then execute the macro on top of reg. "a", which in turn pushes the string "Und" onto the main stack followed by the number 26.
                                                           # The "26" will automatically prompt the next comparison to not execute the macro on top of reg. "b", regardless of the value on top of the main stack.
                                                           # Otherwise, if "18.5 <= (top of stack) < 25", then execute "b"s macro, which in turn pushes the string "Normal" onto the main stack, outputs it, then quits the program.
                                                           # In this case, Main stack: [[Ov]], reg. a: [[[Normal]pq]], reg. b: [[[Und]26]]
                                              n[erweight]p # If "Normal" has not been output, only then will the program get to this point. Here, it will output whatever string, either "Und" or "Ov", on top of the main stack, followed by "erweight" and a new line.
R. Kap
sumber
2

Oktaf, 64 byte

@(w,h){'Underweight','Normal','Overweight'}{3-sum(2*w/h^2<'%2')}

Cobalah online

Ini adalah fungsi anonim yang mengambil dua argumen input, h(tinggi) danw (berat).

Fungsi membuat array sel yang berisi string di sana 'Underweight','Normal','Overweight', dan menampilkan nomor string3-sum(2*w/h^2<'%2') .

Ya, yang itu terlihat agak aneh. Kami ingin string pertama jika w/h^2<=18.5, string kedua jika (w/h^2 > 18.5) & (w/h^2 < 25)dan string ketiga jika tidak ada kondisi di atas yang benar. Alih-alih membuat banyak perbandingan, kita cukup membandingkan string ke:, w/h^2 < [18.5, 25]yang akan mengembalikan salah satu array berikut[1 1], [0 1], [0,0] untuk masing-masing Underweight, Normal, dan Overweight.

[18.5,25]membutuhkan 9 byte, yang banyak. Apa yang kami lakukan sebagai gantinya, adalah mengalikan BMI dengan 2, dan membandingkan hasilnya dengan [37, 50], atau '%2'dalam ASCII. Ini menghemat tiga byte.

Stewie Griffin
sumber
2

Perl 6 , 59 byte

{<Overweight Normal Underweight>[sum 18.5,25 X>$^a/$^b**2]}

Bagaimana itu bekerja

{                                                         }  # A lambda.
                                               $^a/$^b**2    # Compute BMI from arguments.
                                     18.5,25 X>              # Compare against endpoints.
                                 sum                         # Add the two booleans together.
 <Overweight Normal Underweight>[                        ]   # Index into hard-coded list.

Sayang sekali string erweightharus diulang, tetapi semua variasi saya mencoba untuk menghindari yang akhirnya meningkatkan jumlah byte keseluruhan:

  • Dengan substitusi string, 62 byte:

    {<Ov_ Normal Und_>[sum 18.5,25 X>$^a/$^b**2].&{S/_/erweight/}}
  • Dengan interpolasi string, 67 byte:

    {$_='erweight';("Ov$_","Normal","Und$_")[sum 18.5,25 X>$^a/$^b**2]}
  • Terjemahan kasar dari solusi Python xnor , 65 byte:

    {$_=$^a/$^b**2;25>$_>=18.5??"Normal"!!<Und Ov>[$_>19]~"erweight"}
seseorang
sumber
2

PowerShell , 81 byte

param($m,$h)('Underweight','Normal','Overweight')[(18.5,25-lt($m/($h*$h))).Count]

Cobalah online!

Penjelasan

Bit utama yang perlu dijelaskan adalah 18.5,25 -lt $b(di mana saya mengganti $bBMI yang dihitung di tempat dalam kode). Sebagian besar operator di PowerShell, ketika diberi array di sisi kiri, mengembalikan array item yang memenuhi tes, alih-alih mengembalikan nilai boolean. Jadi ini akan mengembalikan array kosong jika$b lebih kecil dari 18.5, array yang hanya mengandung 18.5 jika berada di tengah, dan array yang mengandung 18.5 dan 25 jika lebih besar dari 25.

Saya menggunakan hitungan elemen sebagai indeks ke dalam array string, jadi menghitung 0mendapat elemen 0yang 'Underweight', dll.

briantis
sumber
2

OCaml, 93 byte

let b w h=if w/.h/.h<18.5 then"underweight"else if w/.h/.h>=25.0 then"overweight"else"normal"
Reitermarkus
sumber
Tidak, ini sebuah fungsi.
reitermarkus
2

Python, 75 74 byte

lambda h,w:18.5<=w/h/h<=25and"normal"or["ov","und"][25>w/h/h]+"erwe‌​ight"

Cobalah online!

Solusi yang cukup mendasar yang memanfaatkan teknik orang lain untuk menyelesaikannya.

Terima kasih @ovs karena menyimpan byte.

Alternatif

1. 73 byte

lambda h,w:"normal"if 18.5<=w/h/h<=25 else"uonvd"[25<w/h/h::2]+"erweight"

Saya menolak ini karena terlalu mirip dengan jawaban lain yang saya lihat.

2. 71 byte

lambda h,w:"normal"if 18.5<w/h/h<25 else"uonvd"[25<w/h/h::2]+"erweight"

Saya menolak ini karena, meskipun mengerjakan semua tes dalam pertanyaan, ada beberapa angka yang bisa gagal karena tidak ada =dalam <=.


sumber
Anda tidak memerlukan ruang di antara 25dan else- tetapi bagaimanapun juga, menggunakan hubungan arus pendek and/or(seperti komentar @ovs) lebih pendek.
FlipTack
@FlipTack: mengenai ruang antara 25dan else, Anda pasti lakukan perlu dengan beberapa (kebanyakan?) Penafsir (termasuk CPython, IIRC). Jika Anda menuliskannya 25else, maka 25editafsirkan sebagai awal dari literal numerik notasi ilmiah, dan penerjemah kemudian berbicara ketika tidak ada digit berikut.
Mac
2

C #, 63 62 61 byte

Disimpan 1 byte lebih banyak berkat TheLethalCoder .

Disimpan 1 byte berkat pengguna anonim.

w=>h=>w/h/h<18.5?"Underweight":w/h/h<25?"Normal":"Overweight";

Fungsi anonim yang sangat mudah. Seluruh trik menggunakan operator ternary untuk kembali secara langsung (sehingga menghilangkan returnkata kunci, sepasang kurung kurawal dan deklarasi dan penugasan variabel).

Program lengkap dengan kasus uji:

using System;

class BodyMassIndex
{
    static void Main()
    {
        Func<double, Func<double, string>> f =
        w=>h=>w/h/h<18.5?"Underweight":w/h/h<25?"Normal":"Overweight";

        // test cases:
        Console.WriteLine(f(80)(1));  // "Overweight"
        Console.WriteLine(f(80)(2));  // "Normal"
        Console.WriteLine(f(80)(3));  // "Underweight"
        Console.WriteLine(f(50)(1));  // "Overweight"
        Console.WriteLine(f(50)(1.5));  // "Normal"
        Console.WriteLine(f(50)(2));  // "Underweight"
    }
}
adrianmp
sumber
2

Common Lisp, 89 87 85 84 83 byte

Sebuah fungsi:

(lambda(w h)(if(< #1=(/ w(* h h))18.5)'underweight(if(< #1#25)'normal'overweight)))

Contoh penggunaan:

((lambda(w h)(if(< #1=(/ w(* h h))18.5)'underweight(if(< #1#25)'normal'overweight)))150 2)

Cobalah online! (Saya menambahkan fungsi pencetakan untuk melihat keluaran dalam TIO)

Ide untuk perbaikan disambut.


sumber
2

MATL, 54 45 44 42 byte

U/E'%2'<sqt?q?'ov'}'und']'erweight'h}x17Y0

Cobalah di matl.suever.net

Mulai dengan menghitung BMI dan menggandakannya U\E, kemudian membuat vektor [37 50]dengan string literal '% 2'. Bandingkan BMI dengan vektor ini dan gunakan pernyataan if untuk mendapatkan jawabannya, manfaatkan normalsebagai literal yang sudah ditentukan sebelumnya 17Y0.

B. Mehta
sumber
Anda dapat mengganti [BC]UQdengan '%2'dan menyimpan 2 byte.
sundar - Reinstate Monica
1

Java 8, 61 byte

w->h->w/h/h<18.5?"Underweight":w/h/h<25?"Normal":"Overweight"

Tetapkan ke a DoubleFunction<DoubleFunction<String>>dan panggil dengan demikian:

bmi.apply(50).apply(1.5)
David Conrad
sumber
Anda bisa meluangkan satu byte oleh menggunakan kembali w: w->h->(w/=h*h)<18.5?"Underweight":w<25?"Normal":"Overweight".
Olivier Grégoire
@ OlivierGrégoire Tidak :( Tidak Error: local variables referenced from a lambda expression must be final or effectively finaldapat menugaskan ke.
David Conrad
1
Oh ... Saya sudah cek dengan barang-barang inline seperti int w = ... , h = ... ; System.out.println((w/=h*h)<18.5?"Underweight":w<25?"Normal":"Overweight"), maaf :)
Olivier Grégoire
@ OlivierGrégoire Tidak masalah. Saya berharap Jawa mengizinkannya.
David Conrad
1

dc , 64 byte

[erweight][[Und]PszPq]su[[Normal]Pq]sn9k?d*/d18.5>ud25>n[Ov]PszP

Cobalah online!

Mitchell Spector
sumber
Sial! Kalahkan saya beberapa detik saja. Saya akan memposting milik saya, sampai saya melihat ini. Anyways, di sini adalah satu lagi jawaban 64 byte: 3k[Overweight]??2^/dsp[[Normal]][[Underweight]]sasb25>blp18.5>ap.
R. Kap
@ R.Kap Anda benar-benar dapat membuat milik Anda menjadi lebih pendek satu byte dari milik saya dengan menghilangkan salah satu tanda tanya.
Mitchell Spector
Oh ya, aku lupa kalau aku bisa melakukan itu. Anda dapat memposting itu sebagai milik Anda jika Anda mau.
R. Kap
Tidak, tidak apa-apa - silakan dan posting sendiri, itu solusi Anda. (Anda dapat kredit saya untuk satu byte jika Anda mau.)
Mitchell Spector
Omong-omong, saya bisa menurunkannya menjadi 58 byte. :)
R. Kap
1

Javascript (ES6), 63 byte

(m,h)=>(w="erweight",b=m/h/h)<18.5?"Und"+w:b<25?"Normal":"Ov"+w

Contoh

f=(m,h)=>(w="erweight",b=m/h/h)<18.5?"Und"+w:b<25?"Normal":"Ov"+w

console.log(f(80, 1));
console.log(f(80, 2));
console.log(f(80, 3));

Jan
sumber
1

Swift, 97 byte

{(w:Float,h)->String in return 18.5<=w/h/h&&w/h/h<25 ?"normal":"\(w/h/h>25 ?"ov":"und")erweight"}
Reitermarkus
sumber
1

Japt , 46 byte

/=V²U<25©U¨18½?`NŽµl`:ºU<19?`U˜`:"Ov")+`€³ight

Cobalah online!

Terinspirasi oleh jawaban @ Luke .

Penjelasan

/=V²U<25©U¨18½?`NŽµl`:ºU<19?`U˜`:"Ov")+`€³ight  

Dekompresi ke:

U=U/V**2,U<25&&U>18.5?"Normal":(U<19?"Und":"Ov")+"erweight"

Japt memiliki input implisit U. Input kedua adalah V.

Japt menggunakan perpustakaan shoco untuk kompresi string. Backticks digunakan untuk mendekompresi string.

Pintasan Unicode digunakan:

² : **2
© : &&
¨ : >=
½ : .5
º : ((
Oliver
sumber
1

PHP , 121 byte

function f($a,$b){$i=$a/($b*$b);$x = 18.5;print ($i<$x?"Underweight":($i>=$x&&$i<25?"Normal":($i>=25?"Overweight":"")));}

Cobalah online!

Tom291
sumber
1

Scala, 124 byte

val x="erweight"
def b(i:Float,a:Float):Any=i/a/a match{case z if(z<18.5)=>"Und"+x
case z if(z<25)=>"Normal"
case z=>"Ov"+x}
Roman Gräf
sumber
1

REXX, 113 byte

arg m h
b=m/h**2
e=erweight
select
  when b<18.5 then say 'UND'e
  when b>=25 then say 'OV'e
  otherwise say Normal
end
idrougge
sumber