แจกแจง Derangements


17

รับจำนวนเต็มบวกnสร้าง derangements ทั้งหมดของnวัตถุ

รายละเอียด

  • การเรียงสับเปลี่ยนเป็นการเปลี่ยนแปลงที่ไม่มีจุดคงที่ (ซึ่งหมายความว่าในทุกหมายเลข derangement iไม่สามารถอยู่ในรายการi th)
  • ผลลัพธ์ควรประกอบด้วยตัวเลข(1,2,,n) (หรืออีกทางหนึ่ง(0,1,2,,n1) )
  • คุณสามารถพิมพ์ Derangements ของ(n,n1,,1) (หรือ(n1,n2,,1,0)ตามลำดับ) แต่คุณต้องระบุ
  • เอาท์พุทจะต้องถูกกำหนดไว้นั่นคือเมื่อใดก็ตามที่โปรแกรมถูกเรียกด้วยบางอย่างให้nเป็นอินพุทเอาท์พุทควรจะเหมือนกัน (ซึ่งรวมถึงคำสั่งของ derangements จะต้องยังคงเหมือนเดิม) และเอาท์พุททั้งหมดจะต้องทำภายใน จำนวน จำกัด ของเวลาทุกครั้ง (ไม่เพียงพอที่จะทำเช่นนั้นกับความน่าจะเป็น 1)
  • คุณสามารถสันนิษฐานได้ว่าn2
  • สำหรับบางnคุณสามารถสร้างความแตกต่างทั้งหมดหรือคุณสามารถใช้จำนวนเต็มkอื่นที่ทำหน้าที่เป็นดัชนีและพิมพ์k -th derangement (ตามลำดับที่คุณเลือก)

ตัวอย่าง

โปรดทราบว่าคำสั่งของ derangements ไม่จำเป็นต้องเหมือนกับที่แสดงไว้ที่นี่:

n=2: (2,1)
n=3: (2,3,1),(3,1,2)
n=4: (2,1,4,3),(2,3,4,1),(2,4,1,3), (3,1,4,2),(3,4,1,2),(3,4,2,1), (4,1,2,3),(4,3,1,2),(4,3,2,1)

OEIS A000166นับจำนวนความเสียหาย


เราสามารถส่งเครื่องกำเนิดไฟฟ้าได้หรือไม่?
ทำให้เสียชีวิต

@ สรุปใช่ฉันคิดว่ามันจะคล้ายกันมากพอกับวิธีที่กล่าวถึงอีกสองวิธี (หรือคุณคิดว่ามีข้อโต้แย้งที่รุนแรงหรือไม่?)
ข้อบกพร่อง

1
@Falize จริง ๆ แล้วดูเหมือนว่าคืนเครื่องกำเนิดไฟฟ้าแทนรายการเป็นไปได้โดยค่าเริ่มต้น
ข้อบกพร่อง

คำตอบ:


7

เยลลี่ 6 ไบต์

Œ!=ÐṂR

Monadic Link ยอมรับจำนวนเต็มบวกซึ่งให้รายการของจำนวนเต็ม

ลองออนไลน์!

อย่างไร?

Œ!=ÐṂR - Link: integer, n
Œ!     - all permutations of (implicit range of [1..n])
     R - range of [1..n]
   ÐṂ  - filter keep those which are minimal by:
  =    -   equals? (vectorises)
       -   ... i.e. keep only those permutations that evaluate as [0,0,0,...,0]

5

Brachylogขนาด 9 ไบต์

⟦kpiᶠ≠ᵐhᵐ

ลองออนไลน์!

นี่คือตัวกำเนิดที่ส่งออกหนึ่ง derangement ของ [0, …, n-1]nให้

ถ้าเราห่อใน ᶠ - findall metapredicate เราจะได้กำเนิดมาหลายชั่วอายุคนโดยกำเนิด

คำอธิบาย

⟦           The range [0, …, Input]
 k          Remove the last element
  p         Take a permutation of the range [0, …, Input - 1]
   iᶠ       Take all pair of Element-index: [[Elem0, 0],…,[ElemN-1, N-1]]
     ≠ᵐ     Each pair must contain different values
       hᵐ   The output is the head of each pair

5

JavaScript (V8) , 85 ไบต์

ฟังก์ชั่นแบบเรียกซ้ำพิมพ์ทั้งหมด 0

f=(n,p=[],i,k=n)=>k--?f(n,p,i,k,k^i&&!p.includes(k)&&f(n,[...p,k],-~i)):i^n||print(p)

ลองออนไลน์!

แสดงความคิดเห็น

f = (                   // f is a recursive function taking:
  n,                    //   n   = input
  p = [],               //   p[] = current permutation
  i,                    //   i   = current position in the permutation
  k = n                 //   k   = next value to try
) =>                    //         (a decrementing counter initialized to n)
  k-- ?                 // decrement k; if it was not equal to 0:
    f(                  //   do a recursive call:
      n, p, i, k,       //     leave all parameters unchanged
      k ^ i &&          //     if k is not equal to the position
      !p.includes(k) && //     and k does not yet appear in p[]:
        f(              //       do another recursive call:
          n,            //         leave n unchanged
          [...p, k],    //         append k to p
          -~i           //         increment i
                        //         implicitly restart with k = n
        )               //       end of inner recursive call
    )                   //   end of outer recursive call
  :                     // else:
    i ^ n ||            //   if the derangement is complete:
      print(p)          //     print it




2

Japtet , 8 ไบต์

0-based

o á fÈe¦

ลอง (ส่วนท้ายจะเพิ่มองค์ประกอบทั้งหมดเพื่อการเปรียบเทียบที่ง่ายขึ้นกับเคสทดสอบ)

o á fÈe¦     :Implicit input of integer
o            :Range [0,input)
  á          :Permutations
    f        :Filter
     È       :By passing each through this function
      e      :  Every element of the permutation
       ¦     :  Does not equal its 0-based index

2

Python 2 , 102 ไบต์

lambda n:[p for p in permutations(range(n))if all(i-j for i,j in enumerate(p))]
from itertools import*

ลองออนไลน์!

การทำดัชนีแบบ 0 รายการของสิ่งอันดับ

itertoolsโซลูชันที่ไม่ใช้:

Python 2 , 107 ไบต์

n=input()
for i in range(n**n):
 t=[];c=1
 for j in range(n):c*=j!=i%n not in t;t+=[i%n];i/=n
 if c:print t

ลองออนไลน์!

การจัดทำดัชนี 0 รายการบรรทัดของรายการโปรแกรมเต็มรูปแบบ

หมายเหตุ: วิธีนี้แม้ว่าจะไม่นำเข้าitertoolsไลบรารี แต่ก็ไม่นานกว่าอีกอันหนึ่งที่นำเข้าเนื่องจากส่วนใหญ่ที่นี่กำลังสร้างการเรียงสับเปลี่ยน การตรวจสอบความสับสนนั้นเพิ่มขึ้นประมาณ 7 ไบต์! เหตุผลก็คือการตรวจสอบเสร็จในทันทีเป็นส่วนหนึ่งของอาคารของการเปลี่ยนแปลงแต่ละครั้ง สิ่งนี้ไม่เป็นความจริงสำหรับโซลูชันอื่น ๆ ที่คุณต้องตรวจสอบว่าการเรียงสับเปลี่ยนแต่ละครั้งที่ส่งคืนโดยitertools.permutationsฟังก์ชันนั้นเป็นความจริงหรือไม่


2

MATL 11 ไบต์

:tY@tb-!AY)

สิ่งนี้จะสร้างความยุ่งเหยิงทั้งหมดตามลำดับพจนานุกรม

ลองออนไลน์!

คำอธิบายพร้อมตัวอย่าง

3พิจารณาการป้อนข้อมูล

:     % Implicit input n. Range [1 2 ... n]
      % STACK: [1 2 3]
t     % Duplicate
      % STACK: [1 2 3], [1 2 3]
Y@    % All permutations, in lexicographical order, as rows of a matrix
      % STACK: [1 2 3], [1 2 3; 1 3 2; ··· ; 3 2 1]
t     % Duplicate
      % STACK: [1 2 3], [1 2 3; 1 3 2; ··· ; 3 2 1], [1 2 3; 1 3 2; ··· ; 3 2 1]
b     % Bubble up: moves third-topmost element in stack to the top
      % STACK: [1 2 3; 1 3 2; ··· ; 3 2 1], [1 2 3; 1 3 2; ··· ; 3 1 2; 3 2 1], [1 2 3]
-     % Subtract, element-wise with broadcast
      % STACK: [1 2 3; 1 3 2; ··· ; 3 2 1], [0 0 0; 0 1 -1; ··· ; 2 -1 -1; 2 0 -2]
!A    % True for rows containining only nonzero elements
      % STACK: [1 2 3; 1 3 2; ··· ; 3 1 2; 3 2 1], [false false ··· true false]
Y)    % Use logical mask as a row index. Implicit display
      % STACK: [2 3 1; 3 1 2]




1

J , 26 ไบต์

i.(]#~0~:*/@(-|:))i.@!A.i.

ลองออนไลน์!

i. (] #~ 0 ~: */@(- |:)) i.@! A. i.
i. (                   )            NB. 0..input
   (                   ) i.@! A. i. NB. x A. y returns the
                                    NB. x-th perm of y
                                    NB. i.@! returns 
                                    NB. 0..input!. Combined
                                    NB. it produces all perms
                                    NB. of y
    ] #~ 0 ~: */@(- |:)             NB. those 2 are passed as
                                    NB. left and right args
                                    NB. to this
    ] #~                            NB. filter the right arg ]
                                    NB. (all perms) by:
         0 ~:                       NB. where 0 is not equal to...
              */@                   NB. the product of the 
                                    NB. rows of...
                 (- |:)             NB. the left arg minus
                                    NB. the transpose of
                                    NB. the right arg, which
                                    NB. will only contain 0
                                    NB. for perms that have
                                    NB. a fixed point

1

R , 81 80 ไบต์

function(n)unique(Filter(function(x)all(1:n%in%x&1:n-x),combn(rep(1:n,n),n,,F)))

ลองออนไลน์!

list(n2n)n[1..n]n1:n%in%x1:n-x

R + gtools , 62 ไบต์

function(n,y=gtools::permutations(n,n))y[!colSums(t(y)==1:n),]

ลองออนไลน์!

มีประสิทธิภาพมากขึ้นส่งคืนmatrixแถวที่แต่ละแถวเรียงกัน



1

C ++ (gcc) , 207 196 ไบต์

-5 bytes by ceilingcat -6 bytes โดย Roman Odaisky

#include<regex>
#define v std::vector
auto p(int n){v<v<int>>r;v<int>m(n);int i=n;for(;m[i]=--i;);w:for(;std::next_permutation(&m[0],&m[n]);r.push_back(m))for(i=n;i--;)if(m[i]==i)goto w;return r;}

ลองออนไลน์!


คุณสามารถทำได้ดีกว่านี้ถ้าคุณใช้พารามิเตอร์เอาต์พุตโดยเฉพาะถ้าเป็น std :: array ดังนั้นจึงมีขนาดก่อน - 145 ไบต์
Roman Odaisky

@ RomanOdaisky: เป็นความคิดที่ดี แต่ฉันเข้าใจกฎของ code golf ได้อย่างไรคุณจะต้องนำโค้ด preallocation มาใช้ในการนับจำนวนไบต์
movatica

@movatica พื้นที่สีเทาฉันคิดว่ารหัสน่าจะใช้ได้มากกว่าที่ไม่ถูกต้อง มันจะเขียนผลลัพธ์ที่ถูกต้องอย่างมีความสุขที่ใดที่หนึ่งและเป็นความรับผิดชอบของผู้โทรในการอ่านเอาต์พุต โปรดทราบว่าอัลกอริทึม STL เช่นstd::copyนั้นมอบหมายให้ผู้เรียกพร้อมกับจัดเตรียมพื้นที่เพียงพอสำหรับเอาต์พุต
Roman Odaisky

@RomanOdaisky: พฤติกรรม STL เป็นอาร์กิวเมนต์ที่ถูกต้อง
movatica

0

C ++ (gcc) , 133 ไบต์

ฉันคิดว่าสิ่งนี้เติบโตขึ้นมากพอจากข้อเสนออื่น ๆ เพื่อให้ได้คำตอบแยกต่างหาก ในที่สุดการใช้index[array]ไวยากรณ์ภายในออก!

#include<regex>
[](int n,auto&r){int i=n;for(;i[*r]=--i;);for(;std::next_permutation(*r,*r+n);)for(i=n;i--?(r[1][i]=i[*r])-i:!++r;);}

ลองออนไลน์!



0

Python 2 , 82 ไบต์

f=lambda n,i=0:i/n*[[]]or[[x]+l for l in f(n,i+1)for x in range(n)if~-(x in[i]+l)]

ลองออนไลน์!

88 ไบต์เป็นโปรแกรม:

M=[],
r=range(input())
for i in r:M=[l+[x]for l in M for x in r if~-(x in[i]+l)]
print M

ลองออนไลน์!

93 ไบต์โดยใช้ itertools:

from itertools import*
r=range(input())
print[p for p in permutations(r)if all(map(cmp,p,r))]

ลองออนไลน์!


0

Perl 6 , 49 37 ไบต์

แก้ไข: หลังจากกลับมากับ Phil H เราได้ทำการลบทิ้งเหลือเพียง 37 ไบต์:

(^*).permutations.grep:{all @_ Z-^@_}

ลองออนไลน์!

โดยการใช้Whateverที่จุดเริ่มต้นเราสามารถหลีกเลี่ยงวงเล็บ (ประหยัด 2 ตัวอักษร) ถัดไปใช้Zmetaoperator -ซึ่งใช้องค์ประกอบของการเรียงสับเปลี่ยน (เช่น 2,3,1) และลบออกตามลำดับ 0,1,2 หากหนึ่งในนั้นคือ 0 (เท็จ) ดังนั้นจุดเชื่อมต่อทั้งหมดล้มเหลว


โซลูชันดั้งเดิมคือ ( ลองออนไลน์! )

{permutations($_).grep:{none (for $_ {$++==$_})}}

1
เริ่มต้นที่ดีคุณสามารถทำให้ตัวกรองสั้นลงด้วย Z on! = สำหรับ -7 bytes: tio.run/##K0gtyjH7n1upoJamYKvwv7ogtSi3tCSxJDM/ …
Phil H

@ ฟิลล์ฉันรู้ว่าต้องมีวิธีการรวมตัวดำเนินการ zip แต่ฉันไม่สามารถเข้าใจได้ ดี
user0721090601

PhilH ใช้กลยุทธ์นั้นยังสามารถเคาะอีก 3 ครั้งโดยการฆ่าวงเล็บ: tio.run/##K0gtyjH7n1upoJamYKvwv7ogtSi3tCSxJDM/
0721090601

PhilH ที่คนสุดท้ายไม่ทำงาน สำหรับทั้งหมดยกเว้น n = 2 มากกว่าหนึ่งองค์ประกอบเท่านั้นที่จะถูกปฏิเสธ
user0721090601

แน่นอนลืมความต้องการ ... ถูกนำออกไป
Phil H

0

ถ่าน , 44 28 ไบต์

ขีดฆ่า 44 ยังคงเป็นปกติ 44

NθIΦEXθθEθ﹪÷ιXθλθ⬤ι‹⁼μλ⁼¹№ιλ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด @ EricTheOutgolfer ใช้คำตอบที่ไม่ใช่ itertools อย่างอิสระ คำอธิบาย:

Nθ                              Input `n`
     Xθθ                        `n` raised to power `n`
    E                           Mapped over implicit range
         θ                      `n`
        E                       Mapped over implicit range
            ι                   Outer loop index
           ÷                    Integer divided by
             Xθ                 `n` raised to power
               λ                Inner loop index
          ﹪     θ               Modulo `n`
   Φ                            Filtered where
                  ι             Current base conversion result
                 ⬤              All digits satisfy
                         №ιλ    Count of that digit
                       ⁼¹       Equals literal 1
                   ‹            And not
                    ⁼μλ         Digit equals its position
  I                             Cast to string
                                Implicitly print


0

Pyth , 12 ไบต์

f*F.e-bkT.PU

ลองออนไลน์!

           UQ # [implicit Q=input] range(0,Q)
         .P  Q# [implicit Q=input] all permutations of length Q
f             # filter that on lambda T:
   .e   T     #   enumerated map over T: lambda b (=element), k (=index):
     -bk      #     b-k
 *F           # multiply all together

ตัวกรองทำงานดังนี้: หากองค์ประกอบใด ๆ อยู่ที่จุดเดิม (องค์ประกอบดัชนี) จะเป็น 0 และผลิตภัณฑ์ทั้งหมดจะเป็น 0 และทำให้เป็นเท็จ

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