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.
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 byte
Cobalah online!
Bandingkan dengan 72 byte:
sumber
TI-Basic,
5854 byteJuga, untuk bersenang-senang, inilah versi yang lebih ringkas yang lebih banyak byte:
Yang bisa saya katakan adalah, terima kasih telah membuat case-insensitive ini;)
PS
Input
mengambil input grafik keX
danY
mirip denganPrompt X,Y
sumber
ERWEIGHT
Mathematica, 67 byte
Menggunakan fakta yang
a[b,c][[Sign@d]]
mengembalikana
jikad
sama dengan 0, mengembalikanb
jikad
positif, dan mengembalikanc
jikad
negatif.⌊...⌋
adalahFloor
fungsi Mathematica menggunakan karakter tiga byte U + 230A dan U + 230B. Tidak dapat menemukan cara melakukan lebih baik daripada menggunakanweight
dua kali.sumber
Ruby,
91777467 bytePercobaan naif pertama:
Percobaan kedua dengan "inspirasi" dari jawaban sebelumnya:
Percobaan ketiga:
Percobaan keempat:
Cobalah online!
sumber
JavaScript (ES6),
70 67 6463 byteDisimpan 4B berkat Arnauld
Pemakaian
Keluaran
Penjelasan
Jawaban ini cukup sepele, meskipun ada satu trik pintar:
Underweight
danOverweight
keduanya berakhirerweight
, jadi kita hanya perlu mengubah karakter tersebut.Saya berasumsi itu
Normal
berarti BMI antara 25 (eksklusif) dan 18,5 (inklusif).Underweight
berarti BMI kurang dari 18,5, danOverweight
berarti BMI lebih besar dari atau sama dengan 25.sumber
C, 81 byte
sumber
05AB1E , 28 byte
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
QBIC ,
6158 byte@ Lukas menggunakan the Force dan memotong dua byte. Terima kasih!
Perubahan aturan disimpan byte lain.
Penjelasan:
sumber
Python 2 , 72 byte
Cobalah online!
sumber
<!-- language-all: lang-python -->
TIO secara otomatis dimasukkan untuk saya.Python 3,
9795 byteProgram lengkap.
Kalikan dengan lima untuk menghemat satu byte. Terima kasih Jonathan Allan.
Baris demi baris:
Memetakan dua nomor input pengguna yang dipisahkan ruang ke int. Buka paket ke a dan b.
Menghitung
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.
sumber
def f(h,w):c=h/w/w;print(["UOnvd"[c>18.6::2]+"erweight","Normal"][18.6<=c<=25])
93
dan125
. Jika Anda menggunakan lambda, Anda harus menghitungc
di kedua tempat tetapi tidak perlu menyebutkan fungsi atau penggunaannyaprint()
, begitu jugalambda h,w:["UOnvd"[h/w/w*5>93::2]+"erweight","Normal"][93<=h/w/w*5<=125]
dengan 73.c
dua kali lipat dengan 5 biaya lebih banyak daripada yang dihemat di lambda, jadi hanyalambda h,w:["UOnvd"[h/w/w>18.6::2]+"erweight","Normal"][18.6<=h/w/w<=25]
untuk 72R,
89848074 byteDengan 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
bekerja untuk 4 byte lagi.
sumber
Clojure, 63 byte
sumber
dc , 58 byte
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
.sumber
Oktaf, 64 byte
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.sumber
Perl 6 , 59 byte
Bagaimana itu bekerja
Sayang sekali string
erweight
harus diulang, tetapi semua variasi saya mencoba untuk menghindari yang akhirnya meningkatkan jumlah byte keseluruhan:Dengan substitusi string, 62 byte:
Dengan interpolasi string, 67 byte:
Terjemahan kasar dari solusi Python xnor , 65 byte:
sumber
PowerShell , 81 byte
Cobalah online!
Penjelasan
Bit utama yang perlu dijelaskan adalah
18.5,25 -lt $b
(di mana saya mengganti$b
BMI 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
0
mendapat elemen0
yang'Underweight'
, dll.sumber
OCaml, 93 byte
sumber
Python,
7574 byteCobalah online!
Solusi yang cukup mendasar yang memanfaatkan teknik orang lain untuk menyelesaikannya.
Terima kasih @ovs karena menyimpan byte.
Alternatif
1. 73 byte
Saya menolak ini karena terlalu mirip dengan jawaban lain yang saya lihat.
2. 71 byte
Saya menolak ini karena, meskipun mengerjakan semua tes dalam pertanyaan, ada beberapa angka yang bisa gagal karena tidak ada
=
dalam<=
.sumber
25
danelse
- tetapi bagaimanapun juga, menggunakan hubungan arus pendekand/or
(seperti komentar @ovs) lebih pendek.25
danelse
, Anda pasti lakukan perlu dengan beberapa (kebanyakan?) Penafsir (termasuk CPython, IIRC). Jika Anda menuliskannya25else
, maka25e
ditafsirkan sebagai awal dari literal numerik notasi ilmiah, dan penerjemah kemudian berbicara ketika tidak ada digit berikut.C #,
636261 byteDisimpan 1 byte lebih banyak berkat TheLethalCoder .
Disimpan 1 byte berkat pengguna anonim.
Fungsi anonim yang sangat mudah. Seluruh trik menggunakan operator ternary untuk kembali secara langsung (sehingga menghilangkan
return
kata kunci, sepasang kurung kurawal dan deklarasi dan penugasan variabel).Program lengkap dengan kasus uji:
sumber
Common Lisp,
8987858483 byteSebuah fungsi:
Contoh penggunaan:
Cobalah online! (Saya menambahkan fungsi pencetakan untuk melihat keluaran dalam TIO)
Ide untuk perbaikan disambut.
sumber
MATL,
54454442 byteCobalah 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, manfaatkannormal
sebagai literal yang sudah ditentukan sebelumnya17Y0
.sumber
[BC]UQ
dengan'%2'
dan menyimpan 2 byte.Java 8, 61 byte
Tetapkan ke a
DoubleFunction<DoubleFunction<String>>
dan panggil dengan demikian:sumber
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
dapat menugaskan ke.int w = ... , h = ... ; System.out.println((w/=h*h)<18.5?"Underweight":w<25?"Normal":"Overweight")
, maaf :)dc , 64 byte
Cobalah online!
sumber
3k[Overweight]??2^/dsp[[Normal]][[Underweight]]sasb25>blp18.5>ap
.Javascript (ES6), 63 byte
Contoh
sumber
Swift, 97 byte
sumber
Japt , 46 byte
Cobalah online!
Terinspirasi oleh jawaban @ Luke .
Penjelasan
Dekompresi ke:
Japt memiliki input implisit
U
. Input kedua adalahV
.Japt menggunakan perpustakaan shoco untuk kompresi string. Backticks digunakan untuk mendekompresi string.
Pintasan Unicode digunakan:
sumber
PHP , 121 byte
Cobalah online!
sumber
Scala, 124 byte
sumber
REXX, 113 byte
sumber