Regra de investimento de "pernas" de marketing multinível

10

Desafio relacionado a marketing multinível.

Um colega quer ser recompensado. Por isso, atraiu Ninvestidores ( N>=1), cada i-ésimo investidor x[i]. Quando uma soma total excede o limite, x[0]+x[1]+...+x[N-1] >= Tum par pode ser recompensado. Mas somente se as seguintes condições forem atendidas:

  • A quantidade mínima de investidores deve ser maior que M, ( M<=N)
  • Para pelo menos um número inteiro k, onde k>=Me k<=N, qualquer kinvestidor deve investir pelo menos T/kum;

Dado que N, x[], T, Mvocê deve determinar se a recompensa do par é gerada ou não (resultado booleano, "sim" ou "não"). O menor código vence.

Exemplos:


N=5; M=3; T=10000, para gerar a recompensa do parceiro, um dos seguintes itens deve ser satisfeito:

  • quaisquer 3 investiram pelo menos 3334 cada
  • quaisquer 4 investiram pelo menos 2500 cada
  • todos os 5 investiram pelo menos 2000 cada

N=6; M=2; T=5000:

  • quaisquer 2 investiram pelo menos 2500 cada
  • quaisquer 3 investiram pelo menos 1667 cada
  • quaisquer 4 investiram pelo menos 1250 cada
  • quaisquer 5 investiram pelo menos 1000 cada
  • todos os 6 investiram pelo menos 834 cada

generalizado: para qualquer k, onde k>=Me k<=N:

  • qualquer kdos Ninvestidores investiu pelo menos T/kcada

Casos de teste:

formato:

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
xakepp35
fonte
11
@ JonathanAllan Claro, se o seu idioma permitir, a escrita len(x)será mais curta que a escrita N. Isso é feito, porque para a matriz alocada dinamicamente xem C não há len(x)função direta - portanto, você sempre pode se referir ao comprimento como N. Por conveniência, você pode considerar todos os dados de entrada N, x[], T, Mcomo algumas constantes definidas externamente ou como alguns idiomas incorporados.
precisa saber é o seguinte
11
Acho que essas notificações não chegaram até eles (com os hífens) quando as recebi na caixa de entrada.
Jonathan Allan
11
@JonathanAllan não completamente familiarizado com o ping sintaxe e não-latinos nomes .. talvez eles vão voltar algum dia :)
xakepp35
11
Além disso, a saída pode ser revertida? Um valor de falsey para truee um valor de verdade para false?
Shaggy
11
@ WîtWisarhd O código de golfe é um critério vencedor ... veja as tags.
mbomb007

Respostas:

4

Geléia ,  12  9 bytes

ṢṚ×J$ṫ⁵<Ṃ

Um programa completo que aceita x T Me imprime 0se o par é recompensado e 1se não.

Experimente online!

Como?

ṢṚ×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
Jonathan Allan
fonte
em terceiro exemplo investidores investido menos de 1/3 do T (inferior a 33), mas resultam ainda considerados como positivos ( "k qualquer investido pelo menos T / k cada" falhou)
xakepp35
Sim, eu criei-lo usando prefixos de valores ordenados-reversa e pensei que eu poderia mudá-lo para sufixos de ordenados, mas na verdade não podia porque eu estou em seguida, rejeito ... revertido :)
Jonathan Allan
11
Sim, agora que terminei de jogar, estou escrevendo uma explicação.
Jonathan Allan
11
Agora "imprime 0se o par é recompensado e 1se não". (ou seja, 0é "sim"). Ele salva 1 byte :)
Jonathan Allan
3

05AB1E , 9 bytes

{Rƶ.ssè›ß

Experimente online ou verifique todos os casos de teste .

O porto da resposta Jelly de @JonathanAllan , também aceita as entradas x T Me saídas 0de "yes"e 1para "no". Se isso não for permitido, e deve ser invertido, _pode ser adicionado um final .

Explicação:

{           # 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

Alternativa para .ssè:

sG¦}

Experimente online ou verifique todos os casos de teste .

Explicação:

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]
Kevin Cruijssen
fonte
11
Eu não afirmei em "como você deve mapear a saída", apenas que ela deve ser booleana (possui apenas 2 estados). Então, sim, definitivamente você pode usar 0 para "sim" e 1 para "não" :)
xakepp35
2

JavaScript, 54 52 bytes

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

Experimente online

Shaggy
fonte
Também 35-40% a mais de desempenho que a solução de 72 bytes. Código Lovely, senti como se o seu pronto para ser incorporado em produção projetos web MLM-relacionados: ^)
xakepp35
Apenas notei. O caso de teste nº 2 [0, 60, 0, 60, 60, 0], 180, 3 -> trueparece não estar funcionando! A bersão de 72 bytes lida com isso. Erro ou recurso?)
xakepp35
2

Retina , 79 bytes

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

Experimente online! Recebe entrada no formato [x], T, M. O link inclui casos de teste. Explicação:

\d+
*

Converta para unário.

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

Classifique [x]em ordem decrescente.

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

Multiplique cada elemento de [x]pelo seu índice.

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

Exclua os primeiros M-1elementos de [x].

(_+).*], \1,

Teste se algum elemento restante de [x]é maior ou igual a T.

Neil
fonte
2

Perl 6 , 46 33 29 bytes

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

Experimente online!

Blocos de código anônimo que list, amount, length of list, minimum amount of investorsrecebem entrada no formulário e retornam uma alljunção truthy / falsey , onde truthy falha e falsey é sucesso.

Explicação:

{                           }  # 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?
Brincadeira
fonte
2

05AB1E , 6 bytes

Entrada tomada no fim T, N, x[], M
de saída é 0para a recompensa pelos pares e 1se não

Ÿs{*›W

Experimente online! ou como um conjunto de testes

Explicação

Ÿ        # 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
Emigna
fonte
Bom truque de usar *com o intervalo para cortar implicitamente a lista!
Kevin Cruijssen 7/01/19
2

C # (.NET Core) , 129 , 89 bytes

EDIT: Obrigado a Kevin Cruijssen por jogar 40 bytes ao explicar a mecânica do porquê!

(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;}

Experimente online!

Destroigo
fonte
11
106 bytes Algumas das coisas que mudei: Removida a entrada, npois você não a usa em lugar nenhum; removido kdesde que você possa se usar m; adicionou uma variável lpois q.Lengthdesde que você a usa duas vezes; combinou as variáveis int c=0,l=q.Length,j;para que você não precise das adicionais var; removeu os suportes desnecessários colocando tudo no corpo do loop for; alterou a c>=kverificação para c<k; e alterou if(c>0)break;para m=c>0?l+1:m;, pois o loop para se m<=l, mudando mpara l+1salva um byte em excesso break(e também salva em dois colchetes). :)
Kevin Cruijssen
11
Se você ainda não o viu, pode ser interessante ler dicas de golfe em C # e dicas de golfe em <todos os idiomas> .
Kevin Cruijssen 8/01/19
11
89 bytes Algumas adições aos campos de golfe no meu primeiro comentário. O m=c>0?l+1:mpode ser removido completamente e uma &c<1verificação pode ser adicionada ao loop. E, ao receber a entrada nnovamente, você não precisa q.Lengthmais, mas pode usá-la n.
Kevin Cruijssen 8/01/19
2

C # (compilador interativo do Visual C #) com sinalizador /u:System.Linq.Enumerable, 69 bytes

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

Experimente online!

// 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()

Sem nenhum sinalizador, 73 bytes

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

Experimente online!

Modalidade de ignorância
fonte
Pensei nisso, e afirmou na descrição que N> = 1 e M <= N Então você pode encurtar sua solução um pouco :)
xakepp35
1

JavaScript, 72 bytes

Código

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

Experimente online!

Aceita entrada no formato (x [], T, M)

Explicação

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
fəˈnɛtɪk
fonte
54 bytes ?
Arnauld
11
(Ou 53 bytes se o significado do valor booleano pode ser invertida.)
Arnauld
@Arnauld, 52 bytes ;)
Salsicha
(A propósito, eu vim com a minha solução independentemente do seu comentário, caso você esteja se perguntando - é uma porta da minha solução Japt. No celular, portanto, não consigo ver os carimbos de hora para saber quem postou primeiro.)
Shaggy
1

Python 3 , 136 bytes

Apenas testa as condições para garantir que elas sejam cumpridas. 1 se a recompensa for dada, 0 se não.

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*

Experimente online!

Neil A.
fonte
1

Python ,  71  65 bytes

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

Experimente online!

Uma função sem nome; porta da minha resposta Jelly. Como tal, "sim" é Falsee "não" é True. Aqui, no entanto, descartamos os casos de teste como parte da reversão e aproveitamos a capacidade de iniciar a enumeratecontagem M. ( mintambém funcionaria no lugar de all)

Jonathan Allan
fonte
1

R , 43 bytes 42

-1 bytes implementando a abordagem ainda mais de perto

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

Experimente online!

Implementação R simples da abordagem de Jonathan's Jelly. Eu tentei um monte de variações, mas isso representa o melhor que pude pensar em alguns bytes.

1 implica falha, 0 implica sucesso.

CriminallyVulgar
fonte
1

Japt, 16 14 13 11 bytes

ñ í*WõX)d¨V

Tente

ñ í*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
Shaggy
fonte
0

Bytes Java 8, 91 (ou 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;}

Porta da resposta C # .NET do @Destroigo (depois que eu joguei mais um pouco), por isso não deixe de vota-lo!

Toma entradas N,x,T,Me saídas true/ falsepara "yes"/ "no"respectivamente.

Como o desafio pede especificamente booleanresultados, não posso retornar o 1/ 0como está, pois esses não são valores válidos de verdade / falsey em Java. Se quaisquer dois valores de saída distintos para "yes"/ "no"forem válidos para esse desafio, o >0retorno pode ser descartado para salvar dois bytes; nesse caso, ele retornará 1/ 0para "yes"/ "no"respectivamente.

Experimente online.

Explicação:

(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
Kevin Cruijssen
fonte
0

C # (compilador interativo do Visual C #) , 66 bytes

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

Experimente online!

Inspirado na resposta de @ EmbodimentOfIgnorance.

Já mencionei isso antes, mas o C # 8 tem um intervalo literal que pode tornar essa resposta algo como isto:

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

Vi um link para o SharpLab com um exemplo, mas não consegui fazê-lo funcionar sozinho.

Uma coisa que mudei foi os valores xe tsão decimais. Isso lida com o caso em que tnão é divisível kum pouco melhor.

dana
fonte