การเรียงลำดับฟองสองมิติ


17

การเรียงลำดับไม่สมเหตุสมผลสำหรับอาร์เรย์ 2 มิติ ... หรือไม่

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

อัลกอริทึมทำงานดังต่อไปนี้:

  • แต่ละรอบจะไปทีละแถวจากบนลงล่างเปรียบเทียบ / สลับแต่ละเซลล์ด้วยขวาและข้างล่างเพื่อนบ้าน
    • หากเซลล์มีมากกว่าหนึ่งในสิทธิ์และต่ำกว่าเพื่อนบ้านให้สลับกับเซลล์ที่มีมากกว่านั้น
    • หากเซลล์มีขนาดใหญ่กว่าทั้งด้านขวาและด้านล่างให้สลับกับเพื่อนบ้านที่เล็กกว่า
    • หากเซลล์มีขนาดใหญ่กว่าทั้งด้านขวาและด้านล่างของเพื่อนบ้านซึ่งมีค่าเท่ากันให้สลับกับเพื่อนบ้านด้านล่าง
    • หากเซลล์ไม่ใหญ่กว่าทั้งด้านขวาและด้านล่างเพื่อนบ้านไม่ทำอะไรเลย
  • ทำต่อไปจนกว่าจะไม่มีการแลกเปลี่ยน นี่จะเป็นเมื่อทุกแถวและคอลัมน์อยู่ในลำดับจากซ้ายไปขวาและบนลงล่าง

ตัวอย่าง

4 2 1
3 3 5
7 2 1

แถวแรกของบัตรผ่านจะสลับ 4 และ 2 จากนั้น 4 กับ 1

2 1 4
3 3 5
7 2 1

เมื่อเราได้ 3 ตรงกลางมันจะถูกสลับกับ 2 ด้านล่าง

2 1 4
3 2 5
7 3 1

จากนั้นสลับทั้ง 5 ด้วย 1 ด้านล่าง

2 1 4
3 2 1
7 3 5

แถวสุดท้ายของบัตรผ่านชุดแรกจะเลื่อนหมายเลข 7 ไปทางขวา

2 1 4
3 2 1
3 5 7

จากนั้นเรากลับไปที่แถวบนสุดอีกครั้ง

1 2 1
3 2 4
3 5 7

และดำเนินการต่อแถว ...

1 2 1
2 3 4
3 5 7

... จนกว่ากริดจะ "เรียงลำดับ"

1 1 2
2 3 4
3 5 7

ตัวอย่างอื่น

3 1 1
1 1 1
1 8 9

กลายเป็น

1 1 1
1 1 1
3 8 9

ค่อนข้างมากกว่า

1 1 1
1 1 3
1 8 9

เนื่องจากการสลับลงจะมีลำดับความสำคัญเมื่อทั้งด้านขวาและด้านล่างของเพื่อนบ้านของเซลล์เท่ากัน

การดำเนินการอ้างอิงขั้นตอนโดยขั้นตอนที่สามารถพบได้ที่นี่

กรณีทดสอบ

5 3 2 6 7 3 1 0
3 2 1 9 9 8 3 0
3 2 2 8 9 8 7 6

กลายเป็น

0 0 1 1 2 2 3 6
2 2 3 3 6 7 8 8
3 3 5 7 8 9 9 9

2 1 2 7 8 2 1 0
2 2 2 2 3 2 1 0
1 2 3 4 5 4 3 2
9 8 7 6 5 4 3 6
6 5 4 3 2 2 1 0

กลายเป็น

0 0 0 1 1 1 2 2
1 1 2 2 2 2 2 2
2 2 2 2 3 3 3 3
3 4 4 4 4 5 6 6
5 5 6 7 7 8 8 9

กฎระเบียบ

  • คุณสามารถใช้กริดอินพุตในรูปแบบที่สะดวก
  • คุณอาจคิดว่าค่ากริดเป็นจำนวนเต็มที่ไม่เป็นลบทั้งหมดในช่วง 16 บิตที่ไม่ได้ลงนาม (0-65535)
  • คุณอาจสมมติว่ากริดเป็นรูปสี่เหลี่ยมผืนผ้าที่สมบูรณ์แบบและไม่ใช่อาร์เรย์แบบขรุขระ กริดจะต้องมีอย่างน้อย 2x2
  • ถ้าคุณใช้อัลกอริทึมของการเรียงลำดับอื่นคุณจะต้องจัดหาหลักฐานว่ามันจะเสมอผลิตเพื่อส่งผลเช่นเดียวกับแบรนด์นี้โดยเฉพาะของฟอง 2D เรียงลำดับไม่ว่าสิ่งที่เข้าเป็น ฉันคาดหวังว่านี่จะเป็นข้อพิสูจน์ที่ไม่สำคัญดังนั้นคุณอาจดีกว่าโดยใช้อัลกอริทึมที่อธิบายไว้

มีความสุขในการเล่นกอล์ฟ!


เราจำเป็นต้องใช้อัลกอริทึมที่แน่นอนที่ระบุไว้ในความท้าทายของคุณหรือไม่?
ศูนย์รวมแห่งความไม่รู้

1
อาร์เรย์จะมีอย่างน้อย 2x2 หรือไม่
Feburous

3
@EmbodimentofIgnorance: ถ้าคุณพิสูจน์ว่ามันจะส่งผลในการจัดเรียงเทียบเท่าในทุกกรณี ฉันคาดหวังว่านี่จะเป็นข้อพิสูจน์ที่ไม่สำคัญ
Beefster

4
ใครที่โหวตให้ปิดเรื่องนี้ว่า "กว้างเกินไป" คุณจะอธิบายเหตุผลของคุณไหม? นี่คือในกล่องทรายสำหรับสัปดาห์ที่มี 3 upvotes และไม่มีความคิดเห็นสำหรับการแก้ไขดังนั้นฉันทามติก่อนคือว่านี่เป็นความท้าทายที่ดี
Beefster

คำตอบ:




1

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

(R=#;{a,b}=Dimensions@R;e=1;g:=If[Subtract@@#>0,e++;Reverse@#,#]&;While[e>0,e=0;Do[If[j<b,c=R[[i,j;;j+1]];R[[i,j;;j+1]]=g@c]If[i<a,c=R[[i;;i+1,j]];R[[i;;i+1,j]]=g@c],{i,a},{j,b}]];R)&

ลองออนไลน์!

ฉันไม่ใช่ผู้เชี่ยวชาญทางคณิตศาสตร์ฉันแน่ใจว่ามันสั้นลงได้ โดยเฉพาะอย่างยิ่งฉันคิดว่าคำสั่ง double หากคำสั่งสั้นลงโดยใช้Transposeแต่ฉันไม่รู้ว่าจะทำอย่างไร



0

ทำความสะอาด , 240 ไบต์

import StdEnv
$l=limit(iterate?l)
?[]=[]
?l#[a:b]= @l
=[a: ?b]
@[[a,b:c]:t]#(t,[u:v])=case t of[[p:q]:t]=([q:t],if(a>p&&b>=p)[b,p,a]if(a>b)[a,b,p][b,a,p]);_=(t,sortBy(>)[a,b])
=[v%(i,i)++j\\i<-[0..]&j<- @[[u:c]:t]]
@l=sort(take 2l)++drop 2l

ลองออนไลน์!

ใช้อัลกอริทึมตรงตามที่อธิบายไว้

ลิงก์มีการแยกวิเคราะห์อินพุตเพื่อใช้รูปแบบในคำถาม



0

C # (. NET Core) 310 ไบต์

ไม่มี LINQ ใช้ System.Collections.Generic เฉพาะสำหรับการจัดรูปแบบเอาต์พุตหลังจากฟังก์ชันถูกส่งคืน สิ่งที่โง่มาก รอคอยที่จะกอล์ฟ!

a=>{int x=a.GetLength(0),y=a.GetLength(1);bool u,o;int j=0,k,l,t,z;for(;j<x*y;j++)for(k=0;k<x;k++)for(l=0;l<y;){o=l>y-2?0>1:a[k,l+1]<a[k,l];u=k>x-2?0>1:a[k+1,l]<a[k,l];z=t=a[k,l];if((u&!o)|((u&o)&&(a[k,l+1]>=a[k+1,l]))){t=a[k+1,l];a[k+1,l]=z;}else if((!u&o)|(u&o)){t=a[k,l+1];a[k,l+1]=z;}a[k,l++]=t;}return a;}

ลองออนไลน์!


0

Python 2 , 198 ไบต์

G=input()
O=e=enumerate
while O!=G:
 O=eval(`G`)
 for i,k in e(G):
	for j,l in e(k):v,x,y=min((G[i+x/2][j+x%2],x&1,x/2)for x in(0,1,2)if i+x/2<len(G)and j+x%2<len(k));G[i][j],G[i+y][j+x]=v,l
print G

ลองออนไลน์!

พัฒนาขึ้นโดยอิสระจากคำตอบของ TFeld มีความแตกต่างกันบ้าง


0

ถ่าน 118 ไบต์

≔I9.e999η≧⁻ηηFθ⊞ιη⊞θ⟦η⟧FΣEθLι«FLθ«≔§θκιFLι«≔§ιλζ≔§ι⊕λε≔§§θ⊕κλδ¿››ζδ›δ嫧≔§θ⊕κλζ§≔ιλδ»¿›ζ嫧≔ι⊕λζ§≔ιλε»»»»¿⊟θ¿Eθ⊟ιEθ⪫ι 

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

≔I9.e999η≧⁻ηηFθ⊞ιη⊞θ⟦η⟧

JavaScript มีคุณสมบัติอำนวยความสะดวกที่a[i]>a[i+1]เป็นเท็จหากiเป็นองค์ประกอบสุดท้ายของอาร์เรย์ เพื่อเลียนแบบใน Charcoal ฉันคำนวณ a nanโดยการร่าย9.e999เพื่อลอยแล้วลบมันออกจากตัวมันเอง (ถ่านไม่สนับสนุนคงลอยชี้แจง.) ฉันแล้วแผ่นอาร์เรย์เดิมทางด้านขวาด้วยและยังเพิ่มแถวเพิ่มเติมมีเพียงnan nan(การจัดทำดัชนีวัฏจักรของถ่านหมายความว่าฉันต้องการเพียงหนึ่งองค์ประกอบในแถวนั้น)

FΣEθLι«

วนซ้ำสำหรับแต่ละองค์ประกอบในอาร์เรย์ นี่น่าจะเกินลูปมากพอที่จะทำงานให้เสร็จได้เพราะฉันรวมของพิเศษไว้nanด้วย

FLθ«≔§θκι

วนรอบดัชนีแต่ละแถวและรับแถวที่ดัชนีนั้น (ถ่านสามารถทำได้ทั้งกับนิพจน์ แต่ไม่ใช่ด้วยคำสั่ง) ซึ่งรวมถึงแถวจำลอง แต่นั่นไม่ใช่ปัญหาเนื่องจากการเปรียบเทียบทั้งหมดจะล้มเหลว

FLι«≔§ιλζ

วนรอบแต่ละดัชนีคอลัมน์และรับค่าที่ดัชนีนั้น อีกครั้งนี้จะวนซ้ำค่าหุ่นจำลอง แต่การเปรียบเทียบจะล้มเหลวอีกครั้ง

≔§ι⊕λε≔§§θ⊕κλδ

รับค่าทางด้านขวาและด้านล่างด้วย

¿››ζδ›δ嫧≔§θ⊕κλζ§≔ιλδ»

หากเซลล์มากกว่าค่าด้านล่างและไม่เป็นความจริงที่ว่าค่าด้านล่างมากกว่าค่าทางด้านขวาให้สลับเซลล์ด้วยค่าด้านล่าง

¿›ζ嫧≔ι⊕λζ§≔ιλε»»»»

มิฉะนั้นถ้าเซลล์มีค่ามากกว่าค่าทางด้านขวาให้สลับเซลล์นั้น

¿⊟θ¿Eθ⊟ιEθ⪫ι 

ลบnanค่าและจัดรูปแบบอาร์เรย์สำหรับเอาต์พุตโดยนัย


0

Kotlin , 325 ไบต์

{m:Array<Array<Int>>->val v={r:Int,c:Int->if(r<m.size&&c<m[r].size)m[r][c]
else 65536}
do{var s=0>1
for(r in m.indices)for(c in m[r].indices)when{v(r,c)>v(r+1,c)&&v(r+1,c)<=v(r,c+1)->m[r][c]=m[r+1][c].also{m[r+1][c]=m[r][c]
s=0<1}
v(r,c)>v(r,c+1)&&v(r,c+1)<v(r+1,c)->m[r][c]=m[r][c+1].also{m[r][c+1]=m[r][c]
s=0<1}}}while(s)}

ลองออนไลน์!

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