旋转安全的拉丁方格


12

拉丁方是在X或Y列中没有重复符号的正方形。例如:

ABCD    
DABC
CDAB
BCDA

是一个这样的广场。请注意,每一列和每一行如何包含相同的4个字母的排列。

但是,我们的拉丁方有一个问题: 如果我将第二行(DABC)1向左旋转,我将得到ABCD,这与上面的排列相同。 如果不可能旋转任何一列/行并获得另一列/行,那么我们认为正方形是旋转安全的

例如:

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,我不在乎您的程序会做什么。出于好奇,旋转安全方数为(从4开始): 2,5,5906,(too long to calculate)

这是一个,所以请尝试使用您喜欢的语言尽可能短地回答!


有时间限制吗?(相关:如果N由于随机数质量不足而不能在技术上保证以较高的值终止它们,是否允许使用Monte Carlo方法?)
Doorknob

没有时间限制,但是您的解决方案一定可以终止。
内森·美林

1
对于1索引语言,第一行可以1,2,3,...吗?
英里


@miles是的,很好
Nathan Merrill

Answers:



2

SQLServer 2012-918字节

在我的盒子上,它运行@k = 5,尽管需要16秒。

这是代码构建代码(当心天网,有竞争)

最长的脚本需要付费吗?

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)

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.