การเรียงสับเปลี่ยนกับรายการที่แยกไม่ออก


12

ให้ลิสต์ของจำนวนเต็มเอาท์พุทจำนวนพีชคณิตของจำนวนเต็มกับพีชคณิตเรียงกันไม่ได้นับครั้งเดียว หากมีnจำนวนเต็มและแต่ละกลุ่มของตัวเลขที่แยกไม่ออกมีความยาวn_iนี่คือn! / (n_1! * n_2! * ...)

กฎระเบียบ

  • อินพุตจะเป็นรูปแบบของรายการบางรายการเป็นอาร์กิวเมนต์ของฟังก์ชันหรือโปรแกรมที่มีจำนวนเต็ม 1 ถึง 12 ที่ไม่ใช่ค่าลบ

  • ผลลัพธ์จะเป็นการพิมพ์หรือคืนจำนวนการเรียงสับเปลี่ยนตามที่อธิบายไว้ข้างต้น

  • ไม่มีช่องโหว่มาตรฐานหรือฟังก์ชั่นในตัว (สร้างการเรียงสับเปลี่ยนชุดค่าผสม ฯลฯ ) อนุญาตให้ใช้แฟกทอรี

กรณีทดสอบ

ปัจจัยการผลิต:

1, 3000, 2, 2, 8
1, 1, 1
2, 4, 3, 2, 3, 4, 4, 4, 4, 4, 1, 1

ขาออก:

60
1
83160

เมื่อคุณบอกว่าไม่มีบิลด์อินสิ่งนี้รวมถึงสิ่งที่ฉันทำเมื่อฉันใช้บิวอินเพื่อสร้างการเรียงสับเปลี่ยนทั้งหมดหรือไม่?
Maltysen

1
นี้มีลักษณะส่วนใหญ่เช่นเดียวกับการคำนวณค่าสัมประสิทธิ์พหุนาม การนับจำนวนรายการที่เหมือนกันสำหรับอินพุตทำให้แตกต่างกันมากพอที่จะไม่ตกเป็นเหยื่อหรือไม่?
xnor

@xnor ดีที่นี่คุณจะมีการนับซ้ำกันดังนั้นจึงไม่เป็นตรงไปตรงมาผมคิดว่า อีกวิธีหนึ่งคือการเสียบค่าโดยตรง
qwr

@Maltysen เศร้าใช่ฉันจะต้องอัปเดตคำถาม
qwr

1
@LuisMendo ใช่มันเป็น แต่ก็ไม่ควรสร้างความแตกต่างเท่าที่ผมสามารถจินตนาการ
qwr

คำตอบ:


6

Python ขนาด 48 ไบต์

f=lambda l:l==[]or len(l)*f(l[1:])/l.count(l[0])

การใช้งานแบบเรียกซ้ำ

ในสูตรn! / (n_1! * n_2! * ...)ถ้าเราลบองค์ประกอบแรก (บอกว่ามัน1) จำนวนการเปลี่ยนแปลงสำหรับn-1องค์ประกอบที่เหลืออยู่คือ

(n-1)! / ((n_1-1)! * n_2! * ...) ==
n! / n / (n_1! / n_1! * n_2! * ...) == 
n/n_1 * (n! / (n_1! * n_2! * ...)`)

ดังนั้นเราจึงได้คำตอบโดยการคูณด้วยn/n1องค์ประกอบส่วนกลับซึ่งเท่ากับส่วนแรกโดยผลการเรียกซ้ำสำหรับส่วนที่เหลือของรายการ รายการว่างให้ตัวพิมพ์ใหญ่ของ 1


ทำไมคุณไม่ใส่/l.count(l[0])ตอนท้าย? จากนั้นคุณไม่จำเป็นต้องมีจุดลอยตัวที่น่ากลัว
feersum

4

MATL , 14 13 12 ไบต์

fpGu"@G=s:p/

ลองออนไลน์!

คำอธิบาย

วิธีการนี้คล้ายกับคำตอบของ @ Adnanมาก

f       % Take input implicitly. Push array of indices of nonzero entries.
        % This gives [1 2 ... n] where n is input length.
p       % Product (compute factorial)
Gu      % Push input. Array of its unique elements
"       % For each of those unique values
  @     %   Push unique value of current iteration
  G=s   %   Number of times (s) it's present (=) in the input (G)
  :p    %   Range, product (compute factorial)
  /     %   Divide
        % End for each implicitly. Display implicitly

3

05AB1E , 15 14 13 ไบต์

รหัส:

D©g!rÙv®yQO!/

คำอธิบาย:

               # implicit input
D©             # duplicate and save a copy to register
  g!           # factorial of input length (total nr of permutations without duplicates)
    rÙv        # for each unique number in input
       ®yQO!   # factorial of number of occurances in input
            /  # divide total nr of permutations by this
               # implicit output

ใช้การเข้ารหัสCP-1252

ลองออนไลน์! .


2

JavaScript (ES6), 64 61 ไบต์

a=>a.sort().map((x,i)=>r=r*++i/(x-y?(y=x,c=1):++c),y=r=-1)|-r

ใช้สูตรที่กำหนดยกเว้นการคำนวณแต่ละแฟคทอเรียลที่เพิ่มขึ้น (เช่นตัวอย่างการr=r*++iคำนวณอย่างมีประสิทธิภาพn!)

แก้ไข: เดิมฉันยอมรับหมายเลขที่ จำกัด แต่ฉันบันทึก 3 ไบต์เมื่อ @ user81655 ชี้ให้เห็นว่าฉันต้องการเพียงเพื่อสนับสนุนจำนวนเต็มบวก (แม้ว่าจริง ๆ แล้วฉันยอมรับจำนวนเต็มไม่เป็นลบ)


r*=++i/(x-y?(y=x,c=1):++c),y=r=-1)|-r?
user81655

@ user81655 อ่าฉันไม่ได้อ่านคำถามอย่างละเอียดพอและมองข้ามว่าฉันสามารถพึ่งพาค่าที่เป็นจำนวนเต็มบวกได้ ฉันไม่ชอบที่*=ตามที่แนะนำข้อผิดพลาดในการปัดเศษ
Neil

2

Pyth, 11 ไบต์

/.!lQ*F/V._

ชุดทดสอบ

ใช้สูตรมาตรฐานn! / (count1! * count2! * ...)ยกเว้นว่ามีการพบแฟคทอเรียลของการนับโดยการนับจำนวนครั้งที่แต่ละองค์ประกอบเกิดขึ้นในคำนำหน้าที่นำไปสู่การนั้นแล้วคูณตัวเลขทั้งหมดเข้าด้วยกัน

คำอธิบาย:

/.!lQ*F/V._
/.!lQ*F/V._QQ    Implicit variable introduction.
                 Q = eval(input())
         ._Q     Form all prefixes of the input.
       /V   Q    Count how many times each element occurs in the prefix
                 ending with that element.
     *F          Fold on multiplication - take the product.
 .!lQ            Take the factorial of the input length
/                Divide.


1

Ruby, 75 74 ไบต์

Kinda หวังว่าMathโมดูลของรูบี้จะมีฟังก์ชันแบบแฟคทอเรียลดังนั้นฉันจึงไม่ต้องสร้างเอง

->l{f=->x{x<2?1:x*f[x-1]};l.uniq.map{|e|f[l.count e]}.inject f[l.size],:/}

1

CJam, 17 ไบต์

q~_,\$e`0f=+:m!:/

ทดสอบที่นี่

คำอธิบาย

q~   e# Read input and evaluate.
_,   e# Duplicate and get length.
\$   e# Swap with other copy and sort it.
e`   e# Run-length encode. Since the list is sorted, this tallies the numbers.
0f=  e# Select the tally of each number.
+    e# Prepend the length of the input.
:m!  e# Compute the factorial of each number in the list.
:/   e# Fold division over it, which divides each factorial of a tally into
     e# the factorial of the length.


1

J, 13 ไบต์

#(%*/)&:!#/.~

การใช้

   f =: #(%*/)&:!#/.~
   f 1 3000 2 2 8
60
   f 1 1 1
1
   f 2 4 3 2 3 4 4 4 4 4 1 1
83160

คำอธิบาย

#(%*/)&:!#/.~  Input: A
         #/.~  Partition A by equal values and get the size of each, these are the tallies
#              Get the size of A
      &:!      Take the factorial of both the size and the tallies
   */          Reduce using multiplication the factorial of the tallies
  %            Divide the factorial of the size by that product and return
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.