Çok seviyeli pazarlama “bacaklar” yatırım kuralı


10

Çok seviyeli pazarlama ile ilgili zorluk.

Bir akran ödüllendirilmek istiyor. Böylece Nyatırımcıları ( N>=1) çekti , her i-th yatırımcı yatırım yaptı x[i]. Toplam bir toplam eşiği aştığında x[0]+x[1]+...+x[N-1] >= Tbir akran ödüllendirilebilir. Ancak sadece aşağıdaki koşullar karşılandığında:

  • Minimum yatırımcı tutarı M( M<=N)
  • En az bir tamsayı için k, nerede k>=Mve k<=Nherhangi bir kyatırımcı en az T/kher birine yatırım yapmak zorundadır ;

Verilen N, x[], T, Makran ödülünün yaratılıp yaratılmadığını belirlemelisiniz (boole sonucu, "evet" veya "hayır"). En kısa kod kazanır.

Örnekler:


N=5; M=3; T=10000, emsal ödülünü elde etmek için aşağıdakilerden biri yerine getirilmelidir:

  • herhangi bir 3 en az 3334 yatırım yaptı
  • herhangi bir 4 en az 2500 yatırım yaptı
  • 5'in her biri en az 2000 yatırım yaptı

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

  • herhangi 2 en az 2500 yatırım yaptı
  • herhangi bir 3 en az 1667 yatırım yaptı
  • herhangi bir 4 en az 1250 yatırım yaptı
  • her 5 en az 1000 yatırım yaptı
  • 6'sı da her biri en az 834 yatırım yaptı

genelleştirilmiş: herhangi biri için k, nerede k>=Mve k<=N:

  • yatırımcılardan herhangi kbiri Nen az T/kher birine

Test senaryoları:

biçim:

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 Elbette, eğer diliniz izin veriyorsa ve yazma yazmaktan len(x)daha kısa olacaktır N. Bu yapılır, çünkü xC'de dinamik olarak tahsis edilen dizi için doğrudan bir len(x)işlev yoktur - bu nedenle her zaman uzunluğa olarak başvurabilirsiniz N. Kolaylık sağlamak için, tüm giriş verilerini N, x[], T, Mharici olarak tanımlanmış sabitler veya bazı yerleşik diller olarak düşünebilirsiniz .
1919

1
Gelen kutuma aldığımda bu bildirimlerin onlara (kısa çizgilerle) ulaştığını sanmıyorum.
Jonathan Allan


1
Ayrıca, çıktı tersine çevrilebilir mi? Bir truefalsey değeri ve doğruluk değeri false?
Shaggy

1
@ WîtWisarhd Kod golf kazanan bir kriter ... etiketlere bakın.
mbomb007

Yanıtlar:


4

Jöle ,  12  9 bayt

ṢṚ×J$ṫ⁵<Ṃ

Akran ödüllendirilip ödüllendirilmediğini kabul eden x T Mve basan tam bir program .01

Çevrimiçi deneyin!

Nasıl?

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


Örneğin, üçüncü yatırımcı T'nin 1 / 3'ünden (33'ten az) daha az yatırım yaptı, ancak sonuç yine de pozitif sayıldı ("her biri en az T / k yatırdı" başarısız oldu)
xakepp35

Evet, ters sıralı değerlerin öneklerini kullanarak oluşturdum ve sıralanan postfix'lere değiştirebileceğimi düşündüm, ama aslında yapamadım çünkü geri dönmedim ... geri döndü :)
Jonathan Allan

1
Evet, şimdi golfü bitirdim bir açıklama yazıyorum.
Jonathan Allan

1
Şimdi " 0emsal ödüllendirilip ödüllendirilmediğini yazdırır 1". (yani 0"evet" tir). 1 bayt tasarruf sağlar :)
Jonathan Allan

3

05AB1E , 9 bayt

{Rƶ.ssè›ß

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Port @JonathanAllan 'ın Jelly cevap , bu yüzden de girdileri alır x T Mve çıkışları 0için "yes"ve 1için "no". Buna izin verilmiyorsa ve ters çevrilmesi gerekiyorsa, bir son _eklenebilir.

Açıklama:

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

Alternatif .ssè:

sG¦}

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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
Ben sadece nasıl boolean (sadece 2 devlet var) olması gerektiğini, "nasıl çıkış haritası gerekir" yazmadım. Yani evet, kesinlikle "evet" için 0 ve "hayır" için 1 kullanabilirsiniz :)
xakepp35

2

JavaScript, 54 52 bayt

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

Çevrimiçi deneyin


Ayrıca 72 baytlık çözümden% 35-40 daha fazla performans. Güzel kod, MLM ile ilgili web projelerine gömülmeye hazır gibi hissettim: ^)
xakepp35

Sadece fark ettim. Test durumda 2. [0, 60, 0, 60, 60, 0], 180, 3 -> truegibi görünüyor çalışmıyor! 72 baytlık bersion bunu idare eder. Hata veya özellik?)
xakepp35

2

Retina , 79 bayt

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

Çevrimiçi deneyin! Biçimi girdi alır [x], T, M. Bağlantı, test senaryolarını içerir. Açıklama:

\d+
*

Tekli'ye dönüştür.

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

Sıralama [x]azalan sırada.

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

Öğesinin her öğesini [x]diziniyle çarpın .

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

Öğesinin ilk M-1öğelerini silin [x].

(_+).*], \1,

Öğesinin kalan öğelerinden [x]daha büyük veya eşit olup olmadığını test edin T.


2

Perl 6 , 46 33 29 bayt

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

Çevrimiçi deneyin!

Formda girdi alan list, amount, length of list, minimum amount of investorsve doğruluk / falsey allKavşağı döndüren anonim kod blokları, doğruluk başarısız olduğu ve falsey'in başarılı olduğu yerdir.

Açıklama:

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

Sırayla alınan Girdi T, N, x[], M
Çıktı olan 0akran ödül için ve 1eğer değil

Ÿs{*›W

Çevrimiçi deneyin! veya Test Paketi olarak

açıklama

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

*Listeyi örtük olarak kırpmak için menzil ile kullanmanın güzel hilesi !
Kevin Cruijssen

2

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

DÜZENLEME: mekaniği neden açıklanırken 40 Crues golf için Kevin Cruijssen için teşekkürler!

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

Çevrimiçi deneyin!


1
106 bayt Değiştirdiğim bazı şeyler: nHiçbir yerde kullanmadığınız için girişi kaldırdınız ; kendini kkullanabildiğiniz için kaldırıldı m; iki kez kullandığınız liçin bir değişken ekledik q.Length; değişkenleri birleştirerek eke int c=0,l=q.Length,j;ihtiyacınız yok var; her şeyi for-loop gövdesine koyarak gereksiz braketleri çıkardı; c>=konay olarak değiştirildi c<k; ve değiştirilmesi if(c>0)break;için m=c>0?l+1:m;döngü olarak durur, çünkü m<=ldeğiştirme miçin l+1fazla bir bayt kaydeder break(ve aynı zamanda 2 parantez tasarruf). :)
Kevin Cruijssen

1
Eğer henüz görmemiş varsa, C # golf için ipuçları ve içinde golf için ipuçları <tüm diller> yoluyla, okumak ilginç olabilir.
Kevin Cruijssen

1
89 bayt İlk yorumumda golf oyunlarına bazı eklemeler. m=c>0?l+1:mTamamen çıkartılabilir ve bir &c<1onay yerine devreye ilave edilebilir. Ve girdiyi ntekrar alarak q.Lengthartık ihtiyacınız kalmaz, nbunun yerine kullanabilirsiniz .
Kevin Cruijssen

2

C # (Visual C # Etkileşimli Derleyici) bayrağı /u:System.Linq.Enumerable, 69 bayt

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

Çevrimiçi deneyin!

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

Bayraksız 73 bayt

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

Çevrimiçi deneyin!


Bunu düşündüm ve açıklamada N> = 1 ve M <= N olduğunu açıklayın. Böylece çözümünüzü biraz kısaltabilirsiniz :)
xakepp35

1

JavaScript, 72 bayt

kod

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

Çevrimiçi deneyin!

(X [], T, M) formatında girişi kabul eder

açıklama

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
(Veya Boole değerinin anlamı ters çevrilebiliyorsa 53 bayt .)
Arnauld

@Arnauld, 52 bayt ;)
Shaggy

(Bu arada, yorumunuzdan bağımsız olarak çözümümü buldum, merak ediyorsanız - bu benim Japt çözümümün bir limanı. Mobilde bu yüzden ilk kimin yayınladığını söylemek için zaman damgalarını düzgün göremiyorum.)
Shaggy

1

Python 3 , 136 bayt

Koşulları yerine getirdiklerinden emin olmak için test etmeniz yeterlidir. 1 ödül verildiyse, 0 değilse.

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*

Çevrimiçi deneyin!


1

Python ,  71  65 bayt

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

Çevrimiçi deneyin!

Adsız bir işlev; Jelly cevabımın limanı. Gibi "evet" Falseve "hayır" olduğu gibi True. Ancak burada, test senaryolarını ters kayıt işleminin bir parçası olarak atar ve enumeratesayımı başlatma yeteneğinden yararlanırız M. ( minyerine de çalışır all)


1

R , 43 42 bayt

Yaklaşımı daha da yakından uygulayarak -1 bayt

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

Çevrimiçi deneyin!

Jonathan'ın Jelly yaklaşımının basit R uygulaması. Bir sürü varyasyon denedim ama bu birkaç bayt tarafından aklıma gelen en iyi pip.

1 başarısızlık, 0 başarı demektir.


1

Japt, 16 14 13 11 bayt

ñ í*WõX)d¨V

Dene

ñ í*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 (veya 89?) Bayt

(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 of @Destroigo'nun C # .NET cevabı (biraz daha golf yaptıktan sonra), bu yüzden onu oyladığınızdan emin olun!

Girdi N,x,T,Mve çıktıları sırasıyla true/ falseiçin "yes"/ alır "no".

Zorluk özellikle booleansonuçlar istediğinden , Java'da geçerli doğruluk / falsey değerleri olmadığından 1/ 0olduğu gibi geri veremem . Bu sorgu için "yes"/ için iki ayrı çıkış değeri "no"geçerliyse, bunun yerine >0iki bayt kaydetmek için dönüşte bırakılabilir, bu durumda sırasıyla 1/ 0için "yes"/ döndürür "no".

Çevrimiçi deneyin.

Açıklama:

(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 # Etkileşimli Derleyici) , 66 bayt

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

Çevrimiçi deneyin!

@ EmbodimentOfIgnorance'ın cevabından ilham aldı.

Daha önce de bahsetmiştim, ancak C # 8, bu cevabı şu şekilde yapabilir:

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

Bir örnekle SharpLab'a bir bağlantı gördüm , ancak kendim çalıştıramadım.

Değiştirdiğim bir şeydi xve tdeğerler ondalık sayılardı. Bu, biraz daha iyi tbölünemeyen durumu ele alır k.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.