ดัชนีมวลกายของฉันคืออะไร


21

ปัญหา:

งานของคุณคือการเขียนโปรแกรมที่ใช้เป็นความสูง (เป็นเมตร) และน้ำหนัก (เป็นกิโลกรัม) และส่งออกหมวดหมู่ BMI ที่เกี่ยวข้อง

ค่าดัชนีมวลกายคือการวัดอัตราส่วนของน้ำหนักต่อส่วนสูงของคุณ มันเก่าและไม่ถูกต้องสำหรับคนจำนวนมากแต่นั่นไม่สำคัญเลย!

BMI สามารถคำนวณได้โดยใช้สมการต่อไปนี้:

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

หมวดหมู่จะถูกกำหนดดังนี้:

  • BMI <18.5: "Underweight"

  • 18.5 <= BMI <25: "Normal"

  • 25 <= BMI: "น้ำหนักเกิน"

เพื่อความท้าทายฉันจึงเพิกเฉยต่อหมวดหมู่ "สุดขีด" ทั้งหมด นอกจากนี้เนื่องจากตัวเลขบางตัวเช่น "25" อยู่ระหว่าง 2 หมวดหมู่ฉันจึงปรับขอบเขตเล็กน้อยเพื่อให้มีคำตอบที่ชัดเจน

คุณสามารถเขียนฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ

การป้อนข้อมูล:

อินพุตอาจอยู่ในรูปแบบที่สมเหตุสมผล ตัวเลขสองตัว (หรือสตริง) อาจเป็น 2 อาร์กิวเมนต์แยกกันหรือเป็นสตริงเดียว อาร์เรย์ / รายการของตัวเลข 2 ตัวพจนานุกรมที่มีปุ่ม "น้ำหนัก" และ "ความสูง" ... ควรสนับสนุนค่าทศนิยม คุณสามารถสมมติว่าการป้อนข้อมูลจะถูกต้องเสมอ (ไม่มีค่าลบและความสูงจะไม่เป็น 0)

เอาท์พุท:

เอาต์พุตจะเป็นสตริงที่มีชื่อหมวดหมู่ตามตัวพิมพ์เล็กและใหญ่ สตริงจะต้องตรงกับชื่อหมวดหมู่ตรงตามด้านบนโดยไม่สนใจขนาดตัวพิมพ์ มันสามารถส่งออกไปยัง stdout กลับมา (ในกรณีของฟังก์ชั่น) หรือเขียนลงไฟล์

กรณีทดสอบ (น้ำหนักความสูง => ผล):

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)

นี่คือรหัสเทียมบางส่วนที่แสดงตัวอย่างการใช้งาน:

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"

นี่คือโค้ดกอล์ฟดังนั้นจำนวนไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ

(ใช่งานนี้ยิ่งน่ารำคาญในภาษามากที่สุด. ส่วนใหญ่ของความท้าทายที่เมื่อเร็ว ๆ นี้ดูเหมือนจะหนักกว่าปกติดังนั้นฉันคิดว่าฉันแสดงความเข้าถึงได้มากขึ้นอย่างใดอย่างหนึ่ง)


บันทึก! หนึ่งชั่วโมงหลังจากที่ฉันโพสต์ความท้าทายนี้ฉันต้องแก้ไขช่วงเล็กน้อยเนื่องจากช่วงดังกล่าวมี "รู" ตามที่ระบุไว้ในความคิดเห็น โปรดดูช่วงใหม่

คำตอบ:


9

เยลลี่ 24 ไบต์

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

ลองออนไลน์!

อย่างไร?

คำนวณค่าดัชนีมวลกายเพิ่มเป็นสองเท่าเปรียบเทียบกับตัวดำเนินการที่มากกว่ากับตัวเลขแต่ละตัวที่ 37 และ 50 (18.5 และ 25 เท่า) ผลรวมที่เป็นผลลัพธ์และเลขศูนย์ (ให้ผล 1, 2 หรือ 0 สำหรับ Normal, Underweight และ Overweight ตามลำดับ) ["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
ว้าว. พูดคุยเกี่ยวกับความงงงวย ถ้านี่คือกอล์ฟฉันคิดว่าคุณมีหลุมในหนึ่งเดียว! หรือ 24 ...
Cullub

2
@cullub มันคือ 24 ตัวอักษรและ 24 ไบต์ - Jelly ใช้หน้ารหัสของตัวเองซึ่งเชื่อมโยงกับคำว่า "bytes" ในหัวเรื่อง, mothereff.in กำลังนับ Unicode ที่ฉันเชื่อ
Jonathan Allan

1
@TheBitByte ใช่ลองดูที่เคาน์เตอร์ลิงค์TIO "24 ตัวอักษร, 24 ไบต์ (SBCS)" หรือนับด้วยมือโดยใช้โค้ดเพจที่เชื่อมโยงด้วยไบต์ในส่วนหัว
Jonathan Allan

... ในฐานะ 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


10

TI-Basic, 58 54 ไบต์

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

นอกจากนี้เพื่อความสนุกนี่เป็นรุ่นกะทัดรัดที่มีจำนวนไบต์มากกว่า:

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

ทั้งหมดที่ฉันสามารถพูดได้คือขอขอบคุณที่ทำให้กรณีนี้ไม่รู้สึก;)

PS Inputนำกราฟเข้ามาXและYคล้ายกับPrompt X,Y


นอกจากนี้ฉันได้ดูหลาย ๆ ครั้งนี้และฉันไม่คิดว่าจะมีวิธีใดที่จะช่วยประหยัดไบต์แม้ว่าสองคนสุดท้ายจะแชร์สตริงERWEIGHT
Timtech

จากความอยากรู้มันจะเปลี่ยนคำตอบของคุณได้อย่างไรถ้าฉันบังคับให้ต้องคำนึงถึงตัวพิมพ์ใหญ่ - เล็ก
Carcigenicate

1
@Carcigenicate ใน TI-Basic ตัวอักษรพิมพ์เล็กจะมีสองไบต์ ดังนั้นมันจะเพิ่มจำนวนไบต์เพิ่มขึ้นมาก
Timtech

1
อ่าฉันเข้าใจแล้ว มันแปลกมาก
Carcigenicate

1
@Carcigenicate เป็นเรื่องสำคัญที่ต้องจำไว้ว่า TI-Basic รุ่นนี้เปิดตัวในปี 1990 เป็นภาษาเครื่องคิดเลข ... ไม่มีใครรู้ว่าฉันจะตีมันในอีก 27 ปีต่อมา
Timtech

6

Mathematica, 67 ไบต์

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

ใช้ความจริงที่a[b,c][[Sign@d]]ส่งคืนaถ้าdเท่ากับ 0 ส่งคืนbถ้าdเป็นบวกและส่งกลับcถ้าdเป็นลบ ⌊...⌋คือFloorฟังก์ชันของ Mathematica โดยใช้อักขระสามไบต์ U + 230A และ U + 230B ไม่สามารถหาวิธีที่จะทำได้ดีกว่าการใช้weightสองครั้ง


3
ประหลาดใจ Mathematica ไม่ได้มีในตัวสำหรับสิ่งนี้
Daniel

1
คุณต้องไปหาแฟนนิยายเรื่องนั้น;)
Greg Martin

5

Ruby, 91 77 74 67 ไบต์

ความพยายามครั้งแรกที่ไร้เดียงสา:

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

ลองครั้งที่สองกับ "แรงบันดาลใจ" จากคำตอบก่อนหน้า:

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

ความพยายามครั้งที่สาม:

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

ความพยายามครั้งที่สี่:

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

ลองออนไลน์!


reitermarkus จาก homebrew-cask?! ว้าวไม่คาดหวังว่าจะพบคุณที่นี่! : o
numbermaniac

1
@ หมายเลขช่างฮ่าฮ่า ๆ ใช่ฉันเอง! 😂
reitermarkus

5

JavaScript (ES6), 70 67 64 63 ไบต์

บันทึก 4B ขอบคุณ Arnauld

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

การใช้

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

เอาท์พุต

"Overweight"

คำอธิบาย

คำตอบนี้ไม่สำคัญเลยทีเดียวแม้ว่าจะมีเคล็ดลับที่ฉลาดอยู่หนึ่งข้อUnderweightและOverweightทั้งคู่ก็จบลงerweightดังนั้นเราจึงต้องเปลี่ยนตัวละครเหล่านั้นเท่านั้น

ฉันคิดว่านั่นNormalหมายถึงค่าดัชนีมวลกายระหว่าง 25 (พิเศษ) และ 18.5 (รวม) Underweightหมายถึงค่าดัชนีมวลกายน้อยกว่า 18.5 และOverweightหมายถึงค่าดัชนีมวลกายมากกว่าหรือเท่ากับ 25


1
ตอนนี้คำตอบไม่มีคุณสมบัติ ES7 ใด ๆ ;-)
ETHproductions



4

QBIC , 61 58 ไบต์

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

@Luke ใช้ Force และตัดสองไบต์ออก ขอบคุณ!

การเปลี่ยนแปลงกฎบันทึกอีกหนึ่งไบต์

คำอธิบาย:

::          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 3, 97 95 ไบต์

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

โปรแกรมเต็มรูปแบบ

คูณด้วยห้าเพื่อบันทึกไบต์ ขอบคุณ Jonathan Allan

ทีละบรรทัด:

  1. แม็พตัวเลขอินพุตผู้ใช้ที่คั่นด้วยช่องว่างสองช่องเข้ากับ int แกะออก a และ b

  2. คำนวณ

  3. หาก bmi อยู่ระหว่าง 18.6 ถึง 25 จะครอบคลุมนิพจน์ทางด้านขวาจะประเมินเป็น True บูลีนสามารถเป็น 0 หรือ 1 เมื่อใช้เป็นรายการดัชนีดังนั้นเราจึงได้รับ "ปกติ" หรือสตริงที่สร้างขึ้นในดัชนีศูนย์ "erweight" เป็นคำต่อท้ายที่ใช้ร่วมกันสำหรับสองตัวเลือกที่เหลือดังนั้นจึงไม่จำเป็นต้องทำซ้ำ จากนั้นเราใช้รูปแบบ [start: stop: step] ของ Python list / string slicing c> 18.6 จะประเมินเป็น 0 หรือ 1 (เท็จหรือจริง) และกลายเป็นจุดเริ่มต้นของเรา Stop จะไม่ถูกระบุดังนั้นเราจะไปที่จุดสิ้นสุดของตัวอักษร ขั้นตอนคือ 2 เราจึงหาดัชนีทุกวินาที หากเริ่มต้นประเมินผลเป็น 1 เราจะได้รับ "Ov" มิฉะนั้นเราจะได้ "Und" ไม่ว่าจะด้วยวิธีใดเราผนวก "ลดน้ำหนัก" กับสิ่งที่เราได้รับและเรามีผลลัพธ์สุดท้ายของเรา


1
เขียนเป็นฟังก์ชั่นสำหรับ 79:def f(h,w):c=h/w/w;print(["UOnvd"[c>18.6::2]+"erweight","Normal"][18.6<=c<=25])
Jonathan Allan

หากคุณคูณขึ้นโดยห้าแรกที่คุณสามารถบันทึกไบต์โดยเมื่อเทียบกับและ93 125หากคุณใช้แลมบ์ดาคุณต้องคำนวณcทั้งสองที่ แต่ไม่จำเป็นต้องตั้งชื่อฟังก์ชั่นหรือการใช้งานprint()ดังนั้นสามารถทำได้lambda h,w:["UOnvd"[h/w/w*5>93::2]+"erweight","Normal"][93<=h/w/w*5<=125]สำหรับ 73
Jonathan Allan

... จริง ๆ แล้วเพราะคุณจะคำนวณcสองเท่าคูณด้วย 5 ต้นทุนมากกว่าที่จะประหยัดในแลมบ์ดาดังนั้นlambda h,w:["UOnvd"[h/w/w>18.6::2]+"erweight","Normal"][18.6<=h/w/w<=25]สำหรับ 72
Jonathan Allan

โจนาธานอัลลันบางคนทำไปแล้วเหมือนเป็นหน้าที่
mypetlion

ไม่เป็นไรวิธีการของคุณจะออกไปตีกอล์ฟพวกเขา: D
Jonathan Allan

3

R, 89 84 80 74 ไบต์

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

ด้วยการพยักหน้าให้กับคำตอบระดับแปดหลักของ StewieGriffin ให้สร้างอาร์เรย์ของสตริงจากนั้นจะรวมผลลัพธ์BMI < c(18.5,25)และการอ้างอิงอาร์เรย์ที่ตำแหน่งนั้น + 1

อาร์กิวเมนต์แรกจะต้องมีความสูงจากนั้นก็น้ำหนัก หากไม่ได้รับอนุญาต

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

ใช้งานได้อีก 4 ไบต์


2

Clojure, 63 ไบต์

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

ประณาม. เช่นเคยนี่เป็นเวอร์ชั่นสั้นกว่าของที่ฉันคิดไว้
Carcigenicate

2

dc , 58 ไบต์

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

นำอินพุตเป็นตัวเลขคั่นด้วยช่องว่าง 2 ช่องในรูปแบบ <mass> <height>พื้นที่แยกตัวเลขในรูปแบบ ส่งออกสตริงในบรรทัดแยกต่างหาก

ลองออนไลน์!

คำอธิบาย

สำหรับวัตถุประสงค์ของคำอธิบายนี้อินพุตคือ 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

อ็อกเทฟ 64 ไบต์

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

ลองออนไลน์

นี่เป็นฟังก์ชั่นนิรนามที่รับค่าอาร์กิวเมนต์สองค่า h (ความสูง) และw(น้ำหนัก)

ฟังก์ชั่นสร้างอาร์เรย์เซลล์ที่มีสตริง 'Underweight','Normal','Overweight'3-sum(2*w/h^2<'%2')และหมายเลขสตริงเอาท์พุท

ใช่คนนั้นดูแปลก ๆ เราต้องการสตริงแรกถ้าสตริงw/h^2<=18.5ที่สองถ้า(w/h^2 > 18.5) & (w/h^2 < 25)และสตริงที่สามหากไม่มีเงื่อนไขข้างต้นเป็นจริง แทนที่จะสร้างการเปรียบเทียบเราสามารถเปรียบเทียบสตริงกับ:w/h^2 < [18.5, 25]ซึ่งจะคืนค่าหนึ่งในอาร์เรย์ต่อไปนี้[1 1], [0 1], [0,0]สำหรับ Underweight, Normal และ Overweight ตามลำดับ

[18.5,25]ใช้เวลา 9 ไบต์ซึ่งมีจำนวนมาก สิ่งที่เราทำคือคูณ BMI ด้วย 2 และเปรียบเทียบผลลัพธ์กับ[37, 50]หรือ'%2'ใน ASCII วิธีนี้ช่วยประหยัดสามไบต์


2

Perl 6 , 59 ไบต์

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

มันทำงานอย่างไร

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

น่าเสียดายที่สตริงerweightจะต้องมีการทำซ้ำ แต่รูปแบบทั้งหมดที่ฉันพยายามเพื่อหลีกเลี่ยงการสิ้นสุดนั้นเพิ่มจำนวนไบต์โดยรวม:

  • ด้วยการทดแทนสตริง 62 ไบต์:

    {<Ov_ Normal Und_>[sum 18.5,25 X>$^a/$^b**2].&{S/_/erweight/}}
  • ด้วยการแก้ไขสตริง, 67 ไบต์:

    {$_='erweight';("Ov$_","Normal","Und$_")[sum 18.5,25 X>$^a/$^b**2]}
  • การแปลอย่างหยาบของโซลูชัน Python ของ xnorขนาด 65 ไบต์:

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

2

PowerShell , 81 ไบต์

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

ลองออนไลน์!

คำอธิบาย

บิตหลักที่ต้องอธิบายคือ18.5,25 -lt $b(ที่ฉันแทน$bค่าดัชนีมวลกายซึ่งคำนวณในรหัส) ตัวดำเนินการส่วนใหญ่ใน PowerShell เมื่อกำหนดอาร์เรย์ทางด้านซ้ายให้ส่งคืนอาร์เรย์ของรายการที่ตอบสนองการทดสอบแทนที่จะส่งกลับค่าบูลีน ดังนั้นนี่จะส่งคืนอาเรย์ที่ว่างเปล่าถ้า$bเล็กกว่า 18.5 อาเรย์ที่มีเพียง 18.5 ถ้ามันอยู่ตรงกลางและอาเรย์ที่มีทั้ง 18.5 และ 25 ถ้ามันใหญ่กว่า 25

ฉันใช้การนับองค์ประกอบเป็นดัชนีในอาร์เรย์ของสตริงดังนั้นการนับ0จะได้รับองค์ประกอบ0ซึ่งก็คือ'Underweight'เป็นต้น



2

Python 75 75ไบต์

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

ลองออนไลน์!

โซลูชันพื้นฐานที่เป็นธรรมที่ใช้ประโยชน์จากเทคนิคของผู้อื่นในการแก้ไข

ขอบคุณ @ovs สำหรับการบันทึกไบต์

ทางเลือก

1. 73 ไบต์

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

ฉันปฏิเสธสิ่งนี้เพราะมันคล้ายกับคำตอบอื่นที่ฉันเห็น

2. 71 ไบต์

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

ผมปฏิเสธเพราะแม้จะมีการทำงานในการทดสอบทั้งหมดในคำถามที่มีตัวเลขบางอย่างมันสามารถล้มเหลวในฐานะที่มันขาดหายไปใน=<=


คุณไม่ต้องการช่องว่างระหว่าง25และelse- แต่อย่างไรก็ตามการใช้การลัดวงจรand/or(@ovs ที่แสดงความคิดเห็น) นั้นสั้นกว่า
FlipTack

@FlipTack: เกี่ยวกับช่องว่างระหว่าง25และelseคุณแน่นอนทำจำเป็นต้องมีบางส่วน (ส่วนใหญ่?) ล่าม (รวม CPython, IIRC) ถ้าคุณเขียนว่ามันเป็น25elseที่25eถูกตีความว่าเป็นจุดเริ่มต้นของวิทยาศาสตร์โน้ตตัวเลขตัวอักษรและล่ามแล้ว baulks เมื่อไม่มีตัวเลขดังต่อไปนี้
Mac

2

C #, 63 62 61 ไบต์

ที่บันทึกไว้อีก 1 ขอบคุณไบต์TheLethalCoder

บันทึก 1 ไบต์ต้องขอบคุณผู้ใช้ที่ไม่ระบุชื่อ

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

ฟังก์ชั่นไม่ระบุชื่อที่ค่อนข้างตรงไปตรงมา เคล็ดลับทั้งหมดจะใช้ประกอบการจะกลับ ternary โดยตรง (เช่นถนัดreturnคำหลักคู่ของวงเล็บปีกกาและประกาศตัวแปรและการมอบหมาย)

โปรแกรมเต็มรูปแบบพร้อมกรณีทดสอบ:

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

เสียงกระเพื่อมสามัญ89 87 85 84 83 ไบต์

ฟังก์ชั่น:

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

ตัวอย่างการใช้งาน:

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

ลองออนไลน์! (ฉันเพิ่มฟังก์ชั่นการพิมพ์เพื่อดูผลลัพธ์ใน TIO)

ยินดีต้อนรับแนวคิดสำหรับการปรับปรุง


2

MATL, 54 45 44 42 ไบต์

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

ลองใช้ที่ matl.suever.net

เริ่มต้นด้วยการคำนวณค่าดัชนีมวลกายและเพิ่มขึ้นเป็นสองเท่าU\Eจากนั้นสร้างเวกเตอร์[37 50]ด้วยสตริงตัวอักษร '% 2' เปรียบเทียบค่าดัชนีมวลกายเวกเตอร์นี้และการใช้งานถ้างบจะได้คำตอบที่การใช้ประโยชน์จากเป็นที่กำหนดไว้ล่วงหน้าที่แท้จริงnormal17Y0


คุณสามารถแทนที่[BC]UQด้วย'%2'และบันทึก 2 ไบต์
sundar - Reinstate Monica

1

Java 8, 61 ไบต์

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

กำหนดให้ a DoubleFunction<DoubleFunction<String>>และโทรดังนี้:

bmi.apply(50).apply(1.5)

คุณสามารถสำรองหนึ่งไบต์โดย reusing :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 finalไม่สามารถมอบหมายให้กับ w
David Conrad

1
โอ้ ... ฉันได้ตรวจสอบกับสิ่งที่อยู่ในรายการแล้วเช่นint w = ... , h = ... ; System.out.println((w/=h*h)<18.5?"Underweight":w<25?"Normal":"Overweight")เดียวกันขอโทษ :)
Olivier Grégoire

@ OlivierGrégoireไม่มีปัญหา ฉันหวังว่า Java อนุญาต
David Conrad

1

dc , 64 ไบต์

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

ลองออนไลน์!


Dang it! แค่ตีฉันไม่กี่วินาที ฉันกำลังจะโพสต์ของฉันจนกว่าฉันจะเห็นสิ่งนี้ Anyways นี่เป็นอีกหนึ่งคำตอบที่ 64 3k[Overweight]??2^/dsp[[Normal]][[Underweight]]sasb25>blp18.5>apไบต์:
R. Kap

@ R.Kap คุณสามารถทำให้คุณสั้นลงได้มากกว่าหนึ่งไบต์โดยไม่ต้องใส่เครื่องหมายคำถาม
Mitchell Spector

โอ้ใช่ฉันลืมไปเลยว่าฉันทำได้ คุณสามารถโพสต์สิ่งนั้นด้วยตัวคุณเองหากคุณต้องการ
R. Kap

ไม่เป็นไร - ไปข้างหน้าแล้วโพสต์ด้วยตัวคุณเองนี่คือทางออกของคุณ (คุณสามารถเครดิตฉันสำหรับหนึ่งไบต์ถ้าคุณต้องการ.)
เซรั่มสเปคเตอร์

โดยวิธีการที่ฉันสามารถลดลงถึง 58 ไบต์ :)
R. Kap



1

Japt , 46 ไบต์

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

ลองออนไลน์!

แรงบันดาลใจจากคำตอบของ @ Lukeคำตอบ

คำอธิบาย

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

คลายการบีบอัดไปที่:

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

Japt Uมีการป้อนข้อมูลโดยปริยาย อินพุตที่สองคือVการป้อนข้อมูลที่สองคือ

Japt ใช้ไลบรารี shocoสำหรับการบีบอัดสตริง Backticks ใช้ในการคลายสาย

ทางลัด Unicode ที่ใช้:

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



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.