Chỉ số khối cơ thể của tôi là gì?


21

Vấn đề:

Nhiệm vụ của bạn là viết một chương trình lấy chiều cao (tính bằng mét) và trọng lượng (tính bằng kilôgam) và đưa ra loại BMI tương ứng.

BMI là thước đo tỷ lệ cân nặng của bạn với chiều cao của bạn. Nó có niên đại và không chính xác đối với nhiều người , nhưng điều đó không quan trọng ở đây!

BMI có thể được tính bằng phương trình sau:

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

Các danh mục sẽ được xác định như sau:

  • BMI <18,5: "Thiếu cân"

  • 18,5 <= BMI <25: "Bình thường"

  • 25 <= BMI: "Thừa cân"

Vì lợi ích của thử thách, tôi bỏ qua tất cả các hạng mục "cực đoan". Ngoài ra, vì một số số như "25" nằm giữa 2 loại, tôi đã điều chỉnh giới hạn một chút để có câu trả lời rõ ràng.

Bạn có thể viết một hàm hoặc một chương trình đầy đủ.

Đầu vào:

Đầu vào có thể ở bất kỳ hình thức hợp lý. Hai số (hoặc chuỗi), là 2 đối số riêng biệt hoặc dưới dạng một chuỗi. Một mảng / danh sách gồm 2 số, một từ điển với các phím "weight" và "height" ... Cần hỗ trợ các giá trị thập phân. Bạn có thể giả sử đầu vào sẽ luôn hợp lệ (không có giá trị âm và chiều cao sẽ không bao giờ bằng 0).

Đầu ra:

Đầu ra sẽ là một chuỗi chứa các tên danh mục không phân biệt chữ hoa chữ thường . Các chuỗi phải khớp với tên danh mục chính xác như trên, bỏ qua trường hợp. Nó có thể được xuất ra thiết bị xuất chuẩn, được trả về (trong trường hợp hàm) hoặc được ghi vào tệp.

Các trường hợp thử nghiệm (cân nặng, chiều cao => kết quả):

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)

Đây là một số mã giả cho thấy việc thực hiện ví dụ:

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"

Đây là môn đánh gôn, vì vậy số byte ít nhất sẽ thắng.

(Vâng, nhiệm vụ này cực kỳ tầm thường trong hầu hết các ngôn ngữ. Hầu hết các thử thách gần đây dường như khó hơn bình thường, vì vậy tôi nghĩ rằng tôi sẽ đăng một bài dễ tiếp cận hơn).


CHÚ THÍCH! Một giờ sau khi tôi đăng thử thách này, tôi đã phải sửa đổi các phạm vi một chút vì các phạm vi như đã nêu có "lỗ hổng" như được chỉ ra trong các bình luận. Xin vui lòng xem các phạm vi mới.

Câu trả lời:


9

Thạch , 24 byte

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

Hãy thử trực tuyến!

Làm sao?

Tính chỉ số BMI, nhân đôi số đó, so sánh rằng với toán tử lớn hơn toán tử với mỗi số 37 và 50 (18,5 và 25 nhân đôi), tính tổng các số và số không kết quả (đạt 1, 2 hoặc 0 cho Bình thường, Thiếu cân và Thừa cân tương ứng) và lập chỉ mục vào danh sách các chuỗi ["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

1
Ồ Nói về obfuscation. Nếu đây là golf, tôi nghĩ bạn có một lỗ trong một! Hoặc 24 ...
Cullub

2
@cullub có 24 ký tự và 24 byte - Jelly sử dụng trang mã riêng của nó được liên kết với từ "byte" trong tiêu đề, mẹeff.in đang đếm Unicode tôi tin.
Jonathan Allan

1
@TheBitByte, vâng, hãy xem bộ đếm liên kết TIO "24 ký tự, 24 byte (SBCS)" hoặc đếm bằng tay bằng cách sử dụng trang mã được liên kết bởi các byte trong tiêu đề.
Jonathan Allan

... dưới dạng 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]

Hãy thử trực tuyến!

So sánh với 72 byte:

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

10

TI-Basic, 58 54 byte

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

Ngoài ra, để giải trí, đây là phiên bản nhỏ gọn hơn có nhiều byte hơn:

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

Tất cả những gì tôi có thể nói là, cảm ơn bạn đã khiến trường hợp này trở nên vô cảm;)

PS Inputlấy đồ thị đầu vào XYtương tự nhưPrompt X,Y


Ngoài ra, tôi đã xem xét điều này nhiều lần và tôi không nghĩ có cách nào để lưu byte mặc dù hai lần cuối cùng chia sẻ chuỗiERWEIGHT
Timtech

Vì tò mò, nó sẽ thay đổi câu trả lời của bạn như thế nào nếu tôi thi hành án nhạy cảm?
Carcigenicate

1
@Carcigenicate Trong TI-Basic, các chữ cái viết thường là hai byte mỗi. Vì vậy, nó sẽ tăng số byte lên rất nhiều.
Timtech

1
Ah tôi thấy. Thật ki quặc.
Carcigenicate

1
@Carcigenicate Điều quan trọng cần nhớ là phiên bản TI-Basic này được giới thiệu vào năm 1990 dưới dạng ngôn ngữ máy tính ... không ai biết tôi sẽ chơi golf 27 năm sau
Timtech

6

Toán học, 67 byte

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

Sử dụng thực tế là a[b,c][[Sign@d]]trả về anếu dbằng 0, trả về bnếu dlà dương và trả về cnếu dlà âm. ⌊...⌋Floorhàm của Mathicala sử dụng các ký tự ba byte U + 230A và U + 230B. Không thể tìm ra cách để làm tốt hơn là sử dụng weighthai lần.


3
Ngạc nhiên Mathicala không tích hợp sẵn cho việc này
Daniel

1
bạn phải đến tiểu thuyết của người hâm mộ vì điều đó;)
Greg Martin

5

Ruby, 91 77 74 67 byte

Thử đầu tiên ngây thơ:

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

Lần thử thứ hai với cảm hứng của người Viking từ các câu trả lời trước:

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

Lần thử thứ ba:

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

Lần thử thứ tư:

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

Hãy thử trực tuyến!


reitermarkus từ homebrew-thùng?! Woah, không mong đợi để nhìn thấy bạn ở đây! : o
numbermaniac

1
@numbermaniac, haha, vâng, chính là tôi! 😂
reitermarkus

5

JavaScript (ES6), 70 67 64 63 byte

Đã lưu 4B nhờ Arnauld

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

Sử dụng

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

Đầu ra

"Overweight"

Giải trình

Câu trả lời này khá tầm thường, mặc dù có một mẹo thông minh: UnderweightOverweightcả hai đều kết thúc erweight, vì vậy chúng ta chỉ phải thay đổi những nhân vật đó.

Tôi cho rằng điều đó Normalcó nghĩa là chỉ số BMI nằm trong khoảng từ 25 (độc quyền) đến 18,5 (đã bao gồm). Underweightcó nghĩa là chỉ số BMI nhỏ hơn 18,5 và Overweightcó nghĩa là chỉ số BMI lớn hơn hoặc bằng 25.


1
Bây giờ câu trả lời không chứa bất kỳ tính năng ES7 nào ;-)
ETHproductions 8/2/2017



4

QBIC , 61 58 byte

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

@Luke đã sử dụng Force và băm nhỏ hai byte. Cảm ơn!

Các quy tắc thay đổi lưu một byte khác.

Giải trình:

::          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.

3

Python 2 , 72 byte

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

Hãy thử trực tuyến!


Làm thế nào để bạn có được màu sắc cho Python? Tôi không bao giờ tìm ra nó.

@JackBates Đó là <!-- language-all: lang-python -->TIO tự động chèn cho tôi.
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])

Chương trình đầy đủ.

Nhân với năm để tiết kiệm một byte. Cảm ơn Jonathan Allan.

Từng dòng:

  1. Ánh xạ hai không gian số người dùng đầu vào tách thành ints. Giải nén đến a và b.

  2. Tính toán

  3. Nếu bmi nằm trong khoảng từ 18,6 đến 25, bao gồm, biểu thức bên phải sẽ đánh giá là True. Booleans có thể là 0 hoặc 1 khi được sử dụng làm chỉ mục danh sách, vì vậy chúng tôi nhận được "Bình thường" hoặc chuỗi được xây dựng trong chỉ mục 0. "er weight" là một hậu tố được chia sẻ cho hai tùy chọn còn lại, vì vậy nó không cần phải lặp lại. Sau đó, chúng tôi sử dụng mẫu [start: stop: step] của danh sách Python / cắt chuỗi. c> 18.6 sẽ đánh giá là 0 hoặc 1 (Sai ​​hoặc Đúng) và trở thành khởi đầu của chúng tôi. Dừng không được chỉ định vì vậy chúng tôi đi đến cuối của nghĩa đen. Bước là 2 vì vậy chúng tôi lấy mỗi chỉ số thứ hai. Nếu bắt đầu ước tính là 1, chúng ta sẽ nhận được "Ov", nếu không, chúng ta sẽ nhận được "Und". Dù bằng cách nào, chúng tôi nối thêm "số dư" vào những gì chúng tôi có và chúng tôi có đầu ra cuối cùng.


1
Viết nó như là một chức năng cho 79:def f(h,w):c=h/w/w;print(["UOnvd"[c>18.6::2]+"erweight","Normal"][18.6<=c<=25])
Jonathan Allan

Nếu bạn nhân lên năm lần đầu tiên, bạn có thể lưu một byte bằng cách so sánh với 93125. Nếu bạn sử dụng lambda, bạn phải tính toán cở cả hai nơi nhưng không cần đặt tên hàm hoặc sử dụng print(), vì vậy có thể thực hiện lambda h,w:["UOnvd"[h/w/w*5>93::2]+"erweight","Normal"][93<=h/w/w*5<=125]cho 73.
Jonathan Allan

... thực sự bởi vì bạn sẽ tính toán cgấp đôi nhân với 5 chi phí nhiều hơn số tiền tiết kiệm được trong lambda, vì vậy chỉ lambda h,w:["UOnvd"[h/w/w>18.6::2]+"erweight","Normal"][18.6<=h/w/w<=25]trong 72
Jonathan Allan

Jonathan Allan Ai đó đã làm điều đó như chỉ là một chức năng.
mypetlion

Không sao đâu, cách của bạn sẽ vượt qua họ: 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)])

Với một cái gật đầu với câu trả lời Octave của StewieGriffin, tạo ra một chuỗi các chuỗi, sau đó tính tổng kết quả BMI < c(18.5,25)và tham chiếu mảng ở vị trí đó + 1.

Đối số đầu tiên cần phải là chiều cao, sau đó là cân nặng; nếu điều đó không được phép thì

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

hoạt động thêm 4 byte.


2

Clojure, 63 byte

#(condp <(/ %(* %2 %2))25"Overweight"18.5"Normal""Underweight")

Chỉ trích. Như mọi khi, đây là phiên bản ngắn hơn của những gì tôi đã nghĩ đến.
Carcigenicate

2

dc , 58 byte

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

Lấy đầu vào là 2 số được phân tách bằng dấu cách <mass> <height>. Xuất ra một chuỗi trên một dòng riêng biệt.

Hãy thử trực tuyến!

Giải trình

Đối với mục đích của lời giải thích này, đầu vào là 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.

2

Octave, 64 byte

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

Dùng thử trực tuyến

Đây là một hàm ẩn danh có hai đối số đầu vào, h(chiều cao) và w(trọng lượng).

Hàm tạo một mảng ô chứa chuỗi đó 'Underweight','Normal','Overweight'và xuất số chuỗi 3-sum(2*w/h^2<'%2').

Vâng, cái đó có vẻ hơi lạ. Chúng tôi muốn chuỗi đầu tiên nếu w/h^2<=18.5, chuỗi thứ hai nếu (w/h^2 > 18.5) & (w/h^2 < 25)và chuỗi thứ ba nếu không có điều kiện nào ở trên là đúng. Thay vì tạo ra một loạt các so sánh, chúng ta có thể chỉ cần so sánh chuỗi với : w/h^2 < [18.5, 25], sẽ trả về một trong các mảng sau [1 1], [0 1], [0,0]cho lần lượt Dưới , Bình thường và Thừa cân.

[18.5,25]mất 9 byte, rất nhiều. Thay vào đó, những gì chúng ta làm là nhân số BMI với 2 và so sánh kết quả với [37, 50], hoặc '%2'trong ASCII. Điều này tiết kiệm ba byte.


2

Perl 6 , 59 byte

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

Làm thế nào nó hoạt động

{                                                         }  # 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.

Quá tệ, chuỗi erweightphải được lặp lại, nhưng tất cả các biến thể tôi đã thử để tránh điều đó đã làm tăng tổng số byte:

  • Với sự thay thế chuỗi, 62 byte:

    {<Ov_ Normal Und_>[sum 18.5,25 X>$^a/$^b**2].&{S/_/erweight/}}
  • Với phép nội suy chuỗi, 67 byte:

    {$_='erweight';("Ov$_","Normal","Und$_")[sum 18.5,25 X>$^a/$^b**2]}
  • Bản dịch thô của giải pháp Python của xnor , 65 byte:

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

2

PowerShell , 81 byte

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

Hãy thử trực tuyến!

Giải trình

Bit chính cần giải thích là 18.5,25 -lt $b(trong đó tôi thay thế $bcho BMI được tính toán tại chỗ trong mã). Hầu hết các toán tử trong PowerShell, khi được cung cấp một mảng ở phía bên trái, sẽ trả về một mảng các mục thỏa mãn thử nghiệm, thay vì trả về giá trị boolean. Vì vậy, điều này sẽ trả về một mảng trống nếu $bnhỏ hơn 18,5, một mảng chỉ chứa 18,5 nếu nó ở giữa và một mảng chứa cả 18,5 và 25 nếu nó lớn hơn 25.

Tôi sử dụng số lượng các phần tử như một chỉ mục vào một mảng của các chuỗi, vì vậy, đếm 0được phần tử 0đó là 'Underweight', v.v.


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"

Không, đây là một chức năng.
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"

Hãy thử trực tuyến!

Giải pháp khá cơ bản tận dụng các kỹ thuật của người khác để giải quyết nó.

Cảm ơn @ovs đã lưu một byte.

Lựa chọn thay thế

1. 73 byte

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

Tôi đã từ chối điều này vì nó quá giống với câu trả lời khác mà tôi thấy.

2. 71 byte

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

Tôi đã từ chối điều này bởi vì, mặc dù làm việc trên tất cả các bài kiểm tra trong câu hỏi, có một số con số có thể thất bại vì nó thiếu =trong phần <=.


Bạn không cần khoảng cách giữa 25else- nhưng dù sao, sử dụng ngắn mạch and/or(như @ovs nhận xét) ngắn hơn.
FlipTack

@FlipTack: liên quan đến khoảng cách giữa 25else, bạn chắc chắn làm cần nó với một số người (nhất?) Dịch viên (bao gồm cả CPython, IIRC). Nếu bạn viết nó dưới dạng 25else, thì 25eđược hiểu là sự khởi đầu của một chữ số ký hiệu khoa học, và thông dịch viên sẽ bực mình khi không có các chữ số sau.
Mac

2

C #, 63 62 61 byte

Đã lưu thêm 1 byte nhờ TheLethalCoder .

Đã lưu 1 byte nhờ người dùng ẩn danh.

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

Một chức năng ẩn danh khá đơn giản. Toàn bộ thủ thuật là sử dụng toán tử ternary để trả về trực tiếp (do đó bỏ qua returntừ khóa, một cặp dấu ngoặc nhọn và một khai báo và gán biến).

Chương trình đầy đủ với các trường hợp thử nghiệm:

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"
    }
}

2

Lisp thường gặp, 89 87 85 84 83 byte

Một chức năng:

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

Ví dụ về cách sử dụng:

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

Hãy thử trực tuyến! (Tôi đã thêm chức năng in để xem đầu ra trong TIO)

Ý tưởng để cải thiện được hoan nghênh.


2

MATL, 54 45 44 42 byte

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

Dùng thử tại matl.suever.net

Bắt đầu bằng cách tính chỉ số BMI và nhân đôi nó U\E, sau đó tạo ra vectơ [37 50]với chuỗi ký tự '% 2'. So sánh chỉ số BMI với vectơ này và sử dụng các câu lệnh if để có câu trả lời, tận dụng lợi thế normalnhư một nghĩa đen được xác định trước 17Y0.


Bạn có thể thay thế [BC]UQbằng '%2'và lưu 2 byte.
- Phục hồi lại

1

Java 8, 61 byte

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

Gán cho a DoubleFunction<DoubleFunction<String>>và gọi như vậy:

bmi.apply(50).apply(1.5)

Bạn có thể dự phòng một byte bằng cách sử dụng lại w: w->h->(w/=h*h)<18.5?"Underweight":w<25?"Normal":"Overweight".
Olivier Grégoire

@ OlivierGrégoire Nope :( Error: local variables referenced from a lambda expression must be final or effectively finalKhông thể chỉ định cho w.
David Conrad

1
Ồ ... tôi đã kiểm tra với những thứ nội tuyến như int w = ... , h = ... ; System.out.println((w/=h*h)<18.5?"Underweight":w<25?"Normal":"Overweight"), xin lỗi :)
Olivier Grégoire

@ OlivierGrégoire Không có vấn đề. Tôi ước Java cho phép nó.
David Conrad

1

dc , 64 byte

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

Hãy thử trực tuyến!


Đằng đó! Chỉ cần đánh bại tôi trong vài giây. Tôi đã định đăng bài của tôi, cho đến khi tôi thấy điều này. Dù sao, đây là một câu trả lời 64 byte : 3k[Overweight]??2^/dsp[[Normal]][[Underweight]]sasb25>blp18.5>ap.
R. Kap

@ R.Kap Bạn thực sự có thể khiến cho bạn ngắn hơn một byte bằng cách bỏ qua một trong các dấu hỏi.
Spector Mitchell

Ồ vâng, tôi quên rằng tôi có thể làm điều đó. Bạn có thể đăng nó như của riêng bạn nếu bạn muốn.
R. Kap

Không, điều đó tốt - hãy tiếp tục và tự đăng nó, đó là giải pháp của bạn. (Bạn có thể ghi có cho tôi một byte nếu bạn muốn.)
Mitchell Spector

Nhân tiện, tôi đã có thể giảm xuống còn 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

Thí dụ

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));


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"}

1

Japt , 46 byte

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

Hãy thử trực tuyến!

Lấy cảm hứng từ câu trả lời của @ Luke .

Giải trình

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

Giải nén thành:

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

Japt có một đầu vào ngầm U. Đầu vào thứ hai là V.

Japt sử dụng thư viện shoco để nén chuỗi. Backticks được sử dụng để giải nén chuỗi.

Phím tắt Unicode được sử dụng:

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


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}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.