Sắp xếp bong bóng 2 chiều


17

Sắp xếp không có ý nghĩa gì đối với mảng 2 chiều ... hay không?

Nhiệm vụ của bạn là lấy một lưới đầu vào và áp dụng thuật toán giống như bong bóng cho nó cho đến khi tất cả các giá trị trong lưới không giảm từ trái sang phải và từ trên xuống dưới dọc theo mỗi hàng và cột.

Các thuật toán hoạt động như sau:

  • Mỗi lượt đi theo từng hàng, từ trên xuống dưới, so sánh / hoán đổi từng ô với hàng xóm bên phải và bên dưới.
    • nếu ô lớn hơn chỉ một bên phải và bên dưới hàng xóm, hãy trao đổi với ô lớn hơn
    • nếu ô lớn hơn cả bên phải và bên dưới hàng xóm, hãy trao đổi với hàng xóm nhỏ hơn
    • nếu ô lớn hơn cả hàng xóm bên phải và bên dưới, có cùng giá trị, thì trao đổi với hàng xóm bên dưới.
    • nếu ô không lớn hơn một trong hai bên phải và bên dưới hàng xóm, không làm gì cả
  • Tiếp tục điều này cho đến khi không có giao dịch hoán đổi được thực hiện trong toàn bộ vượt qua. Điều này sẽ là khi mỗi hàng và cột theo thứ tự, từ trái sang phải và từ trên xuống dưới.

Thí dụ

4 2 1
3 3 5
7 2 1

Hàng đầu tiên của pass sẽ hoán đổi 4 và 2, sau đó 4 với 1.

2 1 4
3 3 5
7 2 1

Khi chúng ta có được 3 ở giữa, nó sẽ được hoán đổi với 2 bên dưới

2 1 4
3 2 5
7 3 1

Sau đó, 5 được hoán đổi với 1 dưới đây

2 1 4
3 2 1
7 3 5

Hàng cuối cùng của đường chuyền đầu tiên di chuyển 7 hướng sang phải

2 1 4
3 2 1
3 5 7

Sau đó, chúng tôi trở lại hàng đầu một lần nữa

1 2 1
3 2 4
3 5 7

Và tiếp tục theo từng hàng ...

1 2 1
2 3 4
3 5 7

... cho đến khi lưới được "sắp xếp"

1 1 2
2 3 4
3 5 7

Một vi dụ khac

3 1 1
1 1 1
1 8 9

trở thành

1 1 1
1 1 1
3 8 9

thay vì

1 1 1
1 1 3
1 8 9

bởi vì hoán đổi đi xuống được ưu tiên khi cả hàng xóm bên phải và bên dưới của một ô đều bằng nhau.

Một triển khai tham chiếu từng bước có thể được tìm thấy ở đây .

Các trường hợp thử nghiệm

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

trở thành

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

trở thành

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

Quy tắc

  • Bạn có thể lấy lưới đầu vào ở bất kỳ định dạng thuận tiện nào
  • Bạn có thể giả sử các giá trị lưới là tất cả các số nguyên không âm trong phạm vi 16 bit không dấu (0-65535).
  • Bạn có thể cho rằng lưới là một hình chữ nhật hoàn hảo và không phải là một mảng lởm chởm. Lưới sẽ có ít nhất 2x2.
  • Nếu bạn sử dụng một thuật toán sắp xếp khác, bạn phải cung cấp bằng chứng rằng nó sẽ luôn tạo ra thứ tự kết quả giống như thương hiệu sắp xếp bong bóng 2D cụ thể này, bất kể đầu vào là gì. Tôi hy vọng đây là một bằng chứng không tầm thường, vì vậy có lẽ bạn nên sử dụng thuật toán được mô tả.

Chúc bạn chơi golf vui vẻ!


Chúng ta có phải thực hiện thuật toán chính xác được chỉ định trong thử thách của bạn không?
Hiện thân của sự thiếu hiểu biết

1
Mảng sẽ có ít nhất 2x2?
Οurous

3
@EmbodimentofIgnorance: chỉ khi bạn chứng minh rằng nó dẫn đến một loại tương đương trong mọi trường hợp . Tôi hy vọng đây là một bằng chứng không tầm thường.
Beefster

4
Bất cứ ai đã bỏ phiếu để đóng cái này là "quá rộng", bạn có phiền giải thích lý do của mình không? Điều này đã ở trong hộp cát trong một tuần với 3 lần nâng cấp và không có bình luận nào để sửa chữa, vì vậy sự đồng thuận trước đó là đây là một thách thức khá tốt.
Beefster

Câu trả lời:




1

Ngôn ngữ Wolfram (Mathicala) , 183 byte

(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)&

Hãy thử trực tuyến!

Tôi không phải là chuyên gia Mathicala, tôi chắc chắn rằng nó có thể được thực hiện ngắn hơn. Đặc biệt tôi nghĩ rằng câu lệnh if if có thể được rút ngắn bằng cách sử dụng Transposenhưng tôi không biết làm thế nào.



0

Sạch , 240 byte

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

Hãy thử trực tuyến!

Thực hiện thuật toán chính xác như mô tả.

Liên kết bao gồm phân tích cú pháp đầu vào để có định dạng trong câu hỏi.


0

Python 2 , 215 208 byte

m=input()
h=len(m);w=len(m[0])
while 1:
 M=eval(`m`)
 for k in range(h*w):i,j=k/w,k%w;v,b,a=min([(M[x][y],y,x)for x,y in(i,j),(i+(i<h-1),j),(i,j+(j<w-1))]);M[i][j],M[a][b]=M[a][b],M[i][j]
 M!=m or exit(M);m=M

Hãy thử trực tuyến!

-7 byte, nhờ có lò nướng


208 byte với đầu ra là Debug / STDERR.
trứng

@ovs, Cảm ơn :)
TFeld

0

C # (.NET Core) , 310 byte

Không có LINQ. Chỉ sử dụng System.Collections.Generic để định dạng đầu ra sau khi hàm được trả về. Điều đó là ngu ngốc rất lớn. Mong các golf!

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;}

Hãy thử trực tuyến!


0

Python 2 , 198 byte

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

Hãy thử trực tuyến!

Được phát triển độc lập từ câu trả lời của TFeld, có một số khác biệt.


0

Than , 118 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Tôi cũng đã dành một vài byte cho một số định dạng đẹp hơn. Giải trình:

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

JavaScript có thuộc tính thuận tiện a[i]>a[i+1]là sai nếu ilà phần tử cuối cùng của mảng. Để mô phỏng điều đó trong Than, tôi tính a nanbằng cách đúc 9.e999để nổi và sau đó trừ nó khỏi chính nó. (Than không hỗ trợ hằng số float theo cấp số nhân.) Sau đó, tôi đệm mảng ban đầu bên phải bằng nanvà cũng thêm một hàng bổ sung chỉ chứa nan. (Lập chỉ mục theo chu kỳ của Char than có nghĩa là tôi chỉ cần một yếu tố trong hàng đó.)

FΣEθLι«

Vòng lặp cho mỗi phần tử trong mảng. Điều này nên là quá nhiều vòng lặp để hoàn thành công việc, vì tôi cũng bao gồm tất cả các nans thêm .

FLθ«≔§θκι

Lặp lại từng chỉ số hàng và nhận hàng tại chỉ mục đó. (Than có thể thực hiện cả hai với một biểu thức nhưng không phải bằng lệnh.) Điều này bao gồm hàng giả nhưng đó không phải là vấn đề vì tất cả các so sánh sẽ thất bại.

FLι«≔§ιλζ

Lặp lại từng chỉ số cột và nhận giá trị tại chỉ mục đó. Một lần nữa, điều này sẽ lặp lại các giá trị giả nhưng việc so sánh sẽ lại thất bại.

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

Cũng nhận được các giá trị ở bên phải và bên dưới.

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

Nếu ô lớn hơn giá trị bên dưới và không đúng là giá trị bên dưới lớn hơn giá trị bên phải thì trao đổi ô với giá trị bên dưới.

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

Mặt khác, nếu ô lớn hơn giá trị bên phải thì trao đổi chúng.

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

Loại bỏ các nangiá trị và định dạng mảng cho đầu ra ẩn.


0

Kotlin , 325 byte

{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)}

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.