Regola d'investimento "gambe" di marketing multilivello


10

Sfida di marketing multilivello.

Un pari vuole essere ricompensato. Quindi ha attirato gli Ninvestitori ( N>=1), ogni investitore ha investito x[i]. Quando una somma totale supera la soglia, x[0]+x[1]+...+x[N-1] >= Tun pari può essere ricompensato. Ma solo se sono soddisfatte le seguenti condizioni:

  • L'importo minimo degli investitori dovrebbe essere maggiore di M, ( M<=N)
  • Per almeno un numero intero k, dove k>=Me k<=N, tutti gli kinvestitori devono investire almeno T/kciascuno;

Dato che N, x[], T, Mè necessario determinare se la ricompensa del peer viene generata o meno (risultato booleano, "sì" o "no"). Il codice più corto vince.

Esempi:


N=5; M=3; T=10000, al fine di generare la ricompensa del pari, deve essere soddisfatto uno dei seguenti:

  • ogni 3 ha investito almeno 3334 ciascuno
  • qualsiasi 4 investito almeno 2500 ciascuno
  • tutti e 5 hanno investito almeno 2000 ciascuno

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

  • ogni 2 ha investito almeno 2500 ciascuno
  • ogni 3 ha investito almeno 1667 ciascuno
  • qualsiasi 4 investito almeno 1250 ciascuno
  • qualsiasi 5 investito almeno 1000 ciascuno
  • tutti e 6 hanno investito almeno 834 ciascuno

generalizzato: per qualsiasi k, dove k>=Me k<=N:

  • uno qualsiasi kdegli Ninvestitori ha investito almeno T/kciascuno

Casi test:

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

1
@JonathanAllan Certo, se la tua lingua lo consente, e la scrittura len(x)sarà più breve della scrittura N. Questo è fatto, perché per l'array allocato in modo dinamico xin C non esiste una len(x)funzione diretta , quindi puoi sempre fare riferimento alla lunghezza come N. Per comodità, è possibile considerare tutti i dati di input N, x[], T, Mcome alcune costanti definite esternamente o come incorporati in alcune lingue.
xakepp35,

1
Non credo che quelle notifiche li abbiano raggiunti (con i trattini) mentre li ho ricevuti nella mia casella di posta.
Jonathan Allan,

1
@JonathanAllan non è abbastanza familiare con la sintassi del ping e i nomi non latini .. forse torneranno un giorno :)
xakepp35

1
Inoltre, è possibile invertire l'output? Un valore false per truee un valore true per false?
Shaggy,

1
@ WîtWisarhd Il golf del codice è un criterio vincente ... guarda i tag.
mbomb007,

Risposte:


4

Gelatina ,  12  9 byte

ṢṚ×J$ṫ⁵<Ṃ

Un programma completo che accetta x T Me stampa 0se il peer viene premiato e in 1caso contrario.

Provalo online!

Come?

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


ad esempio il terzo investitore ha investito meno di 1/3 di T (meno di 33), ma il risultato è stato comunque considerato positivo ("qualsiasi k investito almeno T / k ciascuno" non è riuscito)
xakepp35

Sì, l'ho creato usando i prefissi dei valori in ordine inverso e ho pensato di poterlo modificare in postfissi di valori ordinati, ma in realtà non potevo perché sto facendo la coda ... ripristinata :)
Jonathan Allan

1
Sì, ora ho finito di giocare a golf, sto scrivendo una spiegazione.
Jonathan Allan,

1
Ora "stampa 0se il peer viene premiato e in 1caso contrario". (ovvero 0è "sì"). Salva 1 byte :)
Jonathan Allan il

3

05AB1E , 9 byte

{Rƶ.ssè›ß

Provalo online o verifica tutti i casi di test .

Porta della risposta Jelly di @JonathanAllan , quindi prende anche gli input x T Me gli output 0per "yes"e 1per "no". Se ciò non è consentito e deve essere invertito, è _possibile aggiungere un finale .

Spiegazione:

{           # 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 per .ssè:

sG¦}

Provalo online o verifica tutti i casi di test .

Spiegazione:

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
Non ho dichiarato "come si dovrebbe mappare l'output", solo che deve essere booleano (avere solo 2 stati). Quindi sì, sicuramente puoi usare 0 per "sì" e 1 per "no" :)
xakepp35

2

JavaScript, 54 52 byte

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

Provalo online


Anche il 35-40% in più di prestazioni rispetto alla soluzione a 72 byte. Lovely code, sembrava pronto per essere incorporato in progetti web correlati alla produzione MLM: ^)
xakepp35

Appena notato. Il caso di test n. 2 [0, 60, 0, 60, 60, 0], 180, 3 -> truesembra non funzionare! 72 bersion byted lo gestisce bene. Bug o funzionalità?)
xakepp35

2

Retina , 79 byte

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

Provalo online! Accetta input nel formato [x], T, M. Il link include casi di test. Spiegazione:

\d+
*

Converti in unario.

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

Ordina [x]in ordine decrescente.

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

Moltiplica ogni elemento di [x]per il suo indice.

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

Elimina i primi M-1elementi di [x].

(_+).*], \1,

Verifica se qualsiasi elemento rimanente di [x]è maggiore o uguale a T.


2

Perl 6 , 46 33 29 byte

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

Provalo online!

Blocchi di codice anonimi che list, amount, length of list, minimum amount of investorsaccettano input nella forma e restituiscono una giunzione di verità / falsità all, dove la verità è fallita e la falsità è successo.

Spiegazione:

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

Ingresso preso nell'ordine T, N, x[], M
uscita è 0per ricompensa pari e 1se non

Ÿs{*›W

Provalo online! o come una suite di test

Spiegazione

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

Bel trucco da utilizzare *con l'intervallo per ritagliare implicitamente l'elenco!
Kevin Cruijssen,

2

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

EDIT: Grazie a Kevin Cruijssen per il golf off 40 byte mentre spiega i meccanismi sul perché!

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

Provalo online!


1
106 byte Alcune delle cose che ho cambiato: rimosso l'input npoiché non lo si utilizza da nessuna parte; rimosso kpoiché è possibile utilizzare mse stesso; aggiunta una variabile lper q.Lengthpoiché la usi due volte; combinato le variabili in int c=0,l=q.Length,j;modo da non aver bisogno di ulteriori var; rimosso le parentesi non necessarie mettendo tutto nel corpo for-loop; ha cambiato il c>=ksegno di spunta in c<k; e cambiato if(c>0)break;in m=c>0?l+1:m;, poiché il ciclo si interrompe se m<=l, cambiando min l+1salva un byte break(e salva anche su 2 parentesi). :)
Kevin Cruijssen l'

1
Se non l'hai ancora visto, Suggerimenti per giocare a golf in C # e Suggerimenti per giocare a golf in <tutte le lingue> potrebbero essere interessanti da leggere, attraverso.
Kevin Cruijssen,

1
89 byte Alcune aggiunte al golf nel mio primo commento. È m=c>0?l+1:mpossibile rimuovere completamente e invece è &c<1possibile aggiungere un controllo al loop. E riprendendo l'input n, non è più necessario q.Lengthma è possibile utilizzarlo n.
Kevin Cruijssen,

2

C # (compilatore interattivo Visual C #) con flag /u:System.Linq.Enumerable, 69 byte

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

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

Senza flag, 73 byte

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

Provalo online!


Ci ho pensato e ho affermato nella descrizione che N> = 1 e M <= N Quindi potresti abbreviare un po 'la tua soluzione :)
xakepp35

1

JavaScript, 72 byte

Codice

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

Provalo online!

Accetta input in formato (x [], T, M)

Spiegazione

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
(O 53 byte se il significato del valore booleano può essere invertito.)
Arnauld

@Arnauld, 52 byte ;)
Shaggy

(A proposito, ho trovato la mia soluzione indipendentemente dal tuo commento, nel caso ti stessi chiedendo: è una porta della mia soluzione Japt. Sul cellulare quindi non riesco a vedere correttamente i timestamp per dire chi ha pubblicato per primo.)
Shaggy

1

Python 3 , 136 byte

Verifica solo le condizioni per assicurarti che siano soddisfatte. 1 se viene assegnato il premio, 0 in caso contrario.

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*

Provalo online!


1

Python ,  71  65 byte

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

Provalo online!

Una funzione senza nome; porto della mia risposta Jelly. In quanto tale "sì" è Falsee "no" è True. Qui, tuttavia, scartiamo i casi di test come parte dell'inversione e sfruttiamo la capacità di avviare il enumerateconteggio M. ( minfunzionerebbe anche al posto di all)


1

R , 43 42 byte

-1 byte implementando l'approccio ancora più da vicino

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

Provalo online!

Semplice implementazione R dell'approccio Jelly di Jonathan. Ho provato un sacco di varianti ma questo pips è il migliore che mi viene in mente di pochi byte.

1 implica fallimento, 0 implica successo.


1

Japt, 16 14 13 11 byte

ñ í*WõX)d¨V

Provalo

ñ í*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 (o 89?) Byte

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

La risposta di Port # @ Cestro .NET di @Destroigo (dopo averlo giocato ancora un po '), quindi assicurati di votarlo!

Accetta input N,x,T,Me output true/ falseper "yes"/ "no"rispettivamente.

Poiché la sfida richiede specificamente booleanrisultati, non posso restituire 1/ così 0com'è, dal momento che questi non sono valori di verità / falsità validi in Java. Se invece sono validi due valori di output distinti per "yes"/ "no"è valido per questa sfida, è possibile che il valore >0in the return venga eliminato per salvare due byte, nel qual caso restituirà 1/ 0per "yes"/ "no"rispettivamente.

Provalo online.

Spiegazione:

(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 # (compilatore interattivo Visual C #) , 66 byte

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

Provalo online!

Ispirato dalla risposta di @ EmbodimentOfIgnorance.

Ne ho già parlato prima, ma C # 8 ha un intervallo letterale che potrebbe rendere questa risposta qualcosa del genere:

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

Ho visto un link a SharpLab con un esempio, ma non sono riuscito a farlo funzionare da solo.

Una cosa che ho cambiato è stata xe i tvalori sono decimali. Questo gestisce il caso in cui tnon è divisibile per kun po 'meglio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.