このコードチャレンジのアイデアは単純です。整数の行列が与えられた場合、ルービックスタイルの動きを適用して並べ替えます。つまり、単一の行または列を選択し、その要素を任意の方向に回転できます。
[1, 3, 2, 4] => [3, 2, 4, 1] (rotate left for rows/up for columns)
[1, 3, 2, 4] => [4, 1, 3, 2] (rotate right for rows/down for columns)
したがって、任意の次元の整数の行列が与えられた場合、これらのルービックスタイルの変換のみを適用して要素を並べ替えます。行列
要素が次の制限に準拠している場合、ソート済みと見なされます。
I / O
- 入力は、値が繰り返されない正の整数の行列になります。
- 出力は、ソートに必要な動きになります。これはコードのゴルフ挑戦ではなく、あなたがその長さを心配する必要はないので、すべての動きのための提案フォーマットがされて
#[UDLR]
いる#
行または列の数が移動することです(0インデックス)と[UDLR]
その中に単一の文字であります移動が上/下(列の場合)か左/右(行の場合)かを指定する範囲。つまり1U
、「1番目の列を上に移動する」という意味ですが、「1R
1番目の行を右に移動する」ことになります。動きはコンマで区切られるため、解決策は次のように表現されます1R,1U,0L,2D
。
得点
この方法でマトリックスを並べ替えようとすると、考えられる動きの組み合わせが多数あるため、コストがかかる可能性があります。また、並べ替え可能な動きのリストも多数あるため、目標はN *を並べ替えるコードを記述することです。以下のN個の行列。スコアは、エラーなしで妥当な時間1で解くことができる最大のサイズNになります(解く行列のサイズが大きいほど良い)。タイの場合、タイブレーカーは、見つかったパスの移動数になります(パスが短いほど良い)。
例:ユーザーAがN = 5のソリューションを見つけ、BがN = 6のソリューションを見つけた場合、Bは両方のパスの長さに関係なく勝ちます。両者がN = 6の解を見つけたが、Aが見つけた解に50ステップがあり、Bの解に60ステップがある場合、Aが勝ちます。
あなたのコードがどのように動作するかの説明は非常に奨励されています、そして、私たちがそれらをテストできるように見つけられたソリューションを投稿してください。ソリューションが大きすぎる場合は、Pastebinまたは同様のツールを使用できます。また、コードがソリューションを見つけるのに費やした時間を見積もっていただければ幸いです。
テストケース
次のマトリックス(よりコピーアンドペースト可能なバージョンの場合はPastebinリンク)は、10Kのランダムなルービックスタイルの動きでスクランブルすることにより、既にソートされたマトリックスから作成されています。
平文テストケース:
[[8, 5, 6], [11, 10, 1], [3, 15, 13]]
[[21, 10, 12, 16], [17, 6, 22, 14], [8, 5, 19, 26], [13, 24, 3, 1]]
[[1, 13, 8, 16, 5], [9, 40, 21, 26, 22], [11, 24, 14, 39, 28], [32, 19, 37, 3, 10], [30, 17, 36, 7, 34]]
[[34, 21, 40, 22, 35, 41], [18, 33, 31, 30, 12, 43], [19, 11, 39, 24, 28, 23], [44, 1, 36, 5, 38, 45], [14, 17, 9, 16, 13, 26], [8, 3, 47, 6, 25, 4]]
[[20, 36, 17, 1, 15, 50, 18], [72, 67, 34, 10, 32, 3, 55], [42, 43, 9, 6, 30, 61, 39], [28, 41, 54, 27, 23, 5, 70], [48, 13, 25, 12, 46, 58, 63], [52, 37, 8, 45, 33, 14, 68], [59, 65, 56, 73, 60, 64, 22]]
[[85, 56, 52, 75, 89, 44, 41, 68], [27, 15, 87, 91, 32, 37, 39, 73], [6, 7, 64, 19, 99, 78, 46, 16], [42, 21, 63, 100, 4, 1, 72, 13], [11, 97, 30, 93, 28, 40, 3, 36], [50, 70, 25, 80, 58, 9, 60, 84], [54, 96, 17, 29, 43, 34, 23, 35], [77, 61, 82, 48, 2, 94, 38, 66]]
[[56, 79, 90, 61, 71, 122, 110, 31, 55], [11, 44, 28, 4, 85, 1, 30, 6, 18], [84, 43, 38, 66, 113, 24, 96, 20, 102], [75, 68, 5, 88, 80, 98, 35, 100, 77], [13, 21, 64, 108, 10, 60, 114, 40, 23], [47, 2, 73, 106, 82, 32, 120, 26, 36], [53, 93, 69, 104, 54, 19, 111, 117, 62], [17, 27, 8, 87, 33, 49, 15, 58, 116], [95, 112, 57, 118, 91, 51, 42, 65, 45]]
それらをすべて解決する場合は、さらにお問い合わせください。:-)そして、サンドボックスにいる間にこの課題を改善するのを助けてくれた人々に感謝します。
1合理的な時間:ソリューションのテスト中に忍耐力を損なわない時間。TIOは60秒間だけコードを実行することに注意してください。その制限を超えると、マシンでコードをテストすることになります。例:かなり非効率的なアルゴリズムは、3x3および4x4の行列を解くのに数ミリ秒かかりますが、5x5行列でテストしたところ、317秒かかりました(500万回以上の動きで、非常に面白い解く行列は10K回しかスクランブルされていませんでした)。動きの数を10K未満に減らしようとしましたが、コードを実行して30分後に降伏しました。
O(input size)
か?5x5マトリックスの場合はO(25)
どうでしょうか?それは非常に速いようですので、私はそのアルゴリズムやあなたの実装を非常に興味があります。編集:「スクランブルされた」マトリックスを入力し、動きを出力することを理解していますか?その逆ではありません。