マルチレベルのマーケティング「レッグ」投資ルール


10

マルチレベルのマーケティング関連の課題。

仲間は報われることを望んでいます。そのため、N投資家を惹きつけ(N>=1)、各i番目の投資家が投資しましたx[i]。合計がしきい値を超えるとx[0]+x[1]+...+x[N-1] >= T、ピアに報酬が与えられます。ただし、次の条件が満たされている場合のみ。

  • 投資家の最低額はM、(M<=N)より大きくする必要があります
  • 少なくとも1つの整数kについて、k>=Mk<=Nで、k投資家は少なくともT/kそれぞれに投資する必要があります。

N, x[], T, Mピアの報酬が生成されるかどうかを決定する必要がある場合(ブール結果、「はい」または「いいえ」)。最短のコードが勝ちます。

例:


N=5; M=3; T=10000、ピアの報酬を生成するには、次のいずれかを満たす必要があります。

  • いずれか3つが少なくとも3334を投資
  • 各4は少なくとも2500を投資
  • 5つすべてがそれぞれ最低2000を投資

N=6; M=2; T=5000

  • 任意の2つがそれぞれ2500以上を投資
  • いずれか3つが少なくとも1667を投資
  • 任意の4つが少なくとも1250ずつ投資
  • いずれか5つが少なくとも1000を投資
  • 6つすべてがそれぞれ少なくとも834投資しました

一般化:すべてのk、場所k>=M、およびk<=N

  • どんなkN投資家は、少なくとも投資しT/k、それぞれを

テストケース:

フォーマット:

N, x[], T, M -> correct answer

6, [999, 999, 59, 0, 0, 0], 180, 3 -> 0
6, [0, 60, 0, 60, 60, 0], 180, 3 -> 1
6, [179, 89, 59, 44, 35, 29], 180, 3 -> 0
6, [179, 89, 59, 44, 35, 30], 180, 3 -> 1
6, [179, 89, 59, 44, 36, 29], 180, 3 -> 1
6, [179, 90, 59, 44, 35, 29], 180, 3 -> 0
6, [30, 30, 30, 30, 29, 30], 180, 3 -> 0
6, [30, 30, 30, 30, 30, 30], 180, 3 -> 1

1
@JonathanAllanもちろん、あなたの言語で可能であれば、書くlen(x)ことは書くことよりも短くなりますN。これはx、C で動的に割り当てられた配列には直接のlen(x)関数がないためですN。つまり、常に長さをとして参照できます。便宜上、すべての入力データN, x[], T, Mを外部で定義された定数または言語の組み込みと見なすことができます。
xakepp35

1
受信トレイに届いたので、それらの通知が(ハイフンで)届いたとは思わない
ジョナサンアラン

1
@JonathanAllanは、ping構文や非ラテン語の名前に慣れていません。多分それらはいつか戻ってくるでしょう:)
xakepp35

1
また、出力を反転させることはできますか?の偽の値trueとの真の値false
シャギー

1
@WîtWisarhdコードゴルフは勝利基準です...タグを見てください。
mbomb007

回答:


4

ゼリー 12  9 バイト

ṢṚ×J$ṫ⁵<Ṃ

仲間が報われるかどうかを受け入れx T M、印刷する完全なプログラム。01

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

どうやって?

ṢṚ×J$ṫ⁵<Ṃ - Main Link: list of numbers, x; number, T   e.g. [100, 50, 77, 22, 14, 45], 180
Ṣ         - sort x                                          [ 14, 22, 45, 50, 77,100]
 Ṛ        - reverse                                         [100, 77, 50, 45, 22, 14]
    $     - last two links as a monad:
   J      -   range of length                               [  1,  2,  3,  4,  5,  6]
  ×       -   multiply                                      [100,154,150,180,110, 84]
     ṫ    - tail from index:
      ⁵   -   5th argument (3rd input), M   (e.g. M=3)      [        150,180,110, 84]
       <  - less than T?                                    [          1,  0,  1,  1]
        Ṃ - minimum                                         0

動作していないようです:tio.run
##

例では、3番目の投資家はTの3分の1未満(33未満)を投資しましたが、結果は依然としてポジティブとしてカウントされます(「kはそれぞれ少なくともT / kを投資した」は失敗しました)
xakepp35

ええ、私は逆ソートされた値のプレフィックスを使用してそれを作成し、ソートされたポストフィックスに変更できると思いましたが、実際にはできませんでした。なぜなら、テーリングしているためです...元に戻しました:)
Jonathan Allan

1
ええ、ゴルフを終えた今、説明を書いています。
ジョナサンアラン

1
これは「0仲間に報酬が与えられた1場合とそうでない場合に出力」します。(つまり0、「はい」)。1バイトを節約します:)
Jonathan Allan

3

05AB1E、9 バイト

{Rƶ.ssè›ß

オンラインそれを試してみたり、すべてのテストケースを確認してください

@JonathanAllanのゼリーの答えは、そうも入力とりx T Mと出力0"yes"1のために"no"。これが許可されておらず、反転する必要がある場合は、末尾_を追加できます。

説明:

{           # Sort the (implicit) input `x`
            #  i.e. `x`=[100,50,77,22,14,45] → [14,22,45,50,77,100]
 R          # Reverse it
            #  i.e. [14,22,45,50,77,100] → [100,77,50,45,22,14]
  ƶ         # Multiply it by it's 1-indexed range
            #  i.e. [100,77,50,45,22,14] → [100,154,150,180,110,84]
   .s       # Get all the suffices of this list
            #  i.e. [100,154,150,180,110,84]
            #   → [[84],[110,84],[180,110,84],[150,180,110,84],[100,154,150,180,110,84]]
     s      # Swap to take the (implicit) input `T`
      è     # Get the prefix at index `T`
            #  i.e. [[84],[110,84],[180,110,84],[150,180,110,84],[100,154,150,180,110,84]]
            #   and `T=3` → [150,180,110,84]
           # Check for each list-value if the (implicit) input `M` is larger than it
            #  i.e. [150,180,110,84] and `M`=180 → [1,0,1,1]
        ß   # And pop and push the minimum value in the list (which is output implicitly)
            #  i.e. [1,0,1,1] → 0

の代替.ssè

sG¦}

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

s       # Swap to take the (implicit) input `T`
 G }    # Loop `T-1` times:
  ¦     #  Remove the first item from the list that many times
        #   i.e. [100,154,150,180,110,84] and `T=3` → [150,180,110,84]

1
「出力をどのようにマップするべきか」については述べていません。ブール値である必要があります(状態が2つしかない)。だからはい、明確に「はい」には0を、「いいえ」には1を使用できます:)
xakepp35

2

JavaScript、54 52バイト

(x,t,m,n)=>x.sort((a,b)=>a-b).some(i=>i*n-->=t&n>=m)

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


また、72バイトのソリューションより35〜40%パフォーマンスが向上します。素敵なコードは、プロダクションMLM関連のWebプロジェクトに組み込む準備ができているように感じました:^)
xakepp35

気づいた。テストケース#2 [0, 60, 0, 60, 60, 0], 180, 3 -> trueが機能していないようです。72 byted bersionで問題なく処理できます。バグまたは機能?)
xakepp35

2

網膜、79バイト

\d+
*
O^`_+(?=.*])
_+(?=.*])(?<=(\W+_+)+)
$#1*$&
+`\W+_+(.*_)_$
$1
(_+).*], \1,

オンラインでお試しください!形式で入力を受け取ります[x], T, M。リンクにはテストケースが含まれます。説明:

\d+
*

単項に変換します。

O^`_+(?=.*])

[x]降順で並べ替えます。

_+(?=.*])(?<=(\W+_+)+)
$#1*$&

の各要素に[x]インデックスを掛けます。

+`\W+_+(.*_)_$
$1

の最初のM-1要素を削除し[x]ます。

(_+).*], \1,

の残りの要素[x]が以上であるかどうかをテストしTます。


2

Perl 6の46の33 29バイト

{$^b>all $^a.sort Z*[...] @_}

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

フォームに入力を取りlist, amount, length of list, minimum amount of investors、真実/偽のallジャンクションを返す匿名コードブロック。真偽は失敗し、偽は成功です。

説明:

{                           }  # Anonymous code block
     all                       # Are all of
         $^a.sort                # The sorted list
                  Z*             # Zip multiplied by
                     [...] @_    # The range from length of list to the minimum amount
 $^b>                          # Not smaller than the given amount?

2

05AB1E、6バイト

順番に撮影した入力TNx[]M
出力された0ピア報酬と1そうでない場合

Ÿs{*›W

オンラインでお試しください! またはテストスイートとして

説明

Ÿ        # push the range [N ... T]
 s{      # push the list x[] sorted ascending
   *     # elementwise multiplication (crops to shortest list)
    ›    # for each element, check if M is greater than it
     W   # push min of the result
         # output implicitly

*範囲を使用して暗黙的にリストを切り抜く素敵なトリック!
Kevin Cruijssen、

2

C#(.NET Core)129、89バイト

編集:メカニックを理由について説明しながら40バイトをゴルフしてくれたKevin Cruijssenに感謝します!

(n,q,t,m)=>{int c=0,j;for(;m<=n&c<1;c=c<m++?0:1)for(j=n;j-->0;)c+=q[j]<t/m?0:1;return c;}

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


1
106バイト私が変更したもののいくつか:入力をnどこでも使用しないので削除しました。k自分で使用できるため削除されましたm。変数lq.Length2回使用するために追加しました。変数を組み合わせたint c=0,l=q.Length,j;ため、追加のは必要ありませんvar。forループ本体にすべてを入れることにより、不要なブラケットを削除しました。c>=kチェックをに変更しましたc<k。および変更if(c>0)break;m=c>0?l+1:m;ループがあれば停止するので、m<=l変化、ml+1オーバーバイトを保存しbreak(それはまた2つのブラケットの節約)。:)
Kevin Cruijssen

1
あなたはまだそれを見ていない場合は、C#でのゴルフのヒントでゴルフのヒント<すべての言語は>を通じて、読み取りに面白いかもしれません。
Kevin Cruijssen、

1
89バイト私の最初のコメントでゴルフにいくつかの追加。をm=c>0?l+1:m完全に削除し、&c<1代わりにループにチェックを追加できます。そして、n再度入力を取得するq.Lengthことで、もう必要ありませんが、n代わりに使用できます。
Kevin Cruijssen、

2

C#(Visual C#Interactive Compiler)、フラグ付き/u:System.Linq.Enumerable、69バイト

(n,x,t,m)=>Range(0,n-m+1).Where(b=>x.Count(a=>a>=t/(b+m))>=b+m).Any()

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

// Takes in 4 parameters as input
(n,x,t,m)=>
// Create a new array with the length of all the numbers from m to n, inclusive
Range(0,n-m+1)
// And filter the results by
.Where((_,b)=>
// If the number of people that invested more than the total amount divided by the index plus m
x.Count(a=>a>=t/(b+m))
// Is greater than the index plus m
>= b+m)
// And check if there is at least one value in the filtered IEnumerable<int>, and if there is, return true
.Any()

フラグなし、73バイト

(n,x,t,m)=>new int[n-m+1].Where((_,b)=>x.Count(a=>a>=t/(b+m))>=b+m).Any()

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


私はそれを考え、N> = 1、M <= Nと説明で述べたので、ソリューションを少し短くすることができます:)
xakepp35

1

JavaScript、72バイト

コード

(x,T,M)=>x.sort(t=(d,e)=>e-d).map((s,i)=>s*i+s).slice(M-1).sort(t)[0]>=T

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

形式(x []、T、M)の入力を受け入れます

説明

x.sort(t=(d,e)=>e-d)     \\sort numbers in reverse numerical order
.map((s,i)=>s*i+s)       \\Multiply each number in array by position(1 indexed) in array
.slice(M-1)              \\Remove the first M-1 elements (at least M people)
.sort(t)[0]              \\Get the maximum value in the array
>=T                      \\True if the maximum value is >= the threshold


1
(ブール値の意味を逆にすることができる場合は53バイト。)
Arnauld

@ Arnauld、52バイト ;)
Shaggy

(ちなみに、疑問に思った方のために、コメントとは別に私のソリューションを思いつきました。これはJaptソリューションの移植版です。モバイルではタイムスタンプが正しく表示されず、誰が最初に投稿したかがわかりません。)
Shaggy

1

Python 3、136バイト

条件をテストして、条件が満たされていることを確認します。報酬が与えられる場合は1、与えられない場合は0。

lambda N,x,T,M:(sum(x)>=T)*(M<=N)*any(any(all(j>=T/k for j in i)for i in combinations(x,k))for k in range(M,N+1))
from itertools import*

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


1

Python 71  65バイト

lambda x,T,M:all(i*v<T for i,v in enumerate(sorted(x)[-M::-1],M))

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

名前のない関数。私のゼリー答えのポート。したがって、「はい」と「いいえ」は同じFalseですTrue。ただし、ここでは、反転の一部としてテストケースを破棄し、へのenumerateカウントを開始する機能を利用しMます。(のmin代わりにも機能しますall


1

R43 42バイト

アプローチをさらに厳密に実装することにより-1バイト

function(N,x,S,M)min(sort(x,T)[M:N]*M:N<S)

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

JonathanのJellyアプローチの単純なR実装。たくさんのバリエーションを試してみましたが、これは数バイトで考えられる最高のピップです。

1は失敗を意味し、0は成功を意味します。


1

Japt、16 14 13 11バイト

ñ í*WõX)d¨V

それを試してみてください

ñ í*WõX)d¨V
                  :Implicit input of array U=x and integers V=T, W=M & X=N
ñ                 :Sort U
  í               :Interleave with
    WõX           :  Range [W,X]
   *              :  And reduce each pair of elements by multiplication
       )          :End interleaving
        d         :Any
         ¨V       :  Greater than or equal to V

0

Java 8、91(または89?)バイト

(N,x,T,M)->{int c=0,j;for(;M<=N&c<1;c=c<M++?0:1)for(j=N;j-->0;)c+=x[j]<T/M?0:1;return c;}

@DestroigoのC#.NET回答のポート(あとでゴルフをした後)なので、必ず彼に賛成票を投じてください!

入力とりN,x,T,M出力をtrue/ falseのために"yes"/ "no"夫々 。

チャレンジは特にboolean結果を要求するので、1/を0そのまま返すことはできません。これらはJavaで有効な真偽値ではないためです"yes"/の2つの異なる出力値が"no"このチャレンジで有効な場合>0は、戻り値のinを削除して2バイトを節約できます。この場合、/がそれぞれ1/ 0として返されます。"yes""no"

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

説明:

(N,x,T,M)->{           // Method with the four parameters and boolean return-type
  int c=0,             //  Count integer, starting at 0
      j;               //  Temp index integer
  for(;M<=N            //  Loop as long as `M` is smaller than or equal to `N`
       &c<1            //  and `c` is not 1 yet:
      ;                //    After every iteration:
       c=c<M++?        //     If `M` is smaller than `c`:
                       //     (and increase `M` by 1 afterwards with `M++`)
          0            //      Set `c` to 0
         :             //     Else:
          1)           //      Set `c` to 1
    for(j=N;j-->0;)    //   Inner loop `j` in the range (`N`,0]:
       c+=             //    Increase the counter `c` by:
          x[j]         //     If the `j`'th value in `x`
              <T/M?    //     is smaller than `T` divided by `M`:
                   0   //      Leave the counter `c` unchanged by adding 0
                  :    //     Else:
                   1;  //      Increase the counter `c` by 1
  return c>0;}         //  Return whether the counter `c` is 1

0

C#(Visual C#Interactive Compiler)、66バイト

(n,x,t,m)=>Enumerable.Range(m,n-m+1).Any(k=>x.Count(y=>y>=t/k)>=k)

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

@EmbodimentOfIgnoranceの回答に触発されました。

これについては前に触れましたが、C#8には範囲リテラルがあり、この答えを次のようにすることができます。

(n,x,t,m)=>[m..n-m+1].Any(k=>x.Count(y=>y>=t/k)>=k)

例を挙げてSharpLabへのリンクを見ましたが、自分で機能させることができませんでした。

私が変更したことの1 つはでxt値は小数です。これは、少しだけt割り切れない場合を処理しkます。

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