Zasada inwestycyjna „nogi” marketingu wielopoziomowego

10

Wyzwanie związane z marketingiem wielopoziomowym.

Rówieśnik chce zostać nagrodzony. Przyciągnął więc Ninwestorów ( N>=1), każdego i-tego inwestora x[i]. Gdy suma przekroczy próg, x[0]+x[1]+...+x[N-1] >= Tpartner może zostać nagrodzony. Ale tylko wtedy, gdy spełnione są następujące warunki:

  • Minimalna liczba inwestorów powinna być większa niż M(M<=N )
  • Dla co najmniej jednego całkowitą k, gdzie k>=Mi k<=Nwszelkie kinwestorów zainwestować przynajmniej T/kkażda;

Dany N, x[], T, M że powinieneś ustalić, czy nagroda partnera jest generowana, czy nie (wynik boolowski, „tak” lub „nie”). Najkrótszy kod wygrywa.

Przykłady:


N=5; M=3; T=10000, aby wygenerować nagrodę partnera, należy spełnić jedno z poniższych:

  • dowolne 3 zainwestowały co najmniej 3334 każdy
  • dowolne 4 zainwestowane co najmniej 2500 każdy
  • wszystkie 5 zainwestowało co najmniej 2000

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

  • dowolne 2 zainwestowane co najmniej 2500 każdy
  • 3 dowolne zainwestowane co najmniej 1667 każdego
  • każde 4 zainwestowało co najmniej 1250 każdego
  • każde 5 zainwestowało co najmniej 1000 każdego
  • wszystkie 6 zainwestowało co najmniej 834 każdy

uogólnione: dla każdego k, gdzie k>=Mi k<=N:

  • każdy kz Ninwestorów zainwestował przynajmniej T/kkażdy

Przypadki testowe:

format:

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
źródło
1
@JonathanAllan Pewnie, jeśli Twój język na to pozwala, a pisanie len(x)będzie krótsze niż pisanie N. Dzieje się tak, ponieważ dla dynamicznie alokowanej tablicy xw C nie ma bezpośredniej len(x)funkcji - dlatego zawsze możesz odnosić się do długości jako N. Dla wygody możesz rozważyć wszystkie dane wejściowe N, x[], T, Mjako niektóre zewnętrznie zdefiniowane stałe lub niektóre wbudowane języki.
xakepp35
1
Nie sądzę, że te powiadomienia dotarły do ​​nich (z łącznikami), ponieważ dostałem je do skrzynki odbiorczej.
Jonathan Allan
1
@JonathanAllan niezbyt dobrze zna składnię pingów i nazwy
niełacińskie
1
Czy można również odwrócić dane wyjściowe? Wartość falsey truei prawda false?
Shaggy
1
@ WîtWisarhd Kod golfa jest zwycięskim kryterium ... spójrz na tagi.
mbomb007

Odpowiedzi:

4

Galaretka ,  12  9 bajtów

ṢṚ×J$ṫ⁵<Ṃ

Pełny program, który akceptuje x T Mi drukuje, 0jeśli peer zostanie nagrodzony, a 1jeśli nie.

Wypróbuj online!

W jaki sposób?

ṢṚ×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
źródło
w przykładzie trzeci inwestor zainwestował mniej niż 1/3 T (mniej niż 33), ale wynik nadal liczy się jako pozytywny („każdy k zainwestował co najmniej T / k każdy” nie powiódł się)
xakepp35
Tak, stworzyłem go za pomocą prefiksów wartości posortowanych odwrotnie i pomyślałem, że mogę go zmienić na postfiksy posortowanych wartości, ale tak naprawdę nie mogłem, bo wtedy ogoniam ... cofam :)
Jonathan Allan
1
Tak, teraz skończyłem grać w golfa, piszę wyjaśnienie.
Jonathan Allan
1
Teraz „drukuje, 0jeśli rówieśnik zostanie nagrodzony, a 1jeśli nie”. (tzn. 0„tak”). Oszczędza 1 bajt :)
Jonathan Allan
3

05AB1E , 9 bajtów

{Rƶ.ssè›ß

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Port odpowiedzi galaretki @JonathanAllan , więc bierze również wejścia x T Mi wyjścia 0dla "yes"i 1dla "no". Jeśli nie jest to dozwolone i powinno zostać odwrócone, końcowe_ można dodać .

Wyjaśnienie:

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

Alternatywa dla .ssè:

sG¦}

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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
źródło
1
Nie powiedziałem na temat „w jaki sposób należy mapować dane wyjściowe”, po prostu, że muszą być one logiczne (mają tylko 2 stany). Więc tak, zdecydowanie możesz użyć 0 dla „tak” i 1 dla „nie” :)
xakepp35
2

JavaScript, 54 52 bajty

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

Wypróbuj online

Kudłaty
źródło
Także o 35–40% bardziej wydajne niż 72-bajtowe rozwiązanie. Piękny kod, który
wydaje się
Właśnie zauważyłem. Przypadek testowy nr 2 [0, 60, 0, 60, 60, 0], 180, 3 -> truewydaje się nie działać! 72 byted bersion radzi sobie dobrze. Błąd czy funkcja?)
xakepp35
2

Siatkówka , 79 bajtów

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

Wypróbuj online! Pobiera dane wejściowe w formacie [x], T, M. Link zawiera przypadki testowe. Wyjaśnienie:

\d+
*

Konwertuj na unary.

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

Sortuj [x]w kolejności malejącej.

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

Pomnóż każdy element [x]przez jego indeks.

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

Usuń pierwsze M-1elementy z [x].

(_+).*], \1,

Sprawdź, czy jakikolwiek pozostały element [x]jest większy lub równy T.

Neil
źródło
2

Perl 6 , 46 33 29 bajtów

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

Wypróbuj online!

Anonimowe bloki kodu, które przyjmują dane wejściowe w formularzu list, amount, length of list, minimum amount of investorsi zwracają połączenie prawda-falsey all, w którym prawda jest nieudana, a falsey jest sukcesem.

Wyjaśnienie:

{                           }  # 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?
Jo King
źródło
2

05AB1E , 6 bajtów

Wejście podjęte w celu T, N, x[], M
Wyjście jest 0na wzajemnej nagrody i 1jeśli nie

Ÿs{*›W

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

Ÿ        # 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
źródło
Fajna sztuczka z użyciem *zakresu do niejawnego przycięcia listy!
Kevin Cruijssen
2

C # (.NET Core) , 129 , 89 bajtów

EDYCJA: Podziękowania dla Kevina Cruijssena za grę w golfa z 40 bajtów i wyjaśnienie mechaniki, dlaczego!

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

Wypróbuj online!

Destroigo
źródło
1
106 bajtów Niektóre rzeczy, które zmieniłem: usunąłem dane wejściowe, nponieważ nigdzie ich nie używasz; usunięto, kponieważ możesz użyć msamego siebie; dodano zmienną ldla q.Lengthodkąd go używać dwa razy; połączyliśmy zmienne, int c=0,l=q.Length,j;aby nie potrzebować dodatkowych var; usunęliśmy niepotrzebne nawiasy, umieszczając wszystko w korpusie pętli; zmienił c>=kczek na c<k; i zmienił if(c>0)break;się m=c>0?l+1:m;, ponieważ pętla przestaje jeśli m<=l, zmieniając msię l+1zapisuje bajt nad break(i to również oszczędność na 2 nawiasach). :)
Kevin Cruijssen
1
Jeśli jeszcze tego nie widziałeś, wskazówki dotyczące gry w golfa w języku C # i wskazówki dotyczące gry w golfa w <wszystkich językach> mogą być interesujące do przeczytania.
Kevin Cruijssen
1
89 bajtów Niektóre dodatki do golfa w moim pierwszym komentarzu. m=c>0?l+1:mMoże być całkowicie usunięty, a &c<1kontrola może być dodana do obiegu, a nie. nPonownie biorąc dane wejściowe , już ich nie potrzebujesz, q.Lengthale możesz ich użyć n.
Kevin Cruijssen
2

C # (interaktywny kompilator Visual C #) z flagą /u:System.Linq.Enumerable, 69 bajtów

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

Wypróbuj 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()

Bez flag, 73 bajty

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

Wypróbuj online!

Wcielenie ignorancji
źródło
Pomyślałem o tym i stwierdziłem w opisie, że N> = 1, a M <= N Więc możesz trochę skrócić swoje rozwiązanie :)
xakepp35
1

JavaScript, 72 bajty

Kod

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

Wypróbuj online!

Akceptuje wprowadzanie w formacie (x [], T, M)

Wyjaśnienie

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
źródło
54 bajty ?
Arnauld
1
(Lub 53 bajty, jeśli znaczenie wartości logicznej można odwrócić.)
Arnauld
@Arnauld, 52 bajty ;)
Kudłaty
(Nawiasem mówiąc, wymyśliłem swoje rozwiązanie niezależnie od twojego komentarza, na wypadek gdybyś się zastanawiał - to część mojego rozwiązania Japt. Na telefonie komórkowym nie widzę właściwie sygnatur czasowych, aby powiedzieć, kto pierwszy.)
Shaggy
1

Python 3 , 136 bajtów

Wystarczy przetestować warunki, aby upewnić się, że zostały spełnione. 1, jeśli przyznana jest nagroda, 0, jeśli nie.

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*

Wypróbuj online!

Neil A.
źródło
1

Python ,  71  65 bajtów

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

Wypróbuj online!

Funkcja bez nazwy; port mojej galaretki odpowiedzi. Jako takie „tak” jest, Falsea „nie” jest True. Tutaj jednak odrzucamy przypadki testowe w ramach odwrócenia i korzystamy z możliwości zainicjowania enumerateliczenia M. ( mindziałałby również zamiast all)

Jonathan Allan
źródło
1

R , 43 42 bajty

-1 bajtów, wdrażając podejście jeszcze ściślej

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

Wypróbuj online!

Prosta implementacja R podejścia Jonathan's Jelly. Wypróbowałem kilka odmian, ale to najlepsze, co mogłem wymyślić, o kilka bajtów.

1 oznacza niepowodzenie, 0 oznacza sukces.

Kryminalnie Wulgarne
źródło
1

Japt, 16 14 13 11 bajtów

ñ í*WõX)d¨V

Spróbuj

ñ í*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
Kudłaty
źródło
0

Java 8, 91 (lub 89?) Bajtów

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

Port odpowiedzi C # .NET na @Destroigo (po tym, jak trochę grałem w golfa), więc pamiętaj, aby go zagłosować!

Pobiera odpowiednio wejścia N,x,T,Mi wyjścia true/ falsedla "yes"/ "no".

Ponieważ wyzwanie wymaga konkretnych booleanwyników, nie mogę zwrócić 1/ 0tak, jak jest, ponieważ nie są to prawidłowe wartości true / Falsey w Javie. Jeśli dowolne dwie odrębne wartości wyjściowe dla "yes"/ "no"są w zamian ważne dla tego wyzwania, >0zwrot może zostać usunięty, aby zapisać dwa bajty, w którym to przypadku odpowiednio zwróci 1/ 0dla "yes"/ "no".

Wypróbuj online.

Wyjaśnienie:

(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
źródło
0

C # (interaktywny kompilator Visual C #) , 66 bajtów

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

Wypróbuj online!

Inspirowany odpowiedzią @ EmbodimentOfIgnorance.

Wspomniałem o tym wcześniej, ale C # 8 ma dosłowny zakres, który może sprawić, że ta odpowiedź będzie taka:

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

Widziałem link do SharpLab z przykładem, ale nie byłem w stanie sam go uruchomić.

Jedną rzeczą, jaką był zmieniony xi twartości po przecinku. To obsługuje przypadek, w którym tnie można go podzielić ktrochę lepiej.

dana
źródło