如何轻松减肥?


15

在这个问题上,尽管减肥的方法仍然很多,但我们只会专注于通过运动来减肥。

不同的运动会消耗不同量的卡路里。

例如,打台球一个小时可以燃烧102卡路里[1],而打篮球15分钟可以燃烧119卡路里[1],至少从某些角度来看,这使打篮球更容易减轻体重。

衡量舒适度的确切方法是将燃烧的卡路里量除以所需的时间,从而得出舒适度指数(EI)。

例如,击剑15分钟可以燃烧85卡路里的热量,EI为85/15。

您将获得以下格式的列表:

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

或您想要的其他格式。

然后,您将输出具有最高EI的运动。

TL; DR

给定一个元组[name,value1,value2]输出列表,name其中where value2/value1最高。

约束条件

  • 您可能不会在该过程中产生任何非整数的实数。
  • 不得使用任何内置分数。

规格(规格)

  • 如果满足该结果的名称不止一个,则可以输出它们的任何非空子集或它们的任何元素。
  • 该名称将与regex匹配/^[a-z]+$/,这意味着它仅由小写的拉丁文标准字母组成。
  • 该列表将不会为空。

测试用例

输入:

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

输出:

basketball

参考文献

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

1
默认情况下,如果用我们的语言对整数进行除数是否可以生成分数类型,可以吗?
xnor

1
1.是2.内置分数
Leaky Nun

5
没有Y的X难道不是吗?
Martin Ender

4
您的意思是“如何轻松减肥”?不是“如何减肥容易吗?” ...
疯狂的

3
@LeakyNun对..在标题上开玩笑..因为大多数人都把它看作是坏语法:P
Insane 2016年

Answers:


13

Python 2,51字节

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

做查找具有最大比率的条目这一明显的事情,但是通过在分隔之前先将分子乘以10的依赖于输入的巨大幂来避开对浮点数的禁止。

我将证明该系数足够大,可以使楼层划分的行为与非楼层划分的行为相同。

要求:如果a 1 / b 1 > a 2 / b 2,则地板为(Na 1 / B 1)>地板(钠2 / B 2),用于任何N≥b 1 b 2

证明:请注意,a 1 / b 1 -a 2 / b 2是1 / b 1 b 的倍数 2,因此1 / b 1 -a 2 / b 2 > 0意味着

一个1 / B 1 -一个2 / B 2 ≥1 / B 1 b 2

然后,将两边都乘以N,

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

所以,因为娜 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

Dyalog APL,18 字节

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

提示输入时间,然后输入卡路里,然后输入活动名称。

提示(多次)

(∧/÷⊢)时间的LCM ∧/除以÷时间(因此没有浮动)

⎕× 提示(获取卡路里)并乘以它们

(⊢⍳⌈/)在那得到最大值的位置⌈/

⎕⊃⍨提示(用于活动),然后选择第n个。

示例运行:

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

4

Brachylog,42个字节

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

在线尝试!

/上面是整数除法,因为J*DI都是整数(DI实际上是的倍数)。

说明

  • 主要谓词: 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)。

请注意,这是超级慢(对于完全相同的理由,昨天的堆栈交易所停运)。要使其在合理的时间内运行,您可以\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

Mathematica,46个字节

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

元组的顺序应为{value1,value2,name}。返回所有最大结果的完整集合。

我通过将分子乘以value1除法前所有s 的LCM来解决分数的使用问题。


1

R,42 40字节

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

以数据框的形式接受输入,其中的列类型为字符串(也适用于因子),数字,数字。

  • %/% 是整数除法。

这是我的第一次提交,请让我知道它是否在规则范围内。

编辑:事实证明您不需要花括号来定义单行功能。


如果两个相似的比率除以相同的整数(例如7 / 3,9 / 4),这可能会给出错误的答案?
尼尔

我的理解是,如果将它们除以相同的整数,则可以输出其中的任何一个,这将输出数据帧中的第一个。
Azor Ahai

1

C ++ 14,89个字节

Lambda函数:

[](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

编辑:该解决方案不起作用,达米安指出,这不能解决问题。我正在寻找一个不错的解决方法。


1
s(_,(x,y))=divMod y x较短
-Damien

1
s(n,(x,y))=(divMod y x,n) g=snd.maximum.map s太..
达米安

2
但这并不能解决divMod a b < divMod c d不等于的问题a/b < c/ddivMod 19 4 < divMod 55 12但是19/4 > 55/12
Damien

嗯,我的解决方案确实很差……我会想办法解决的,谢谢!
villou24 '16

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

05AB1E6 7 字节

P¹÷*ZQÏ

+1字节通过移植@LuisMendo的MATL答案来修正我的divmod方法(请参见其他答案的评论),因此请确保对他进行投票

输入类似于他的答案:三个分开的列表,是分母的整数列表;提名人的整数列表;以及名称的字符串列表。

在线尝试验证更多测试用例

说明:

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

Ruby,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

Clojure,63个字节

#((last(sort(fn[[x a b][y c d]](-(* b c)(* a d)))%))0)

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;

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.