สลับเดี่ยวของอาร์เรย์


19

แรงบันดาลใจจากที่นำมาจากคำถามที่กองล้น

ความท้าทาย

ได้รับจำนวนเต็มผลผลิตอาร์เรย์ทั้งหมดที่สามารถรับได้โดยการเปลี่ยนตรงสองรายการในอาร์เรย์n>1[1, 2, ..., n]

สามารถผลิตอาร์เรย์ในลำดับใดก็ได้

คุณสามารถใช้[0, 1, ..., n-1](ตามพื้นฐาน 0) แทน[1, 2, ..., n](ตามพื้นฐาน 1)

กฎเพิ่มเติม

กรณีทดสอบ

อินพุต2ให้เอาต์พุต (สมมติว่าเป็นฐาน 1)

2 1

อินพุต3ให้เอาต์พุต (โปรดสังเกตว่าสามอาร์เรย์สามารถอยู่ในลำดับใดก็ได้)

1 3 2
2 1 3
3 2 1

อินพุต4ให้เอาต์พุต

1 2 4 3
1 3 2 4
1 4 3 2
2 1 3 4
3 2 1 4
4 2 3 1

อินพุต7ให้เอาต์พุต

1 2 3 4 5 7 6
1 2 3 4 6 5 7
1 2 3 4 7 6 5
1 2 3 5 4 6 7
1 2 3 6 5 4 7
1 2 3 7 5 6 4
1 2 4 3 5 6 7
1 2 5 4 3 6 7
1 2 6 4 5 3 7
1 2 7 4 5 6 3
1 3 2 4 5 6 7
1 4 3 2 5 6 7
1 5 3 4 2 6 7
1 6 3 4 5 2 7
1 7 3 4 5 6 2
2 1 3 4 5 6 7
3 2 1 4 5 6 7
4 2 3 1 5 6 7
5 2 3 4 1 6 7
6 2 3 4 5 1 7
7 2 3 4 5 6 1

รายการที่จัดทำดัชนีโดยoeis.org/A211369บวกหนึ่ง (หรือสองถ้าการจัดทำดัชนี 0) ในรายการที่เรียงตามพจนานุกรมของการเรียงสับเปลี่ยนทั้งหมดของความยาว n
Jonathan Allan

5
ฉันขอขอบคุณความยืดหยุ่นของ[0 ... n-1]vs [1 ... n]! ฉันมักจะรู้สึกรำคาญเล็กน้อยเมื่อต้องกลัด1+เพราะดัชนี J เป็นศูนย์
โคล

คำตอบ:


3

เจลลี่ , 11 8 ไบต์

ŒcżU$y€R

ลองออนไลน์!

มันทำงานอย่างไร

ŒcżU$y€R  Main link. Argument: n

Œc        Take all 2-combinations of [1, ..., n].
  żU$     Zip the result with the reversed pairs.
       R  Range; yield [1, ..., n].
     y€   For each [[i, j], [j, i]] in the result to the left, yield the result to
          the right, with i replaced by j and vice versa. 

ไม่ว่าสิ่งที่yทำอย่างไร มันเป็นเรื่องลึกลับสำหรับฉันเสมอ
caird coinheringaahing

มันทำการทดแทน ยกตัวอย่างเช่น[1,2],[4,3]y1,2,3แทนที่แต่ละ1ใน[1, 2, 3]กับ4และแต่ละที่ 2กับ3
Dennis

8

R , 54 ไบต์

function(n)combn(n,2,function(x){z=1:n
z[x]=rev(x)
z})

ลองออนไลน์!

ส่งกลับเมทริกซ์ที่แต่ละคอลัมน์มีการเรียงสับเปลี่ยน

combn(n,k)สร้างชุดค่าผสมทั้งหมดkจากรายการnหรือจาก1:nถ้าnเป็นจำนวนเต็มเดียว นอกจากนี้ยังใช้ฟังก์ชันFUNที่จะนำไปใช้กับชุดค่าผสมผลลัพธ์ ดังนั้นเราจึงเขียนฟังก์ชั่นที่ทำการสลับและส่งกลับรายการที่สลับกัน จากนั้นผลลัพธ์ทั้งหมดจะถูกสะสมลงใน a arrayซึ่งในกรณีนี้ 2 มิติและเมทริกซ์





5

ภาษา Wolfram (Mathematica) , 43 ไบต์

r/.{#->#2,#2->#}&@@@Subsets[r=Range@#,{2}]&

ลองออนไลน์!

คำอธิบาย: Subsets[Range@#,{2}]สร้างย่อยทั้งหมดของ{1,2,...,n}ขนาด 2 แล้วสำหรับแต่ละเซต, แลกเปลี่ยนทั้งสองสิ่งในรายการ/.{1,2,...,n}

วิธีการนี้คล้ายกับผลงานอื่น ๆ ที่น่าผิดหวัง แต่นี่เป็นวิธีที่ไม่เหมือนใครใน Mathematica สำหรับ 3 ไบต์พิเศษ:

r~Permute~Cycles@{#}&/@Subsets[r=Range@#,{2}]&

ลองออนไลน์!


2
วิธีการแก้ปัญหา Mathematica ReplaceList[Range@#,{a___,b_,c___,d_,e___}:>{a,d,c,b,e}]&แม้สำนวนมากขึ้นจะ ฉันชอบความเรียบง่ายของมัน (หรือโดยตรงที่เข้ารหัสปัญหา) แต่น่าเสียดายที่ไวยากรณ์การจับคู่รูปแบบมีความละเอียดมากจนกลายเป็น 57 ไบต์
Martin Ender

5

Haskell, 62 ไบต์

g n|b<-[1..n]=[[last$k:[j|k==i]++[i|k==j]|k<-b]|i<-b,j<-b,j<i]

ลองออนไลน์!

i<-b                -- loop 'i' through [1..n]
     j<-b           -- loop 'j' through [1..n]
          j<i       -- consider only cases where j<i 
 [            k<-b] -- make a list by looping 'k' through [1..n] 
  last              -- pick
          [i|k==j]  -- 'i' if k==j
       [j|k==i]     -- 'j' if k==i
     k              -- 'k' else   

4

Haskell , 71 ไบต์

f 0=[]
f x=map(++[x])(f$x-1)++[[1..y-1]++x:[y+1..x-1]++[y]|y<-[1..x-1]]

ลองออนไลน์!


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


4

MATLขนาด 12 ไบต์

:2XN!"G:@tP(

ลองออนไลน์!

            %implicit input, say, 4
:           %range, stack is {[1,2,3,4]}
2           %push 2
XN          %nchoosek, compute all combinations of [1,2,3,4] taken 2 at a time
            %this results in a matrix where each row is a combination, i.e.,
            %[1, 2;
              1, 3;
              1, 4;
              2, 3;
              2, 4;
              3, 4]
!           %transpose, because "for" iterates over columns
"           %begin for loop
G:          %push input and range, stack is now [1,2,3,4]
@t          %push "for" index (the column), say, [1;2], twice
P           %flip array, so stack is now: {[1,2,3,4],[1;2],[2;1]}
(           %assignment index, sets [1,2,3,4]([1;2])=[2;1],
            %resulting in [2,1,3,4]
            %implicit end of loop, implicit end of program, print the stack implicitly.


1
2 ไบต์สั้นกว่ารหัสที่ฉันใช้เพื่อสร้างกรณีทดสอบและวิธีเพิ่มเติม:
หลุยส์เมนโด

@LuisMendo คุณสร้างกรณีทดสอบได้อย่างไร ฉันเป็นกังวลว่าเหมืองของฉันจะนานขึ้นเพราะลำดับไม่เหมือนกัน!
Giuseppe

1
:tY@wy=~!s2=Y)ผมใช้ วิธีการเดียวกับคำตอบระดับแปดเสียงของ rahnema1 ฉันคิดว่า
Luis Mendo เมื่อ


3

อ็อกเทฟ 38 ไบต์

@(n)(p=perms(k=1:n))(sum(p~=k,2)==2,:)

ลองออนไลน์!

สร้างการเรียงสับเปลี่ยนทั้งหมด 1: n และเลือกจากรายการที่มีสององค์ประกอบแตกต่างจาก 1: n


2

JavaScript (ES6), 81 ไบต์

พิมพ์อาร์เรย์ 0 ที่ทำดัชนี

n=>(a=[...Array(n).keys()]).map(i=>a.map(j=>i>j&&alert(a.map(k=>k-i?k-j?k:i:j))))

การสาธิต

alert()จะถูกแทนที่ด้วยconsole.log()ในตัวอย่างนี้เพื่อใช้งานง่าย




2

05AB1E , 15 9 ไบต์

LœʒD{αĀO<

ลองออนไลน์!

คำอธิบาย

L            # push range [1 ... input]
 œ           # get all permutations
  ʒ          # filter, keep only elements that are true when
     α       # absolute value is taken with
   D{        # a sorted copy
      Ā      # each non-zero value in the resulting array is converted to 1
       O     # the array is summed
        <    # and the sum is decremented


2

ทับทิม , 55 53 ไบต์

->n{n.times{|x|x.times{|y|(w=*0...n)[w[x]=y]=x;p w}}}

ลองออนไลน์!

โซลูชันที่ใช้ 0

เคล็ดลับที่นี่คือการวนรอบภายใน "ข้าม" การวนซ้ำเสมอ: ครั้งแรกที่มันไม่ได้ดำเนินการเลยจากนั้นผ่านเพียงครั้งเดียวในรอบที่สองเป็นต้น

ฉันมีความสุขกับ 55 ไบต์จนกว่าฉันจะเห็นว่าRสามารถลงกอล์ฟได้ถึง 54 ดังนั้นฉันต้องไปให้ถึง 53


การใช้ข้อ จำกัด เอาต์พุตที่ยืดหยุ่นมาก
Unihedron


1

Pyth, 9 ไบต์

t{.rLQ*=U

สาธิต

วิธีที่ง่ายที่สุดในการสลับสองค่าคือการใช้.rซึ่งเป็นฟังก์ชันการแปลแบบหมุนของ Pyth .r<list>[A, B]จะสลับการเกิดขึ้นทั้งหมดของAและBในlistใน

ดังนั้นโดยใช้ฟังก์ชั่นการแปลUQรายการจาก0ไปยังn-1กับรายการองค์ประกอบสองรายการของตัวเลขที่แตกต่างกันในรายการเราจะสร้างผลลัพธ์ที่ต้องการ Qคืออินพุตn, และUเป็นฟังก์ชันพิสัย

วิธีง่ายๆในการทำเช่นนี้คือ:

.rLUQ.cUQ2

.cUQ2สร้างการรวมองค์ประกอบที่ 2 ขององค์ประกอบที่แตกต่างในช่วงและ.rLUQแผนที่การทำงานของพวกเขาและรายการ.rUQ

อย่างไรก็ตามนั่นจะเป็น 10 ไบต์

แทนที่จะทำให้การสั่งซื้อคู่ที่แตกต่างกันเราสามารถทำให้ทุกคู่ด้วย.cUQ2 นี่คือปริยายเทียบเท่ากับ*=U *=UQQมันเริ่มต้นโดยการเขียนทับQด้วยUQแล้วการผลิตภัณฑ์ Cartesian ของและUQ UQสิ่งนี้จะให้ตัวเลขทั้งหมดคู่ในช่วงไม่จำเป็นต้องเรียงลำดับหรือชัดเจน

.rLQสลับโดยใช้แต่ละรายการ จำได้ว่าQอยู่ในขณะนี้เท่ากับรายการจาก0การไม่ได้n-1n

เนื่องจากทั้งคู่ไม่ได้รับคำสั่งจึงมีการซ้ำซ้อน {ลบรายการที่ซ้ำกัน เนื่องจากคู่ไม่ชัดเจนรายการที่ไม่เปลี่ยนแปลงอยู่ รายการนี้จะเป็นครั้งแรกหลังจากการขจัดข้อมูลซ้ำซ้อนเพราะรักษาคำสั่งของการปรากฏตัวครั้งแรกและไม่เปลี่ยนแปลงรายการที่ผลิตโดยการหมุนโดย{ ลบองค์ประกอบแรกให้รายการ swaps ที่ต้องการ[0,0]t


1

Pyth, 11 ไบต์

fq2snVTUQ.p

ลองใช้ออนไลน์
ไม่สั้นเท่ากับแนวทางของ isaacg แต่ต่างไปจากการโพสต์

คำอธิบาย

fq2snVTUQ.p
         .pQ  Take the permutations of the (implicit) range [0,...,input].
f     T       Filter to get the permutations...
   snV UQ     ... where the number of differences with [0,...,input]...
 q2           ... is 2.

1

Java 8, 109 105 ไบต์

n->{String r="";for(int i=0,j,k;i++<n;)for(j=i;j++<n;r+="\n")for(k=0;k++<n;)r+=k!=i?k!=j?k:i:j;return r;}

ฉันเป็นสนิม .. ยังไม่ได้เขียนรหัสในอีกหลายเดือน .. สิ้นสุดการย้าย@ คำตอบของ Sadyadybox 'C .. อาจจะสามารถเล่นกอล์ฟได้มากกว่านี้

ลองที่นี่



1

Ruby , 80 ไบต์

-12 ไบต์ขอบคุณ Unihedron

->n{(r=1..n).map{|x|r.map{|y|r.map{|i|i==x ?y:i==y ?x:i}}}.flatten(1).uniq[1,n]}

ลองออนไลน์!

ฉันมีวิธีการที่ดีที่สุดในการแปลทับทิมด้วยเหตุผลบางอย่างดังนั้น ... ฉันไม่รู้แม้แต่ทับทิมจริงๆ ...


ฉัน outgolfed นี้: codegolf.stackexchange.com/a/152652/21830 ขออภัย!
Unihedron

ไม่จำเป็นต้องขอโทษ! ฉันคิดว่าฉันพูดกับผู้ใช้ PPCG ส่วนใหญ่เมื่อฉันบอกว่าการแข่งขันคือสิ่งที่ทำให้ PPCG ดูดี
มนุษย์โดยรวม

1
สำหรับรหัสของคุณ 1. คุณสามารถกำหนดให้1..nกับตัวแปรแบบตัวเดียวและนำมาใช้ใหม่ (แยกคำสั่งด้วย newline หรือ semicolons) 2. ทำโดยไม่ต้องวงเล็บในงบ termary: i==x ?y:i==y ?x:i(หมายเหตุที่ฉันมีช่องว่างเพื่อแยก Shebang ที่มีศักยภาพ ) และ 3 แทนuniq[1,n] uniq[1..-1]
Unihedron
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.