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


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)функции - поэтому вы всегда можете ссылаться на length как N. Для удобства вы можете рассматривать все входные данные N, x[], T, Mкак некоторые внешне определенные константы или как встроенные в язык.
xakepp35

1
Я не думаю, что эти уведомления достигли их (с дефисами), когда я получил их в свой почтовый ящик.
Джонатан Аллан

1
@JonathanAllan не совсем знаком с синтаксисом пинга и нелатинскими именами .. возможно, они когда-нибудь вернутся :)
xakepp35

1
Кроме того, можно ли поменять вывод? Ложное значение для trueи истинное значение для false?
Лохматый

1
@ WîtWisarhd Код гольф является критерием победы ... посмотрите на теги.
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 's Jelly ответа , поэтому также принимает входы 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
Я не говорил о том, «как вы должны отображать вывод», просто он должен быть логическим (только для двух состояний). Так что да, определенно вы можете использовать 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-байтового решения. Прекрасный код,
кажется

Просто заметил. Тестовый пример № 2, [0, 60, 0, 60, 60, 0], 180, 3 -> trueпохоже, не работает! 72 байтовых Bersion обрабатывает это нормально. Баг или фича?)
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 байтов

Входные данные принимаются в порядке 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 байт

РЕДАКТИРОВАТЬ: Спасибо Кевину Круйссену за то, что он играл в гольф с 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 #) с флагом /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 байта, если значение логического значения можно инвертировать.)
Арно


(Между прочим, я придумал свое решение независимо от вашего комментария, на случай, если вам интересно - это порт моего решения 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

Python ,  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-реализация Jonathan's Jelly. Я перепробовал несколько вариантов, но это лучшее, что я мог придумать, на несколько байтов.

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как есть, так как это недопустимые значения true / 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 #) , 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.