Безопасные для вращения латинские квадраты

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] также всегда являются одной и той же буквой, но я не могу доказать это)

Ваша задача - распечатать 1 латинский квадрат, безопасный для вращения, когда передано N. Мне все равно, выводите ли вы буквы, цифры, список или двумерный массив. Если вы используете числа, верхний столбец и строка должны быть 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за недостаточного качества случайных чисел?)
Ручка
Нет ограничений по времени, но ваше решение должно быть гарантировано прекращено.
Натан Меррилл
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)

Попробуйте онлайн!

t-clausen.dk
источник