กฎการลงทุนการตลาดแบบ“ ขา” หลายระดับ


10

ความท้าทายที่เกี่ยวข้องกับการตลาดหลายระดับ

เพื่อนต้องการได้รับรางวัล ดังนั้นมันจึงดึงดูดNนักลงทุน ( N>=1) นักลงทุนรายที่ฉันลงทุน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 ลงทุนอย่างน้อย 2,500
  • ทั้ง 5 ลงทุนอย่างน้อย 2,000 ต่อ

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

  • 2 ใด ๆ ที่ลงทุนอย่างน้อย 2,500
  • ๆ 3 ลงทุนอย่างน้อย 1667 แต่ละอัน
  • ๆ 4 ลงทุนอย่างน้อย 1,250 ต่อแต่ละ
  • 5 ลงทุนอย่างน้อย 1,000 อัน
  • ทั้ง 6 ลงทุนอย่างน้อย 834 ต่อคน

generalized: สำหรับใด ๆ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
ฉันไม่คิดว่าการแจ้งเตือนเหล่านั้นมาถึงพวกเขา (พร้อมเครื่องหมายขีดคั่น) เนื่องจากฉันได้รับพวกเขาในกล่องจดหมายของฉัน
Jonathan Allan

1
@Janathan ทุกคนไม่ค่อยมีความคุ้นเคยกับไวยากรณ์
จิงจี่

1
นอกจากนี้ผลผลิตยังสามารถกลับรายการได้หรือไม่? คุณค่าที่โง่เง่าtrueและคุณค่าที่แท้จริงสำหรับfalse?
Shaggy

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

ดูเหมือนว่าจะไม่ทำงาน: tio.run/##y0rNyan8///hzkWHp/uoHJ5wbMnDnasfNW61ebiz6dCah7sW/P//…
xakepp35

ในตัวอย่างนักลงทุนรายที่สามลงทุนน้อยกว่า 1 ใน 3 ของ T (น้อยกว่า 33) แต่ผลยังคงนับเป็นบวก ("ใด ๆ k ลงทุนอย่างน้อย T / k แต่ละคน" ล้มเหลว)
xakepp35

ใช่ฉันสร้างขึ้นโดยใช้คำนำหน้าของค่าที่เรียงกลับกันและคิดว่าฉันสามารถเปลี่ยนเป็นคำนำหน้าของการเรียงลำดับ แต่จริง ๆ แล้วไม่ได้เพราะฉันตามมาแล้ว ... ปรับเปลี่ยนอีกครั้ง :)
Jonathan Allan

1
ใช่ตอนนี้ฉันเล่นกอล์ฟเสร็จแล้วฉันกำลังเขียนคำอธิบาย
โจนาธานอัลลัน

1
ตอนนี้มันจะ "พิมพ์0หากเพื่อนได้รับรางวัลและ1หากไม่ได้" (เช่น0คือ "ใช่") มันช่วยประหยัด 1 ไบต์ :)
Jonathan Allan

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
ฉันไม่ได้ระบุว่า "คุณควรจะทำแผนที่เอาท์พุทอย่างไร" ว่าต้องเป็นบูลีน (ต้องมี 2 สถานะเท่านั้น) ดังนั้นใช่แน่นอนคุณอาจใช้ 0 สำหรับ "ใช่" และ 1 สำหรับ "no" :)
46419

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 byted 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และส่งคืนallJunction ที่เป็นความจริง / เท็จซึ่งความจริงล้มเหลวและล้มเหลวก็คือความสำเร็จ

คำอธิบาย:

{                           }  # 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รางวัล peer และ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

เคล็ดลับดี ๆ ในการใช้*กับช่วงเพื่อครอบตัดรายการโดยปริยาย!
Kevin Cruijssen

2

C # (. NET Core) , 129 , 89 ไบต์

แก้ไข: ขอบคุณ Kevin Cruijssen สำหรับการเล่นกอล์ฟ 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-loop เปลี่ยนการc>=kตรวจสอบเป็นc<k; และเปลี่ยนif(c>0)break;ไปm=c>0?l+1:m;ตั้งแต่วงหยุดถ้าm<=lเปลี่ยนmที่จะl+1ช่วยประหยัดไบต์มากกว่าbreak(และก็ยังช่วยประหยัด 2 วงเล็บ) :)
Kevin Cruijssen


1
89 ไบต์เพิ่มเติมบางส่วนในสนามกอล์ฟในความคิดเห็นแรกของฉัน m=c>0?l+1:mสามารถลบออกได้อย่างสมบูรณ์และ&c<1การตรวจสอบสามารถเพิ่มห่วงแทน และโดยการป้อนข้อมูลnอีกครั้งคุณไม่จำเป็นต้องใช้q.Lengthอีกต่อไป แต่สามารถใช้nแทนได้
Kevin Cruijssen

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

@Arnauld, 52 ไบต์ ;)
Shaggy

(โดยวิธีการที่ฉันมากับทางออกของฉันเป็นอิสระจากความคิดเห็นของคุณในกรณีที่คุณสงสัย - มันเป็นพอร์ตของโซลูชั่น 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 มาใช้อย่างง่ายของวิธีการของ Jelly ของ Jonathan ฉันลองใช้ชุดรูปแบบที่หลากหลาย แต่สิ่งนี้ทำให้ฉันคิดได้ดีที่สุดโดยไม่กี่ไบต์

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

คำตอบ C # .NETของพอร์ตของ@Destroigo (หลังจากฉันเล่นกอล์ฟไปมากกว่านี้) ดังนั้นอย่าลืมโหวตให้เขา!

ใช้อินพุตN,x,T,Mและเอาต์พุตtrue/ falseสำหรับ"yes"/ "no"ตามลำดับ

เนื่องจากความท้าทายขอbooleanผลลัพธ์เป็นพิเศษฉันจึงไม่สามารถส่งกลับ1/ 0ตามที่เป็นอยู่เนื่องจากสิ่งเหล่านั้นไม่ใช่ค่าความจริง / เท็จใน 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ดีกว่าเล็กน้อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.