多层次营销“腿”投资规则


10

与多层次营销相关的挑战。

一位同伴想要获得奖励。因此,它吸引了N投资者(N>=1),每个第i个投资者都进行了投资x[i]。当总和超过阈值时x[0]+x[1]+...+x[N-1] >= T,可以奖励同伴。但仅在满足以下条件时:

  • 最低投资额应大于MM<=N
  • 对于至少一个整数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>=Mk<=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。这样做是因为对于xC中的动态分配数组没有直接len(x)函数-因此您可以始终将length称为N。为方便起见,您可以将所有输入数据N, x[], T, M视为某些外部定义的常数或某些内置的语言。
xakepp35

1
当我在收件箱中收到这些通知时,我认为这些通知(带有连字符)不会到达。
乔纳森·艾伦,

1
@JonathanAllan不太熟悉ping语法和非拉丁名称..也许他们会返回某天:)
xakepp35

1
另外,输出可以反转吗?的假值true和真值false
毛茸茸的

1
@WîtWisarhdCode高尔夫是一个成功的准则...看一下标签。
mbomb007'1

Answers:


4

果冻 12  9 字节

ṢṚ×J$ṫ⁵<Ṃ

一个完整的程序,该程序接受x T M并打印0对等方是否被奖励1

在线尝试!

怎么样?

ṢṚ×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
##

例如,第三位投资者的投资额少于T的1/3(少于33),但结果仍算为正数(“任何k至少投资了T / k的投资”都失败了)
xakepp35

是的,我使用反向排序值的前缀创建了它,并认为我可以将其更改为排序后缀,但是实际上不能,因为我要拖尾...还原:)
Jonathan Allan

1
是的,现在我已经打完高尔夫球了,我正在写一个解释。
乔纳森·艾伦

1
现在,它“打印0是否给予同伴奖励1”。(即0“是”)。它保存1个字节:)
乔纳森·艾伦

3

05AB1E,9 个字节

{Rƶ.ssè›ß

在线尝试验证所有测试用例

@JonathanAllan的Jelly答案的端口,因此也接受for 和for 的输入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拜占庭式的泊车就可以了。Bug或功能?)
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

使用*范围隐式裁剪列表的好技巧!
凯文·克鲁伊森

2

C#(.NET Core)129,89字节

编辑:感谢凯文·克鲁伊森(Kevin Cruijssen)在解释其原因的机制的同时打了40个字节!

(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.Length,因为您使用两次; 合并变量,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#高尔夫球技巧<all language>高尔夫球技巧可能会很有趣。
凯文·克鲁伊森

1
89个字节在我的第一个评论中对高尔夫进行了一些补充。m=c>0?l+1:m可以将其完全删除,而可以将&c<1检查添加到循环中。通过n再次输入,您不再需要q.Length,而可以使用它n
凯文·克鲁伊森

2

带标志的C#(Visual C#交互式编译器)/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个字节;)
粗野的

(顺便说一句,如果您想知道,我会独立于您的评论提出我的解决方案-这是我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

蟒蛇 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中这些值不是有效的true / falsey值。如果任何两个不同的输出值"yes"/ "no"有效期为这种挑战相反,>0在回可被丢弃,以节省两个字节,在这种情况下,它会返回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#交互式编译器),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的链接带有示例的,但无法自己使用。

我更改的一件事是xt值是小数。这可以处理t不能被k更好地整除的情况。

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.