簡単に減量する方法は?


15

この質問では、運動をして体重を減らすことにのみ焦点を当てますが、体重を減らす方法はまだたくさんあります。

異なるスポーツは異なる量のカロリーを消費します。

たとえば、1時間のビリヤードをプレイすると102カロリー[1]を消費できますが、15分間のバスケットボールをプレイすると119カロリー[1]を燃焼できます。

簡単さを比較する正確な方法は、消費カロリーを必要な時間で割ることで、簡単さの指標(EI)が得られます。

たとえば、15分間のフェンシングでは85カロリーを消費でき、85/15のEIが得られます。

次の形式のリストが表示されます。

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

またはあなたが望む他のフォーマット。

次に、最高のEIを持つスポーツを出力します。

TL; DR

タプル[name,value1,value2]出力のリストが与えられると、namewhere 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.分数組み込み
リーキー修道女


4
「簡単に体重を減らす方法」という意味ですか?「簡単に減量する方法」ではない..
非常識な

3
@LeakyNun Right ..タイトルのジョークの内側..大多数の人がそれを悪い文法と読んだため:P
非常識な

回答:


13

Python 2、51バイト

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

最大の比率のエントリを見つけることは明らかですが、フロア分割の前に分子に入力依存の10のべき乗を掛けることで、フロートの禁止を回避します。

この係数は、フロア分割が非フロア分割と同じ違いを発揮するのに十分な大きさであることを証明します。

項:もし1 / B 1 > 2 / B 2は、フロアし(Na 1 / B 1)>フロアし(Na 2 / B 2任意N≥b用)1 B 2

証明: a 1 / b 1 -a 2 / b 2は1 / b 1 b 2の倍数であるため、a 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

したがって、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

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+$

入力は、形式ごとに1行に1つのスポーツですvalue1 value2 name。出力は最大の結果の1つです(同点の場合、最大の結果が得られ、value1それらが同様に結び付けられている場合、辞書式に大きくなりますname)。

これは非常に遅いことに注意してください(昨日のStack Exchangeの停止とまったく同じ理由で)。妥当な時間で実行するには\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 Neat!そんなことができるとは知りませんでした。
デニス

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]

列タイプの文字列(因子でも機能します)、数値、数値のデータフレームの形式で入力を受け取ります。

  • %/% 整数除算です。

これが私の最初の提出です。ルール内にあるかどうかを教えてください。

編集: 1行関数を定義するのに中括弧は必要ないことがわかりました。


2つの同様の比率が同じ整数、たとえば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

編集:この解決策は、ダミアンが指摘したように機能しませんが、これは問題を解決しません。いい修正を探しています。


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/ddivMod 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

05AB1E6 7 バイト

P¹÷*ZQÏ

@LuisMendoのMATL回答を移植することにより、私のdivmodアプローチをバグ修正するための+1バイト(別の回答に関するこのコメントを参照てください。

入力は彼の答えに似ています:分母の整数リストである3つの分離されたリスト。ノミネーターの整数リスト。および名前の文字列リスト。

オンラインそれを試してみてくださいまたはいくつかのより多くのテストケースを検証します

説明:

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;

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.