쉽게 체중 감량하는 방법?


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위치 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

5
이 아닌가요 Y없이 X을 ?
Martin Ender

4
"무게를 쉽게 잃는 방법"을 의미합니까? "쉽게 체중 감량하는 방법?"..
Insane

3
@LeakyNun Right .. 제목에 농담이 있습니다. 대부분의 사람들이 그것을 나쁜 문법으로 읽었 기 때문에 : P
Insane

답변:


13

파이썬 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 인 경우 N≥b 1 b에 대해 바닥 (Na 1 / b 1 )> 바닥 (Na 2 / b 2 ) 2 .

증거 : a 1 / b 1 -a 2 / b 2 는 1 / b 1 b 2 의 배수 이므로 a 1 / b 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있습니까?
Lynn

2
@Lynn 불행히도, 같은 큰 입력에 실패합니다 [('y', 10**296+1, 1), ('x', 10**296, 1)].
xnor

8

자바 스크립트 (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]

정렬은 물론 과잉이지만 reduce46 바이트가 필요합니다.

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 ∧/로 나눈 시대의 ÷시대 (NO 수레 정도)

⎕× 프롬프트 (칼로리) 및 곱하기

(⊢⍳⌈/)그 에서 최대 값 의 위치 를 얻습니다.⌈/

⎕⊃⍨(활동에 대한) 프롬프트를 표시하고 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정수 이기 때문에 정수 나누기 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).

이 것을 주 슈퍼 (같은 동일한 이유로 느린 어제의 스택 교환 정전 ). 그것은 적절한 시간에 실행되도록하려면를 추가 할 수 \b의 앞에(0+) (입력 처리 방식에 영향을 미치지 않지만 해당 정규 표현식의 역 추적을 심각하게 제한 함). 아래 테스트 링크에서 그 작업을 수행했습니다.

온라인으로 사용해보십시오!


3

파이썬 2, 55 54 바이트

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

1 바이트를 골라내는 @xnor에게 감사드립니다!

Ideone에서 테스트하십시오 .


좋은! sorted2 입력 비교기 기능 을 사용할 수 있다는 것을 잊었습니다 . 함께 해킹하려고했습니다.
xnor

포장을 푸는 것이 더 짧은 것 같습니다 lambda(a,b,c),(d,e,f):b*f-c*e.
xnor

@xnor 깔끔한! 네가 할 수있는 줄 몰랐어
Dennis

2

하스켈 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} . 모든 최대 결과의 전체 세트를 반환합니다.

value1나누기 전에 분자에 L의 모든 LCM을 곱하여 분수 사용을 해결합니다 .


1

R, 42 40 바이트

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

열 유형의 문자열 (인수와 함께 작동), 숫자, 숫자를 사용하여 데이터 프레임 형식으로 입력을받습니다.

  • %/% 정수 나누기입니다.

이것은 첫 번째 제출물이며 규칙에 해당하는지 알려주세요.

편집 : 한 줄 함수를 정의하기 위해 중괄호가 필요하지 않습니다.


두 개의 유사한 비율이 같은 정수로 나뉘면 (예를 들어 7 / 3,9 / 4) 이것이 잘못된 답을 줄 수 있습니까?
Neil

내 이해는 그들이 동일한 정수로 나누면, 그것들 중 어느 것도 출력 할 수 있다는 것입니다. 이것은 데이터 프레임에서 첫 번째를 출력합니다.
Azor Ahai

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

하스켈, 46 바이트

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

편집 : 이 솔루션은 Damien이 지적한대로 작동하지 않으므로 문제가 해결되지 않습니다. 좋은 수정을 찾고 있습니다.


1
s(_,(x,y))=divMod y x더 짧습니다
Damien

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

2
그러나 이것으로 문제 divMod a b < divMod c d가 해결 되지는 않습니다 a/b < c/d. divMod 19 4 < divMod 55 12하지만19/4 > 55/12
Damien

음, 실제로 내 솔루션은 매우 열악합니다… 고맙습니다. 고마워요!
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

활동 및 매개 변수 테이블을 참조하는 스프레드 시트 셀을 호출하십시오.

enter image description here


1

05AB1E , 6 7 바이트

P¹÷*ZQÏ

내 divmod 접근법을 버그 수정하기 위해 +1 바이트 ( 다른 답변에 대한이 의견 참조)@LuisMendo 의 MATL 답변 을 이식 ) , 그를 해야합니다!

입력은 그의 대답과 비슷합니다. 세 개의 분리 된 목록, 정수 목록의 분모; 추천자의 정수 목록; 이름의 문자열 목록.

온라인으로 사용해보십시오 하거나 더 많은 테스트 사례를 확인 .

설명:

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

자바 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

클로저, 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;

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.