記述キーワード(検索用):2つの行列を同等にする、重複、配列、検索
チャレンジ
サンタは過去にエルフがボールトからプレゼントを盗んだという歴史があったため、今年は非常に割れにくいロックを設計し、今年はエルフを締め出したようです。残念ながら、彼は組み合わせを失い、それを開く方法もわかりません!幸いなことに、彼はあなたにその組み合わせを見つけるプログラムを書くように依頼しました。それは最短のものである必要はありませんが、できるだけ早く見つける必要があります!
彼には非常に厳しいスケジュールがあり、非常に長い間待つ余裕はありません。スコアは、プログラムの合計ランタイムに、スコアリング入力に対してプログラムが出力するステップ数を掛けたものになります。最低スコアが勝ちます。
仕様書
ロックは1と0の正方行列です。1と0のランダムな配置に設定され、指定されたコードに設定する必要があります。幸いなことに、サンタは必要なコードを覚えています。
彼が実行できるいくつかのステップがあります。各ステップは任意の連続したサブマトリックスで実行できます(つまり、左上隅と右下隅で完全に囲まれているサブマトリックスを選択する必要があります)(非正方形のサブマトリックスにすることができます):
- 右に90度回転*
- 左に90度回転*
- 180度回転
- 各行
n
要素を右または左に循環(ラップ) - 各列
m
要素を上下に循環(ラップ) - 水平に反転
- 垂直に反転
- 主対角線で反転*
- メインの対角線を反転*
*サブマトリックスが正方形の場合のみ
もちろん、彼はマトリックス全体でこれらのステップを実行することもできます。1と0はマトリックス上でのみ交換できますが、正方形の値は直接変更できないため、1と0の数は開始構成と終了構成で同じです。
フォーマット仕様とルール
入力は、必要な妥当な形式の2つの正方行列(開始位置と終了位置)として与えられます。出力は、読み取り可能な形式のこれらの手順のシーケンスである必要があります。これはコードゴルフではないので、簡単に検証可能な形式にしてください。しかし、それは厳密な要件ではありません。必要に応じて、入力の行列の辺の長さを選択できます。
あなたのプログラムは私のコンピューターで実行され(Linux Mint、誰かが気にするならリクエストに応じて正確なバージョンの詳細が利用可能です:P)、コマンドラインで「Enter」を押してからコマンドが終了します。
テストケース
1 0 0 1 0 0 0 0
0 1 1 0 -> 0 0 0 0
0 1 1 0 -> 1 1 1 1
1 0 0 1 1 1 1 1
- マトリックス全体を取得します。各列を上に移動します1。
- 中央の2列をサブマトリックスとして取ります。各列を下に循環2。
1 0 1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1 0 1
1 0 1 0 1 -> 0 1 1 1 0
0 1 0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0 1 0
- マトリックス全体を取得します。各列を下に循環させます1。
- 中央の列を取ります。サイクルダウン2。
- 上位2行を取得します。垂直に反転します。
- 一番上の行の右端の2つの要素を取得します。それらを交換します(右/左1回転、水平反転)。
- 一番上の行の左端の2つの要素を取得します。それらを交換します。
より効率的な方法があるかもしれませんが、それは問題ではありません。コメントを見つけたら、コメントでそれらを指摘してください:)
テストケースの判定
このテストケースは、提出物の判断に使用されます。回答がテストケースに特化していると考える場合、ランダムな入力を取り戻し、新しいケースですべての回答を再判断する権利があります。テストケースはここで見つけることができます。ここで、上部が開始で、下部が目的の構成です。
答えがあまりにも専門化されていると思う場合、次のテストケースのMD5は3c1007ebd4ea7f0a2a1f0254af204eed
です。(これは、不正行為の告発から自分自身を解放するために今ここに書かれています:P)
標準の抜け穴が適用されます。回答は受け付けられません。ハッピーコーディング!
注:Advent Of Codeからこのチャレンジシリーズのインスピレーションを引き出しました。このサイトに所属していない
0
と641
があり、256 choose 64 ≈ 1.9 × 10⁶¹
到達可能な合計マトリックスがあります。(ただしはるかに少ない教授のキューブよりメガミンクスと同等であり、ルービックリベンジよりも大きい)