2次元バブルソート


17

並べ替えは2次元配列には意味がありません...またはそれを行いますか?

あなたのタスクは、入力グリッドを取得し、グリッド内のすべての値がすべての行と列に沿って左から右、上から下に減少しないまで、バブルソートのようなアルゴリズムを適用することです。

アルゴリズムは次のように機能します。

  • 各パスは、行ごとに上から下に進み、各セルをその右および下の隣接セルと比較/交換します。
    • セルがその右隣と下隣のいずれか1つよりも大きい場合、それより大きいセルと交換します
    • セルが右隣と下隣の両方よりも大きい場合、小さい隣と交換します
    • セルが右隣と下隣の両方(同じ値)よりも大きい場合は、下隣と交換します。
    • セルがその右隣および下隣のいずれよりも大きくない場合、何もしない
  • パス全体でスワップが行われないまでこれを続けます。これは、すべての行と列が左から右へ、上から下へ順番に並んでいるときです。

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ですか?
Οurous

3
@EmbodimentofIgnorance:すべてのケースで同等のソートになることを証明した場合のみ。これは重要な証拠になると思います。
ビーフスター

4
「広すぎる」としてこれを閉じることに投票した人は誰でも、あなたの推論を説明してもいいですか?これは1週間サンドボックス内にあり、3つのアップボットがあり、修正のためのコメントはありませんでした。
ビーフスター

回答:




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

オンラインでお試しください!

私はMathematicaの専門家ではありません。もっと短くできると確信しています。特に、ダブルifステートメントは短縮して使用できると思いますが、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

、118バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。また、いくつかのきれいなフォーマットに数バイトを費やしました。説明:

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

JavaScriptには、配列の最後の要素であるa[i]>a[i+1]場合にfalseとなる便利なプロパティがありますi。炭でそれをエミュレートするには、フロートにnanキャスト9.e999してからそれを減算してaを計算します。(チャコールは指数浮動小数点定数をサポートしていません。)次に、元の配列の右側にをnan埋め込み、さらにを含む追加の行を追加しnanます。(木炭の循環インデックスは、その行に1つの要素しか必要ないことを意味します。)

FΣEθLι«

配列内の各要素のループ。私はすべての余分なものも含めているので、これは仕事を成し遂げるのに十分なループ以上でなければなりnanません。

FLθ«≔§θκι

各行インデックスをループし、そのインデックスで行を取得します。(Charcoalは式で両方を実行できますが、コマンドでは実行できません。)これにはダミー行が含まれますが、すべての比較が失敗するため、問題はありません。

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.