ラテン方陣は、X列またはY列のいずれにも繰り返されるシンボルがない正方形です。例えば:
ABCD
DABC
CDAB
BCDA
そのような正方形の一つです。すべての列と行に同じ4文字の順列が含まれていることに注意してください。
しかし、ラテン方陣には問題があります 。2番目の行(DABC
)1を左に回転させるとABCD
、上の順列と同一ので終わることになります。1列/行を回転して別の列/行を取得する ことが不可能な場合、正方形は回転しても安全であると見なします。
例えば:
ABCD
BDAC
CADB
DCBA
回転は安全です。グリッドには次のプロパティがあります。
- ポイント[0、N]はN番目のシンボルを使用します
- ポイント[0、N]と[N、0]は常に同じシンボルです。([x、y]と[y、x]も常に同じ文字であると言いたいのですが、証明できません)
あなたの仕事は、N を渡したときに1つの回転安全なラテン方陣を印刷することです。文字、数字、リスト、または2D配列を出力してもかまいません。 数字を使用する場合、一番上の列と行は0,1,2,3,...
(この順序で)なければなりません。文字を使用する場合は、A,B,C,D,....
たとえば、入力が4の場合、次のいずれかを印刷する必要があります。
0,1,2,3 0,1,2,3
1,3,0,2 or 1,0,3,2
2,0,3,1 2,3,1,0
3,2,1,0 3,2,0,1
サイズが4未満の回転に対して安全なラテン方陣はありません。Nが4より小さい場合、プログラムが何をするかは気にしません。 2,5,5906,(too long to calculate)
これはコードゴルフですので、お気に入りの言語でできるだけ短く答えるようにしてください!
時間制限はありませんが、ソリューションの終了を保証する必要があります。
—
ネイサンメリル
1インデックス付き言語の場合、最初の行は
—
マイル
1,2,3,...
?
@マイルはい、それは結構です
—
ネイサンメリル
N
乱数品質が不十分であるために高い値で終了することが技術的に保証されていない場合、モンテカルロ法は許可されますか?)