Проблема:
Ваша задача - написать программу, которая принимает в качестве входных данных рост (в метрах) и вес (в килограммах) и выводит соответствующую категорию ИМТ.
ИМТ - это показатель отношения вашего веса к вашему росту. Это датировано и неточно для многих людей , но это не имеет значения здесь!
ИМТ может быть рассчитан с использованием следующего уравнения:
BMI = (mass in kilograms) / (height in meters)^2
Категории будут определены следующим образом:
ИМТ <18,5: «Недостаточный вес»
18,5 <= ИМТ <25: «Нормальный»
25 <= ИМТ: «Избыточный вес»
Ради вызова я игнорирую все "экстремальные" категории. Кроме того, поскольку некоторые числа, такие как «25», расположены между двумя категориями, я немного скорректировал границы, чтобы получить определенный ответ.
Вы можете написать либо функцию, либо полную программу.
Входные данные:
Ввод может быть в любой разумной форме. Два числа (или строки), либо как 2 отдельных аргумента, либо как одна строка. Массив / список из 2 чисел, словарь с ключами "weight" и "height" ... Должны поддерживаться десятичные значения. Вы можете предположить, что ввод всегда будет действительным (без отрицательных значений, а высота никогда не будет 0).
Выход:
Вывод будет строкой, содержащей имена категорий без учета регистра . Строки должны соответствовать именам категорий точно так же, как указано выше, без учета регистра. Он может быть выведен на стандартный вывод, возвращен (в случае функции) или записан в файл.
Тестовые случаи (вес, рост => результат):
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"
Это код-гольф, поэтому выигрывает наименьшее количество байтов.
(Да, эта задача чрезвычайно тривиальна на большинстве языков. Большинство задач в последнее время кажутся сложнее, чем обычно, поэтому я решил опубликовать более доступную).
НОТА! Спустя час после того, как я опубликовал это задание, мне пришлось немного изменить диапазоны, поскольку указанные диапазоны имели «дыры», как указано в комментариях. Пожалуйста, смотрите новые диапазоны.
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 байт
Попробуйте онлайн!
Сравните с 72 байтами:
источник
TI-Basic,
5854 байтаКроме того, для забавы, вот более компактная версия, которая больше байтов:
Все, что я могу сказать, это спасибо, что сделали это без учета регистра;)
PS
Input
принимает граф вводаX
иY
аналогиченPrompt X,Y
источник
ERWEIGHT
Mathematica, 67 байт
Использует тот факт, что
a[b,c][[Sign@d]]
возвращает,a
еслиd
равно 0, возвращает,b
еслиd
положительно, и возвращает,c
еслиd
отрицательно.⌊...⌋
являетсяFloor
функцией Mathematica, использующей трехбайтовые символы U + 230A и U + 230B. Не могу понять, как сделать лучше, чем использоватьweight
дважды.источник
Рубин,
91777467 байтПервая наивная попытка:
Вторая попытка с «вдохновением» из предыдущих ответов:
Третья попытка:
Четвертая попытка:
Попробуйте онлайн!
источник
JavaScript (ES6),
70 67 6463 байтаСохранено 4B благодаря Арно
использование
Выход
объяснение
Этот ответ довольно тривиален, хотя есть один хитрый трюк:
Underweight
иOverweight
оба заканчиваютсяerweight
, поэтому нам нужно только изменить эти символы.Я предположил, что это
Normal
означает ИМТ между 25 (исключая) и 18,5 (включительно).Underweight
означает ИМТ менее 18,5 иOverweight
означает ИМТ, больший или равный 25.источник
C, 81 байт
источник
05AB1E , 28 байт
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
QBIC ,
6158 байт@Luke использовал Силу и отрубил два байта. Благодарность!
Изменения правил сохранены еще один байт.
Объяснение:
источник
Python 2 , 72 байта
Попробуйте онлайн!
источник
<!-- language-all: lang-python -->
что TIO автоматически вставляется для меня.Python 3,
9795 байтПолная программа.
Умножьте на пять, чтобы сохранить байт. Спасибо Джонатан Аллан.
Построчно:
Сопоставьте два разделенных пробелами пользовательских ввода с целыми числами. Распакуйте в a и b.
Рассчитать
Если bmi составляет от 18,6 до 25 включительно, выражение справа будет иметь значение True. Логические значения могут быть 0 или 1 при использовании в качестве индексов списка, поэтому мы получаем либо «Normal», либо составную строку в нулевом индексе. «erweight» - это общий суффикс для оставшихся двух опций, поэтому его не нужно повторять. Затем мы используем шаблон [start: stop: step] списка Python / нарезки строк. c> 18.6 оценивается как 0 или 1 (False или True) и становится нашим началом. Стоп не указан, поэтому мы идем до конца буквального. Шаг 2, поэтому мы берем каждый второй индекс. Если start start имеет значение 1, мы получаем «Ov», в противном случае мы получаем «Und». В любом случае, мы добавляем «erweight» к тому, что мы получили, и у нас есть окончательный результат.
источник
def f(h,w):c=h/w/w;print(["UOnvd"[c>18.6::2]+"erweight","Normal"][18.6<=c<=25])
93
и125
. Если вы используете лямбду, вы должны рассчитыватьc
в обоих местах, но не должны называть функцию или использованиеprint()
, так можно сделатьlambda h,w:["UOnvd"[h/w/w*5>93::2]+"erweight","Normal"][93<=h/w/w*5<=125]
для 73.c
удвоенное умножение на 5, это будет стоить больше, чем экономит в лямбде, так что всегоlambda h,w:["UOnvd"[h/w/w>18.6::2]+"erweight","Normal"][18.6<=h/w/w<=25]
за 72R,
89848074 байтаКивнув на ответ Октави в StewieGriffin, он создает массив строк, затем суммирует результат
BMI < c(18.5,25)
и ссылается на массив в этой позиции + 1.Первым аргументом должен быть рост, затем вес; если это не разрешено, то
работает еще на 4 байта.
источник
Clojure, 63 байта
источник
постоянный ток , 58 байт
Принимает ввод как 2 разделенных пробелом числа в формате
<mass> <height>
. Выводит строку в отдельной строке.Попробуйте онлайн!
объяснение
Для целей этого объяснения, ввод
80 1
.источник
Октава, 64 байта
Попробуйте онлайн
Это анонимная функция, которая принимает два входных аргумента
h
(высота) иw
(вес).Функция создает массив ячеек, содержащий там строки
'Underweight','Normal','Overweight'
, и выводит номер строки3-sum(2*w/h^2<'%2')
.Да, это выглядит немного странно. Нам нужна первая строка if
w/h^2<=18.5
, вторая строка if(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 байтов, что много. Вместо этого мы умножаем ИМТ на 2 и сравниваем результат с[37, 50]
или'%2'
в ASCII. Это экономит три байта.источник
Perl 6 , 59 байт
Как это работает
Жаль, что строка
erweight
должна повторяться, но все варианты, которые я пробовал, чтобы избежать этого, привели к увеличению общего числа байтов:С подстановкой строки, 62 байта:
С интерполяцией строки, 67 байтов:
Примерный перевод решения xnor's Python , 65 байт:
источник
PowerShell , 81 байт
Попробуйте онлайн!
объяснение
Основной бит, который нуждается в объяснении, - это
18.5,25 -lt $b
(где я заменяю$b
ИМТ, который вычисляется на месте в коде). Большинство операторов в PowerShell при задании массива с левой стороны возвращают массив элементов, которые удовлетворяют критерию, вместо того, чтобы возвращать логическое значение. Так что это вернет пустой массив, если$b
он меньше 18,5, массив, содержащий только 18,5, если он посередине, и массив, содержащий как 18,5, так и 25, если он больше 25.Я использую количество элементов в качестве индекса в массиве строк, поэтому count
0
получает элемент,0
который'Underweight'
и т. Д.источник
OCaml, 93 байта
источник
Python,
7574 байтаПопробуйте онлайн!
Довольно базовое решение, которое использует методы других людей для его решения.
Спасибо @ovs за сохранение байта.
альтернативы
1. 73 байта
Я отклонил это, поскольку это было слишком похоже на другой ответ, который я видел.
2. 71 байт
Я отклонил это, потому что, несмотря на работу над всеми тестами в вопросе, есть некоторые цифры, на которых он может потерпеть неудачу, поскольку он пропускает
=
в<=
.источник
25
иelse
- но в любом случае использование короткого замыканияand/or
(как прокомментировал @ovs) короче.25
иelse
, вы , безусловно , сделать это нужно, с некоторыми (большинство?) Переводчиков ( в том числе CPython, IIRC). Если вы пишете это как25else
, то25e
интерпретируется как начало числового литерала научной нотации, и интерпретатор тогда скрывается, когда нет следующих цифр.C #,
636261 байтСохранено еще 1 байт благодаря TheLethalCoder .
Сохранено 1 байт благодаря анонимному пользователю.
Довольно простая анонимная функция. Весь трюк использует троичный оператор для прямого возврата (таким образом, опуская
return
ключевое слово, пару фигурных скобок и объявление и присваивание переменной).Полная программа с тестовыми примерами:
источник
Common Lisp,
8987858483 байтаФункция:
Пример использования:
Попробуйте онлайн! (Я добавил функцию печати, чтобы увидеть вывод в TIO)
Идеи по улучшению приветствуются.
источник
MATL,
54454442 байтаПопробуйте это на matl.suever.net
Начинается с вычисления ИМТ и его удвоения
U\E
, затем создается вектор[37 50]
со строковым литералом "% 2". Сравнивает ИМТ с этим вектором и использует операторы if, чтобы получить ответ, используяnormal
в качестве предопределенного литерала17Y0
.источник
[BC]UQ
с'%2'
и сохранить 2 байта.Java 8, 61 байт
Назначьте
DoubleFunction<DoubleFunction<String>>
и вызовите таким образом:источник
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
Не могу назначить на w.int w = ... , h = ... ; System.out.println((w/=h*h)<18.5?"Underweight":w<25?"Normal":"Overweight")
, извините :)Округ Колумбия , 64 байта
Попробуйте онлайн!
источник
3k[Overweight]??2^/dsp[[Normal]][[Underweight]]sasb25>blp18.5>ap
.Javascript (ES6), 63 байта
пример
источник
Swift, 97 байт
источник
Japt , 46 байт
Попробуйте онлайн!
Вдохновленный @ Люка ответом .
объяснение
Распаковывает в:
Джапт имеет скрытый вклад
U
. Второй вход естьV
.Japt использует библиотеку shoco для сжатия строк. Обратные галочки используются для распаковки строк.
Используемые ярлыки Unicode:
источник
PHP , 121 байт
Попробуйте онлайн!
источник
Скала, 124 байта
источник
REXX, 113 байт
источник