สร้างชุดค่าผสมพร้อมการแทนที่


10

แสดงรายการชุดค่าผสมทั้งหมดด้วยการแทนที่ (หรือชุดค่าผสมที่มีการทำซ้ำ) ขนาดkจากชุดองค์ประกอบn

การรวมกันกับการเปลี่ยนเป็น MultiSet เรียงลำดับว่าองค์ประกอบในทุกนอกจากนี้ยังมีอยู่ในชุดของnองค์ประกอบ โปรดทราบว่า:

  • มันไม่มีการเรียงลำดับ ดังนั้นชุดที่พิมพ์ไว้ก่อนหน้านี้ที่มีลำดับที่แตกต่างกันจึงไม่ควรพิมพ์อีกครั้ง
  • มันเป็นมัลติเซ็ต องค์ประกอบเดียวกันสามารถ (แต่ไม่ต้องการ) ปรากฏมากกว่าหนึ่งครั้ง นี่เป็นข้อแตกต่างระหว่างชุดค่าผสมที่มีการแทนที่และชุดค่าผสมปกติเท่านั้น
  • ชุดควรมีองค์ประกอบkอย่างแน่นอน

หรืออีกทางหนึ่งก็ยังเป็น size- kย่อยของ MultiSet ที่มีแต่ละnองค์ประกอบkครั้ง

อินพุตควรเป็นทั้งnและkโดยที่อิลิเมนต์เป็นจำนวนเต็มบวกหรือไม่ใช่ลบแรกหรือองค์ประกอบnและkซึ่งคุณสามารถสันนิษฐานได้ว่าองค์ประกอบnนั้นแตกต่างจากกัน

เอาต์พุตควรเป็นรายการของชุดค่าผสมทั้งหมดพร้อมการแทนที่ด้วยขนาดkจากชุดที่กำหนด คุณสามารถพิมพ์และองค์ประกอบในแต่ละรายการในลำดับใดก็ได้

คุณไม่สามารถใช้ builtins ที่สร้างชุดค่าผสมพร้อมการแทนที่ แต่คุณสามารถใช้ builtins เพื่อสร้างชุดค่าผสมปกติพีชคณิต tuples ฯลฯ

นี่คือรหัส - กอล์ฟรหัสที่สั้นที่สุดชนะ

ตัวอย่าง

Input: 4 2
Output: [0 0] [0 1] [0 2] [0 3] [1 1] [1 2] [1 3] [2 2] [2 3] [3 3]

คำตอบ:


8

เยลลี่ 4 ไบต์

ขอบคุณ Sp3000 สำหรับการบันทึก 2 ไบต์

ṗṢ€Q

อินพุตเป็นnและkเป็นอาร์กิวเมนต์บรรทัดคำสั่งในลำดับนั้น ใช้องค์ประกอบที่จะ1n

ลองออนไลน์!

คำอธิบาย

ṗ     # Get k-th Cartesion power of n.
 Ṣ€   # Sort each tuple.
   Q  # Remove duplicates.


3

Mathematica, 31 29 ไบต์

ขอบคุณ A Simmons สำหรับการบันทึก 2 ไบต์

{}⋃Sort/@Range@#~Tuples~#2&

ฟังก์ชั่นที่ไม่มีชื่อการnและkเป็นอาร์กิวเมนต์จำนวนเต็มในลำดับนั้นและส่งกลับรายการของรายการ องค์ประกอบที่จะไป1 nทำงานเหมือนกับคำตอบ CJam ของ Peter


@ jimmy23013 ไม่ใช่คนที่ฉันรู้จัก
Martin Ender

ฉันคิดว่าคุณสามารถบันทึกสองไบต์ด้วย{}∪Sort/@Range@#~Tuples~#2&
A Simmons

@ASimmons ความคิดที่ดีขอบคุณ!
Martin Ender

3

MATL 11 ไบต์

(มีวิธีแก้ปัญหาขนาด 9 ไบต์ซึ่งอ้างอิงตามกำลังคาร์ทีเซียน แต่ Peter Taylor ทำเช่นนั้นแล้วลองทำสิ่งที่แตกต่างกัน)

ชุดค่าผสมที่มีการเปลี่ยนสามารถลดลงเป็นชุดค่าผสมโดยไม่ต้องเปลี่ยนดังนี้ เราต้องการn Cr kเช่นมีn=3, k=2:

0 0
0 1
0 2
1 1
1 2
2 2

เราสามารถคำนวณn+k-1 C k:

0 1
0 2
0 3
1 2
1 3
2 3

แล้วลบออก0 1 ... k-1จากแต่ละแถว:

+q:2GXn2G:-

คำอธิบาย:

+q     % take two inputs n, k and compute n+k-1
:      % range [1,2...,n+k-1]
2G     % push second input, k
Xn     % combinations without replacement
2G:    % range [1,2,...,k]
-      % subtract with broadcast. Display

รหัสทำงานในรีลีสภาษา / คอมไพเลอร์13.1.0ซึ่งเร็วกว่าความท้าทาย

คุณสามารถลองออนไลน์ได้! โปรดทราบว่าคอมไพเลอร์ออนไลน์ที่ได้รับการปรับปรุงเพื่อปล่อย 14.0.0 ดังนั้นต้องมีการเปลี่ยนแปลงไปXnXN


3

JavaScript (Firefox 30-57), 71 ไบต์

f=(n,k)=>k?[for(m of Array(n).keys())for(a of f(m+1,k-1))[...a,m]]:[[]]

ฉันจะใช้keys()เป็นครั้งเดียว


2

Ruby, 56 55 ไบต์

การแก้ปัญหาสองประการที่น่าประหลาดใจทั้งความยาวเดียวกัน:

->n,k{[*1..n].repeated_permutation(k).map(&:sort).uniq}
->n,k{(a=[*1..n]).product(*[a]*(k-1)).map(&:sort).uniq}

เดี๋ยวก่อนคุณไม่บอกว่าเราสามารถใช้ builtins การเปลี่ยนแปลง ...

สิ่งนี้จะสร้างการเรียงสับเปลี่ยนซ้ำ ๆ ทั้งหมด(อันที่สองสร้างผลิตภัณฑ์ Cartesian ซ้ำ) และลบรายการที่ไม่ได้เรียงลำดับ

ขอบคุณ Martin ที่บันทึกไบต์ด้วย0...n-> 1..n!



1

Python ขนาด 63 ไบต์

f=lambda n,k:n*k and[l+[n]for l in f(n,k-1)]+f(n-1,k)or[[]][k:]

วิธีการเรียกซ้ำ เพื่อให้ MultiSet ของkองค์ประกอบ1ในการnที่เราเลือกที่จะ:

  • รวมอินสแตนซ์อื่นของnและยังคงเป็นk-1องค์ประกอบหลายชุดตั้งแต่1ถึงn
  • อย่ารวมอินสแตนซ์อื่นของnและจะยังคงเป็นkองค์ประกอบหลายชุดตั้งแต่ถึง1ถึงn-1

เรายุติเมื่อใดkหรือnถึง0และถ้าkถึง0เราจะให้กรณีฐานของรายการที่ว่างเปล่า ถ้าไม่เรามีจำนวนองค์ประกอบที่ไม่ถูกต้องและให้รายการที่ว่างเปล่า


1

Python 3, 81 80

โซลูชันแบบเรียกซ้ำ:

t=lambda n,k,b=0:[[]]if k<=0 else [[i]+l for i in range(b,n)for l in t(n,k-1,i)]

ฟังก์ชั่นt(n, k, b)ส่งกลับรายการของทุกkองค์ประกอบหลายส่วนย่อยของช่วงจากไปb รายการนี้เป็นที่ว่างเปล่าถ้าn มิฉะนั้นเราจะทำลายปัญหาลงขึ้นอยู่กับองค์ประกอบที่เล็กที่สุดของหลายส่วนย่อยซึ่งเราใช้แสดงโดยk <= 0i

สำหรับแต่ละiช่วงจากbการnที่เราสร้างทั้งหมดของk-Multi-ย่อยที่มีองค์ประกอบที่เล็กiโดยเริ่มต้นด้วย[i]แล้วท้ายแต่ละ(k-1)-Multi-ย่อยของช่วงจากiการที่เราได้รับจากการโทรซ้ำnt(n, k-1, i)


ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! นี่เป็นคำตอบแรกที่ดี คุณสามารถให้คำอธิบายว่ารหัสทำงานอย่างไร
Alex A.

ดูดี. เป็นทางออกที่ดี!
Alex A.

1

Dyalog APLขนาด 22 ไบต์

{∪{⍵[⍋⍵]}¨↓⍉⍺⊥⍣¯1⍳⍺*⍵}

ต้องการ⎕IO←0ซึ่งเป็นค่าเริ่มต้นในระบบ APL จำนวนมาก รับค่า k เป็นอาร์กิวเมนต์ด้านซ้ายและ n เป็นอาร์กิวเมนต์ที่ถูกต้อง

⍳⍺*⍵0 1 2 ... kⁿ
⍺⊥⍣¯1แปลงเป็นฐานท
รานสเคเค
ทำให้เมทริกซ์ลงในรายการ
{⍵[⍋⍵]}¨เรียงลำดับแต่ละรายการ...
ที่ไม่ซ้ำกัน


1

J, 18 ไบต์

[:~.#~<@/:~@#:i.@^

วิธีการที่คล้ายกันที่ใช้ในการ @ อาดัมแก้ปัญหา

อีกวิธีในการใช้ผลิตภัณฑ์คาร์ทีเซียน{24 ไบต์ ใช้kกับ LHS และnRHS

~.@:(/:~&.>)@,@{@(#<@i.)

การใช้

   f =: [:~.#~<@/:~@#:i.@^
   4 f 2
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│0 0│0 1│0 2│0 3│1 1│1 2│1 3│2 2│2 3│3 3│
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘

คำอธิบาย

[:~.#~<@/:~@#:i.@^ Input: n on LHS and k on RHS
                 ^ Compute n^k
              i.@  Create a range [0, 1, ... n^k-1]
    #~             Create k copies on n
            #:     On each value in the range above, convert each digit to base-n
                   and take the last k digits of it
        /:~@       For each array of digits, sort it in ascending order
      <@           Box each array of digits
[:~.               Take the distinct values in the array of boxes and return it

1

Clojure, 94 ไบต์

(defn f[k n](if(= 1 k)(for[i(range n)][i])(sort(set(for[i(f(dec k)n)j(range n)](conj i j))))))

หมายเหตุการสั่งซื้อพารามิเตอร์การเปลี่ยนแปลง: 1 เป็นkและครั้งที่ 2 nคือ ที่บันทึกไว้นี้ 1 (f(dec k)n)ไบต์ใน


0

Mathematica ขนาด 36 ไบต์

{##}&~Array~Table@##~Flatten~(#2-1)&

โปรดบอกฉันว่ามี 1/6 โบนัสสำหรับการใช้ไม่ [] s ... หรืออาจจะเป็นเพราะการใช้ ## หลายครั้ง?

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