Aturan investasi "kaki" pemasaran multi-level

10

Multi-level marketing related challenge.

Teman sebaya ingin mendapat imbalan. Jadi itu menarik Ninvestor ( N>=1), setiap investor ke-i berinvestasi x[i]. Ketika jumlah total melebihi ambang batas, x[0]+x[1]+...+x[N-1] >= Trekan kerja bisa diberi penghargaan. Tetapi hanya jika kondisi berikut dipenuhi:

  • Jumlah minimum investor harus lebih besar dari M, ( M<=N)
  • Untuk setidaknya satu bilangan bulat k, di mana k>=Mdan k<=N, setiap kinvestor harus berinvestasi setidaknya T/kmasing-masing;

Mengingat N, x[], T, MAnda harus menentukan apakah hadiah rekan dihasilkan atau tidak (hasil boolean, "ya" atau "tidak"). Kode terpendek menang.

Contoh:


N=5; M=3; T=10000, untuk menghasilkan hadiah teman, salah satu dari yang berikut harus dipenuhi:

  • setiap 3 investasi masing-masing setidaknya 3334
  • setiap 4 yang diinvestasikan setidaknya 2500 masing-masing
  • semua 5 berinvestasi setidaknya 2000 masing-masing

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

  • setiap 2 investasi masing-masing setidaknya 2500
  • 3 investasi masing-masing setidaknya 1667
  • setiap 4 investasi setidaknya masing-masing 1.250
  • setiap 5 investasi masing-masing setidaknya 1000
  • semua 6 berinvestasi masing-masing setidaknya 834

umum: untuk apa pun k, di mana, k>=Mdan k<=N:

  • setiap kdari Ninvestor menginvestasikan setidaknya T/ksetiap

Kasus uji:

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
sumber
1
@ JonathanAllan Tentu, jika bahasa Anda memungkinkan, dan menulis len(x)akan lebih pendek dari menulis N. Itu dibuat, karena untuk array yang dialokasikan secara dinamis xdi C tidak ada len(x)fungsi langsung - jadi Anda selalu dapat merujuk panjang sebagai N. Untuk kenyamanan, Anda dapat mempertimbangkan semua data input N, x[], T, Msebagai konstanta yang didefinisikan secara eksternal, atau built-in bahasa.
xakepp35
1
Saya pikir notifikasi itu tidak sampai ke mereka (dengan tanda hubung) ketika saya mendapatkannya di kotak masuk.
Jonathan Allan
1
@Jonathan Allan tidak cukup familiar dengan sintaks ping, dan nama non-latin .. mungkin mereka akan kembali suatu hari :)
xakepp35
1
Juga, dapatkah output dibalik? Nilai kepalsuan untuk truedan nilai kebenaran untuk false?
Shaggy
1
@ WîtWisarhd Code golf adalah kriteria pemenang ... lihat tag.
mbomb007

Jawaban:

4

Jelly ,  12  9 byte

ṢṚ×J$ṫ⁵<Ṃ

Program lengkap yang menerima x T Mdan mencetak 0jika rekan dihargai dan 1jika tidak.

Cobalah online!

Bagaimana?

ṢṚ×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
sumber
misalnya, investor ketiga berinvestasi kurang dari 1/3 dari T (kurang dari 33), tetapi hasilnya tetap dianggap positif ("setiap k yang diinvestasikan setidaknya masing-masing T / k" gagal)
xakepp35
Ya, saya membuatnya menggunakan awalan nilai-nilai yang diurutkan terbalik dan berpikir saya bisa mengubahnya ke postfix yang diurutkan, tetapi sebenarnya tidak bisa karena saya kemudian mengikuti ... dipulihkan :)
Jonathan Allan
1
Ya, sekarang saya sudah selesai bermain golf saya menulis penjelasan.
Jonathan Allan
1
Sekarang "mencetak 0jika rekan dihargai dan 1jika tidak". (yaitu 0"ya"). Menghemat 1 byte :)
Jonathan Allan
3

05AB1E , 9 byte

{Rƶ.ssè›ß

Cobalah secara online atau verifikasi semua kasus uji .

Port dari @JonathanAllan jawaban Jelly , jadi juga mengambil input x T Mdan output 0untuk "yes"dan 1untuk "no". Jika ini tidak diizinkan, dan itu harus dibalik, sebuah trailing _dapat ditambahkan.

Penjelasan:

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

sG¦}

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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
sumber
1
Saya tidak menyatakan "bagaimana seharusnya Anda memetakan output", hanya saja harus boolean (hanya memiliki 2 status). Jadi ya, pasti Anda dapat menggunakan 0 untuk "ya" dan 1 untuk "tidak" :)
xakepp35
2

JavaScript, 54 52 byte

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

Cobalah online

Shaggy
sumber
Juga 35-40% lebih banyak performan dibandingkan solusi 72-byted. Kode yang indah, terasa seperti siap untuk disematkan dalam proyek web produksi MLM yang terkait: ^)
xakepp35
Hanya memperhatikan. Test case # 2 [0, 60, 0, 60, 60, 0], 180, 3 -> truetampaknya tidak berfungsi! 72 byion bersion menanganinya ok. Bug atau fitur?)
xakepp35
2

Retina , 79 byte

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

Cobalah online! Mengambil input dalam format [x], T, M. Tautan termasuk kasus uji. Penjelasan:

\d+
*

Konversikan ke unary.

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

Sortir [x]dalam urutan menurun.

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

Kalikan setiap elemen [x]dengan indeksnya.

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

Hapus M-1elemen pertama dari [x].

(_+).*], \1,

Uji apakah ada elemen yang tersisa [x]lebih besar atau sama dengan T.

Neil
sumber
2

Perl 6 , 46 33 29 byte

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

Cobalah online!

Blok kode anonim yang mengambil input dalam bentuk list, amount, length of list, minimum amount of investorsdan mengembalikan allPersimpangan kebenaran / falsey , di mana kebenaran gagal dan falsey berhasil.

Penjelasan:

{                           }  # 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
sumber
2

05AB1E , 6 byte

Masukan diambil dalam urutan T, N, x[], M
Output 0untuk rekan pahala dan 1jika tidak

Ÿs{*›W

Cobalah online! atau sebagai Test Suite

Penjelasan

Ÿ        # 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
sumber
Trik yang bagus untuk digunakan *dengan rentang untuk memotong daftar secara implisit!
Kevin Cruijssen
2

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

EDIT: Terima kasih kepada Kevin Cruijssen karena bermain golf dengan 40 byte sambil menjelaskan mekanisme mengapa!

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

Cobalah online!

Destroigo
sumber
1
106 byte Beberapa hal yang saya ubah: Menghapus input nkarena Anda tidak menggunakannya di mana pun; dihapus kkarena Anda dapat menggunakannya msendiri; menambahkan variabel luntuk q.Lengthkarena Anda menggunakannya dua kali; menggabungkan variabel int c=0,l=q.Length,j;sehingga Anda tidak perlu tambahan var; menghapus tanda kurung yang tidak perlu dengan meletakkan segala sesuatu di badan for-loop; mengubah c>=kcek menjadi c<k; dan mengubah if(c>0)break;ke m=c>0?l+1:m;, karena loop berhenti jika m<=l, mengubah muntuk l+1menyimpan byte lebih break(dan juga menghemat 2 kurung). :)
Kevin Cruijssen
1
Jika Anda belum melihatnya, Tip untuk bermain golf di C # dan Tips untuk bermain golf di <semua bahasa> mungkin menarik untuk dibaca.
Kevin Cruijssen
1
89 byte Beberapa tambahan ke golf di komentar pertama saya. The m=c>0?l+1:mdapat dihapus sepenuhnya dan &c<1cek dapat ditambahkan ke loop sebagai gantinya. Dan dengan mengambil input nlagi, Anda tidak perlu q.Lengthlagi tetapi bisa menggunakannya n.
Kevin Cruijssen
2

C # (Visual C # Interactive Compiler) dengan 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()

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

Tanpa bendera, 73 byte

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

Cobalah online!

Perwujudan Ketidaktahuan
sumber
Saya memikirkan hal itu, dan menyatakan dalam deskripsi bahwa N> = 1, dan M <= N Jadi Anda dapat mempersingkat solusi Anda :)
xakepp35
1

JavaScript, 72 byte

Kode

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

Cobalah online!

Menerima input dalam format (x [], T, M)

Penjelasan

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
sumber
54 byte ?
Arnauld
1
(Atau 53 byte jika arti dari nilai Boolean dapat dibalik.)
Arnauld
@Arnauld, 52 byte ;)
Shaggy
(Ngomong-ngomong, saya datang dengan solusi saya secara independen dari komentar Anda, jika Anda bertanya-tanya - ini adalah port dari solusi Japt saya. Di ponsel, jadi tidak dapat melihat stempel waktu dengan benar untuk mengetahui siapa yang diposting pertama.)
Shaggy
1

Python 3 , 136 byte

Cukup uji kondisi untuk memastikan mereka terpenuhi. 1 jika hadiah diberikan, 0 jika tidak.

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*

Cobalah online!

Neil A.
sumber
1

Python ,  71  65 byte

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

Cobalah online!

Fungsi yang tidak disebutkan namanya; port jawaban Jelly saya. Dengan demikian, "ya" adalah Falsedan "tidak" True. Namun, di sini, kami membuang kasus uji sebagai bagian dari pembalikan dan memanfaatkan kemampuan untuk memulai enumeratepenghitungan M. ( minjuga akan bekerja di tempat all)

Jonathan Allan
sumber
1

R , 43 42 byte

-1 byte dengan menerapkan pendekatan lebih dekat

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

Cobalah online!

Implementasi R sederhana dari pendekatan Jonathan's Jelly. Saya mencoba banyak variasi tapi ini pips yang terbaik yang bisa saya pikirkan beberapa byte.

1 menyiratkan kegagalan, 0 menyiratkan kesuksesan.

Kriminal kriminal
sumber
1

Japt, 16 14 13 11 byte

ñ í*WõX)d¨V

Cobalah

ñ í*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
Shaggy
sumber
0

Java 8, 91 (atau 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;}

Port dari # Destroigo 's C # .NET jawaban (setelah saya golf lagi), jadi pastikan untuk membesarkannya!

Mengambil input N,x,T,Mdan output true/ falseuntuk "yes"/ "no"masing-masing.

Karena tantangan secara khusus meminta booleanhasil, saya tidak dapat mengembalikan nilai 1/ 0apa adanya, karena nilai tersebut tidak benar / bernilai falsey di Java. Jika ada dua nilai output yang berbeda untuk "yes"/ "no"adalah valid untuk tantangan ini sebagai gantinya, >0dalam pengembalian dapat dijatuhkan untuk menyimpan dua byte, dalam hal ini akan mengembalikan 1/ 0untuk "yes"/ "no"masing-masing.

Cobalah online.

Penjelasan:

(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
sumber
0

C # (Visual C # Interactive Compiler) , 66 byte

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

Cobalah online!

Terinspirasi oleh jawaban @ EmbodimentOfIgnorance.

Saya telah menyebutkan ini sebelumnya, tetapi C # 8 memiliki rentang literal yang dapat membuat jawaban ini seperti ini:

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

Saya melihat tautan ke SharpLab dengan sebuah contoh, tetapi saya tidak bisa membuatnya bekerja sendiri.

Satu hal yang saya ubah adalah xdan tnilai adalah desimal. Ini menangani kasus di mana ttidak dapat dibagi oleh ksedikit lebih baik.

dana
sumber