Латинські квадрати, захищені від обертання


12

Латинський квадрат представляє собою квадрат , який не повторюється символи або X або Y стовпців . Наприклад:

ABCD    
DABC
CDAB
BCDA

є одним таким квадратом. Зверніть увагу, як кожен стовпець і рядок містить перестановку з тих же 4 літер.

Однак у нашого латинського квадрата є проблема: якби я повернув другий рядок ( DABC) 1 ліворуч, я б закінчився ABCD, що ідентично перестановці над ним. Якщо неможливо обернути жоден 1 стовпчик / рядок і отримати інший стовпець / рядок, тоді ми вважаємо квадрат безпечним для обертання .

Наприклад:

ABCD
BDAC
CADB
DCBA

безпечне обертання. Сітка має такі властивості:

  1. Точка [0, N] використовує N-й символ
  2. Точки [0, N] і [N, 0] завжди є одним і тим же символом . (Я також хотів би сказати, що [x, y] і [y, x] - теж завжди одна і та сама літера, але я не можу це довести)

Ваше завдання - роздрукувати 1 безпечний для обертання латинський квадрат, коли він пройшов N. Мені все одно, чи виводите букви, цифри, список або 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через недостатню якість випадкових чисел?)
Doorknob

Немає обмежень у часі, але ваше рішення має бути гарантовано припинене.
Натан Меррілл

1
Для 1-індексованих мов може бути перший рядок 1,2,3,...?
милі


@miles так, це добре
Натан Меррілл

Відповіді:



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)

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.