Як легко схуднути?


15

У цьому питанні ми зупинимося лише на схудненні, займаючись фізичними вправами, хоча ще багато способів схуднути.

Різні види спорту спалюють різну кількість калорій.

Наприклад, граючи в більярд протягом години, можна спалити 102 калорії [1] , а граючи в баскетбол протягом 15 хвилин, можна вже спалити 119 калорій [1] , що полегшує схуднення, граючи в баскетбол простіше, принаймні, з певної точки зору.

Точний спосіб зважити легкість - це ділення кількості спалених калорій на необхідний час, який дає нам індекс легкості (EI).

Наприклад, фехтування протягом 15 хвилин може спалити 85 калорій, що отримує ІІ 85/15.

Вам буде надано список у такому форматі:

[["fencing",15,85],["billiards",60,102],["basketball",15,119]]

або інший потрібний вам формат.

Тоді ви виведете види спорту, які мають найвищий EI.

TL; DR

Даний список кортежів [name,value1,value2]виводить, nameде value2/value1найбільше.

Обмеження

  • Ви не можете створювати реальне число, яке не є цілим числом у процесі.
  • Ви не можете використовувати будь-яку вбудовану фракцію.

Технічні характеристики (характеристики)

  • Якщо є кілька імен, які задовольняють результату, ви можете вивести будь-яке не порожнє підмножина з них або будь-який їх елемент.
  • Назва відповідатиме регулярному вираженню /^[a-z]+$/, що означає, що воно буде складатися лише з малої латинської стандартної абетки.
  • Список не буде порожнім.

Тестова шафа

Вхід:

[["fencing",15,85],["billiards",60,102],["basketball",15,119]]

Вихід:

basketball

Список літератури

  1. http://calorielab.com/burned/

1
Чи гаразд, якщо ділення цілих чисел на нашій мові створює дробовий тип за замовчуванням?
xnor

1
1. так 2. фракція вбудована
Leaky Nun


4
Ви маєте на увазі "Як легко схуднути?" не "Як легко схуднути?" ..
Insane

3
@LeakyNun Право .. всередині жарти над заголовками .. тому що більшість людей читають це як погану граматику: P
Insane

Відповіді:


13

Python 2, 51 байт

lambda l:max((10**len(`l`)*a/b,s)for s,b,a in l)[1]

Це очевидна річ, щоб знайти запис з найбільшим співвідношенням, але уникає заборони проти поплавків, попередньо помноживши чисельник на величезну потужність, що залежить від входу 10, перед поділом підлоги.

Я докажу, що цей коефіцієнт досить великий, щоб змусити ділити підлогу ту саму різницю, що і поділ без підлоги.

Затвердження: Якщо 1 / б 1 > а 2 / б 2 , то поверх (Na 1 / б 1 )> поверх (Na 2 / б 2 ) для будь-якого N≥b 1 б 2 .

Доказ: Зверніть увагу , що 1 / б 1 - це 2 / б 2 є кратним 1 / б 1 б 2 , таким чином, 1 / б 1 - a 2 / b 2 > 0 означає, що

a 1 / b 1 - a 2 / b 2 ≥ 1 / b 1 b 2

Потім, помноживши обидві сторони на N,

Na 1 / b 1 - Na 2 / b 2 ≥ N / b 1 b 2 ≥ 1

Отже, оскільки Na 1 / b 1 і Na 2 / b 2 відрізняються щонайменше на 1, їх відповідні поверхи відрізняються. ∎

Тепер зауважимо, що добуток b 1 b 2 має довжину цифри щонайбільше їх загальної довжини цифри, яка менша за довжину рядка вводу. Оскільки вхід знаходиться в базі 10, його достатньо використовувати 10 на потужність його довжини, N=10**len(`l`)щоб створити число з більшою кількістю цифр, ніж воно, гарантуючи умову.


Будь-який шанс, наприклад, 9може працювати замість 10?
Лінн

2
@Lynn На жаль, це не вдається для величезних вкладів, таких як [('y', 10**296+1, 1), ('x', 10**296, 1)].
xnor

8

JavaScript (ES6), 43 байти

a=>a.sort(([p,q,r],[s,t,u])=>q*u-r*t)[0][0]

Або в якості альтернативи

a=>a.sort((v,w)=>v[1]*w[2]-v[2]*w[1])[0][0]

Сортування, звичайно, є надмірним для цього, але reduceзайме 46 байт:

a=>a.reduce((v,w)=>v[1]*w[2]-v[2]*w[1]?v:w)[0]

7

MATL , 8 байт

pG/*&X<)

Всі обчислені числа є цілими значеннями. Спочатку обчислюється добуток знаменників (це ціле число). Цей продукт ділиться на кожний знаменник (який також дає ціле число). Кожен результат потім множиться на відповідний чисельник. Це дає ціле значення, пропорційне вихідному дробу.

Формат введення: числовий масив із знаменниками, числовий масив із чисельниками, масив комірок рядків із назвами спорту:

[85, 102, 119]
[15, 60, 15]
{'fencing', 'billiards', 'basketball'}

Якщо є кілька мінімізаторів, виводиться перший.

Спробуйте в Інтернеті!

p     % Take first input. Compute the product of its entries
G/    % Divide by first input element-wise
*     % Take second input. Multiply by previous array element-wise
&X<   % Argmax
)     % Take third input. Index into it using previous result. Display

5

Діалог APL , 18 байт

⎕⊃⍨(⊢⍳⌈/)⎕×(∧/÷⊢)⎕

Підкаже час, потім про калорії, потім за назви діяльності.

підказка (раз)

(∧/÷⊢)LCM ∧/часу, поділеного ÷на рази (так що жодних плавців)

⎕× підкажіть (на калорії) і помножте їх

(⊢⍳⌈/)в цьому , отримайте позицію максимального значення⌈/

⎕⊃⍨ підказка (для діяльності), а потім виберіть потрібне n- ю.

Приклад виконання:

      ⎕⊃⍨(⊢⍳⌈/)⎕×(∧/÷⊢)⎕
⎕:
      15 60 15
⎕:
      85 102 119
⎕:
      'fencing' 'billiards' 'basketball'
basketball

4

Брахілог , 42 байти

:{bh.}a*g:?z:2aott.
[D:[S:I:J]]tt:D*:I/:S.

Спробуйте в Інтернеті!

/вище - це ціле ділення, тому що обидва J*Dі Iє цілими числами (D є кратним Iфактично).

Пояснення

  • Основний предикат: Input = [["string":mins:cals]:...]

    :{bh.}a*                Multiply all mins in the Input together
            g:?z            Zip that number with the Input
                :2a         Apply predicate 2 to that zipped list
                   ott.     Sort the list of lists on the values of the first element of
                              sublists, Output is the string of the last sublist
    
  • Предикат 1:

    [D:[S:I:J]]             Input = [D:[S:I:J]]
               tt:D*        Multiply J by D
                    :I/     Divide the result by I
                       :S.  Output = [That number:S]
    

3

Сітківка , 64 62 байти

Кількість байтів передбачає кодування ISO 8859-1.

\d+
$*
%`\G1
0
1
:$_:
Ts`0p¶`0_`:.+?:
+`(0+) \1
@$1 
O`
!`\w+$

Введення - це один вид спорту на рядок, з форматом value1 value2 name. Вихід - це один із максимальних результатів (якщо є нічия, то це дасть найвищий value1і якщо вони зв'язані, якщо вони дадуть лексикографічно більше name).

Зверніть увагу , що це супер повільно (на ті ж причини , як вчора Stack Exchange , відключення електрики ). Щоб зробити його за розумну кількість часу, ви можете додати \bперед(0+) (що не вплине на те, як він взагалі обробляє вхід, але сильно обмежує зворотній трекінг цього регексу). Я це зробив у тестовому посиланні нижче.

Спробуйте в Інтернеті!


3

Python 2, 55 54 байт

lambda x:sorted(x,lambda(S,N,D),(s,n,d):N*d-n*D)[0][0]

Дякуємо @xnor за те, що виграли 1 байт!

Перевірте це на Ideone .


Приємно! Я забув, що sortedможе взяти функцію компаратора з двома входами, я збирався зламати це разом.
xnor

Здається, він коротше розпакувати lambda(a,b,c),(d,e,f):b*f-c*e.
xnor

@xnor Охайний! Я не знав, що ти можеш це зробити.
Денніс

2

Haskell 72 70 байт

import Data.List
(n,(x,y))%(m,(a,b))=compare(x*b)$y*a
fst.minimumBy(%)

Використання:

main=putStr$(fst.minimumBy(%))[("fencing",(15,85)),("billiards",(60,102)),("basketball",(15,119))]

1

Математика, 46 байт

Last/@MaximalBy[#,g=LCM@@First/@#;g#2/#&@@#&]&

Порядок кортежів повинен бути {value1,value2,name}. Повертає повний набір усіх максимальних результатів.

Я працюю навколо використання дробів, множуючи чисельник на LCM всіх value1s перед діленням.


1

R, 42 40 байт

function(v)v[which.max(v[,3]%/%v[,2]),1]

Приймає дані у вигляді кадру даних із типом рядків стовпців (він також працює з факторами), числовим, числовим.

  • %/% це ціле ділення.

Це моє перше подання, дайте мені знати, чи це в межах правил.

Редагувати: виявляється, вам не потрібні дужки для визначення однолінійної функції.


Чи може це дати неправильну відповідь, якщо два подібних співвідношення поділяються на одне ціле число, наприклад 7 / 3,9 / 4?
Ніл

Я розумію, якщо вони поділяються на одне ціле число, ви можете вивести будь-яке з них, це виведе перше в кадрі даних.
Азор Ахай

1

C ++ 14, 89 байт

Функція лямбда:

[](auto s,int*a,int*b,int l){int r=--l;while(l--)r=b[l]*a[r]>a[l]*b[r]?l:r;return s[r];};

Безголівки:

[](auto s,int*a,int*b,int l)
{
  int r = --l;
  while(l--)
    r = b[l] * a[r] > a[l] * b[r] ? l : r;
  return s[r];
};

Використання:

#include <iostream>

int main()
{
  const char* s[] = {"fencing", "billiards", "basketball"};
  int a[] = {15,60,15};
  int b[] = {85,102,119};
  std::cout << [](auto s,int*a,int*b,int l){int r=--l;while(l--)r=b[l]*a[r]>a[l]*b[r]?l:r;return s[r];}(s,a,b,3);
}

1

Haskell, 46 байт

s(n,(x,y))=(divMod y x,n)
g =snd.maximum.map s

EDIT: Це рішення не працює, як вказував Дамієн, це не вирішує проблему. Я шукаю приємне виправлення.


1
s(_,(x,y))=divMod y xкоротше
Дамієн

1
s(n,(x,y))=(divMod y x,n) g=snd.maximum.map sтеж ..
Дамієн

2
Але це не вирішує проблему як divMod a b < divMod c dне рівнозначну a/b < c/d. divMod 19 4 < divMod 55 12але19/4 > 55/12
Дамієн

Ммм, справді моє рішення досить бідне… Я подумаю про гарне виправлення, дякую!
villou24

1

VBA Excel, 109 байт

Function A(B)
R=1
For I=2 To B.Rows.Count
If B(R,2)*B(I,3)>B(I,2)*B(R,3) Then R=I
Next
A=B(R,1)
End Function

Викликати в клітинку електронної таблиці посилання на таблицю дій та параметрів:

введіть тут опис зображення


1

05AB1E , 6 7 байт

P¹÷*ZQÏ

+1 байт для виправлення мого підходу divmod ( див. Цей коментар щодо іншої відповіді ) за допомогою перенесення відповіді MATL @LuisMendo , тому переконайтеся , що upvote його!

Введення подібне до його відповіді: три розділені списки, що представляють собою цілий список знаменників; цілий список номінаторів; і рядок-список імен.

Спробуйте в Інтернеті або перевірте ще кілька тестових випадків .

Пояснення:

P       # Take the product of the (implicit) input-list of denominators
        #  i.e. [85,102,119] → 1031730
 ¹÷     # (Integer)-divide it by each of the denominators of the first input-list
        #  i.e. 1031730 / [85,102,119] → [12138,10115,8670]
   *    # Multiply each (at the same positions) by the (implicit) input-list of nominators
        #  i.e. [12138,10115,8670] * [15,60,15] → [182070,606900,130050]
    Z   # Get the maximum of this list (without popping the list itself)
        #  i.e. [182070,606900,130050] → [182070,606900,130050] and 606900
     Q  # Check which values are equal to this maximum
        #  i.e. [182070,606900,130050] and 606900 → [0,1,0]
      Ï # Only leave the strings of the (implicit) input-list of names at the truthy indices
        #  i.e. ["fencing","billiards","basketball"] and [0,1,0] → ["billiards"]
        # (after which the result is output implicitly)

0

Java 8, 128 байт

String f(List<Object[]>l){return l.stream().max((x,y)->(int)x[2]*1000/(int)x[1]-(int)y[2]*1000/(int)y[1]).get()[0].toString();}

0

Рубін, 72 байти

e=0;while gets;n=$_.split;f=eval n[2]+"/"+n[1];m,e=n[0],f if f>e;end;p m

Я дійсно думав, що це буде коротше ...

Вхід береться з STDIN у форматі name time calories

Ну добре, будь-яка допомога скоротити її цінується.



0

PHP , 98 байт

Використовується більш простий формат введення, ніж приклад, саме так:

фехтування, 15,85, більярд, 60,102, баскетбол, 15,119

$s=explode(",",$argn);for($x=0;$s[$x];$x+=3){if($y<$e=$s[$x+2]/$s[$x+1]){$y=$e;$z=$s[$x];}}echo$z;

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.