Правило інвестування на багаторівневому маркетингу


10

Проблема, пов'язана з маркетингом на багаторівневому рівні.

Ровесник хоче отримати нагороду. Тож це залучало Nінвесторів ( N>=1), кожен i-й інвестор інвестував x[i]. Коли загальна сума перевищує поріг, x[0]+x[1]+...+x[N-1] >= Tрівний може бути винагороджений. Але лише за умови виконання наступних умов:

  • Мінімальна сума інвесторів повинна бути більшою, ніж M( M<=N)
  • Принаймні одне ціле число k, куди k>=Mі k<=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:

  • будь-який kз Nінвесторів вклав , по крайней мере 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 - не зовсім знайомий із синтаксисом пінг, і не латинськими іменами .. можливо, вони повернуться якийсь день :)
xakepp35

1
Також, чи може бути виворотний результат? Значення фальси trueі значення false?
Кошлатий

1
@ WîtWisarhd Code Golf - це критерій виграшу ... дивіться на теги.
mbomb007

Відповіді:


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


наприклад, третій інвестор вклав менше 1/3 T (менше 33), але результат все ще вважається позитивним ("будь-який k вклав принаймні T / k кожен" не вдався)
xakepp35

Так, я створив його за допомогою префіксів зворотно-відсортованих значень і подумав, що можу змінити його на постфікси відсортованих, але насправді не міг, тому що я тоді підписую ... повернуто :)
Джонатан Аллан

1
Так, зараз я закінчив гольф, пишу пояснення.
Джонатан Аллан

1
Тепер він "друкує, 0якщо колега нагороджений, а 1якщо ні". (тобто 0"так"). Це економить 1 байт :)
Джонатан Аллан

3

05AB1E , 9 байт

{Rƶ.ssè›ß

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Порт @JonathanAllan Jelly відповіді «s , тому також має входи 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)

Спробуйте в Інтернеті


Також на 35-40% ефективніше 72-байтовий розчин. Прекрасний код, він відчував, що готовий бути вбудованим у виробничі веб-проекти, пов'язані з MLM: ^)
xakepp35

Щойно помітив. Тест №2, [0, 60, 0, 60, 60, 0], 180, 3 -> trueздається, не працює! 72 байтовий берсіон обробляє це нормально. Помилка чи функція?)
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і повертають truthy / falsey allJunction, де truthy не вдався, а falsey - успіх.

Пояснення:

{                           }  # 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 байт

Вхідні дані приймаються в порядку T, N, x[], 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 байт

EDIT: Дякую Кевіну Кройсейсну за те, що він розіграв 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себе; додав змінну lдля , q.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, змінюючи, mщоб l+1зберегти байт над break(і він також економить на 2 дужках). :)
Кевін Крейсейсен

1
Якщо ви ще цього не бачили, Поради щодо гольфу в C # та Поради щодо гольфу на <всіх мовах> можуть бути цікавими для прочитання.
Кевін Круїйсен

1
89 байт Деякі доповнення до гольфів у моєму першому коментарі. Балон m=c>0?l+1:mможна видалити повністю, а &c<1замість цього в петлю можна додати чек. І nзнову взявши дані , вам більше не потрібно, q.Lengthале можна використовувати nзамість цього.
Кевін Круїйсен

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, 52 байти ;)
Shaggy

(До речі, я придумав своє рішення незалежно від вашого коментаря, на випадок, якщо вам було цікаво - це порт мого рішення Japt. На мобільному пристрої, тому не можу побачити часові позначки, щоб сказати, хто розмістив перше місце.)
Shaggy

1

Пітон 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

R , 43 42 байти

-1 байт, ще більше реалізуючи підхід

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

Спробуйте в Інтернеті!

Проста 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 відповідь «s (після того, як я golfed це ще небагато), тому переконайтеся , що upvote його!

Приймає входи N,x,T,Mта виходи true/ falseза "yes"/ "no"відповідно.

Оскільки виклик спеціально вимагає booleanрезультатів, я не можу повернути 1/ 0як є, оскільки це недійсні значення truthy / falsey на Java. Якщо для цього виклику замість будь-яких двох вивідних вихідних значень для "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 # 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 з прикладом, але мені не вдалося змусити його працювати.

Я змінив одне xі tзначення - десятковий знак. Це обробляє той випадок, коли tне ділиться kтрохи краще.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.