回転に対して安全なラテン方格


12

ラテン方陣は、X列またはY列のいずれにも繰り返されるシンボルがない正方形です。例えば:

ABCD    
DABC
CDAB
BCDA

そのような正方形の一つです。すべての列と行に同じ4文字の順列が含まれていることに注意してください。

しかし、ラテン方陣には問題があります 。2番目の行(DABC)1を左に回転させるとABCD、上の順列と同一ので終わることになります。1列/行を回転して別の列/行を取得する ことが不可能な場合、正方形は回転しても安全であると見なします

例えば:

ABCD
BDAC
CADB
DCBA

回転は安全です。グリッドには次のプロパティがあります。

  1. ポイント[0、N]はN番目のシンボルを使用します
  2. ポイント[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)

これはですので、お気に入りの言語でできるだけ短く答えるようにしてください!


制限時間はありますか?(関連:N乱数品質が不十分であるために高い値で終了することが技術的に保証されていない場合、モンテカルロ法は許可されますか?)
ドアノブ

時間制限はありませんが、ソリューションの終了を保証する必要があります。
ネイサンメリル

1
1インデックス付き言語の場合、最初の行は1,2,3,...
マイル


@マイルはい、それは結構です
ネイサンメリル

回答:



2

SQLServer 2012-918バイト

私のボックスでは、これは@k = 5で実行されますが、16秒かかります。

これはコード構築コードです(Skynetに注意してください、競争があります)

最長のスクリプトの価格はありますか?

DECLARE @k int = 4;

DECLARE @t VARCHAR(max)='WITH C as(SELECT
top '+left(@k,1)+'row_number()over(order by 1/0)n
FROM sys.messages),D(nÆ)as(SELECT
concat(~),~
FROM Ø
WHERE |)SELECT top 1~ FROM Å
WHERE 1=1',@
varchar(999)=''SELECT @+=','+CHAR(x+65)FROM(values(0),(1),(2),(3),(4),(5))x(x)WHERE x<@k
SELECT
@t=REPLACE(REPLACE(REPLACE(REPLACE(@t,'Æ',@),'Ø',STUFF(REPLACE(@,',',',C '),1,1,'')),'Å',STUFF(REPLACE(@,',',',D
'),1,1,'')),'~',STUFF(REPLACE(@,',','.n,'),1,3,'')+'.n'),@='';WITH C as(SELECT top(@k)x
FROM(values(0),(1),(2),(3),(4),(5))x(x))SELECT @+=' AND
'+char(65+C.x)+'.n<>'+char(65+D.x)+'.n'FROM c,c d WHERE C.x<D.x
SELECT @t=REPLACE(@t,'|',STUFF(@,1,4,''));WITH A
as(SELECT top(@k)x
FROM(values(65),(66),(67),(68),(69),(70))x(x))SELECT @t+='AND
'+char(A.x)+'.'+char(C.x)+'<>'+CHAR(B.x)+'.'+char(C.x)+' AND
'+char(A.x)+'.n+'+char(A.x)+'.n'+'
not like''%''+'+char(B.x)+'.n+''%'''FROM A,A B,A C
WHERE A.x<>B.x and C.x<>B.x
EXEC(@t)

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.