Carrés latins à rotation sûre

12

Un carré latin est un carré qui n'a pas de symboles répétée soit dans la colonne X ou Y . Par exemple:

ABCD    
DABC
CDAB
BCDA

est un de ces carrés. Remarquez comment chaque colonne et ligne contient une permutation des mêmes 4 lettres.

Cependant, notre carré latin a un problème: si je tournais la deuxième ligne ( DABC) 1 vers la gauche, je me retrouverais avec ABCD, ce qui est identique à la permutation au-dessus. S'il est impossible de faire pivoter une colonne / ligne et d'obtenir une autre colonne / ligne, alors nous considérons que le carré est sûr pour la rotation .

Par exemple:

ABCD
BDAC
CADB
DCBA

la rotation est-elle sûre? La grille a les propriétés suivantes:

  1. Le point [0, N] utilise le Nième symbole
  2. Les points [0, N] et [N, 0] sont toujours le même symbole . (Je voudrais également dire que [x, y] et [y, x] sont également toujours la même lettre, mais je ne peux pas le prouver)

Votre tâche consiste à imprimer 1 carré latin à rotation sûre, une fois passé N. Je me fiche que vous produisiez des lettres, des chiffres, une liste ou un tableau 2D. Si vous utilisez des nombres, la colonne et la ligne du haut doivent être 0,1,2,3,...(dans cet ordre). Si vous utilisez des lettres, cela doit êtreA,B,C,D,....

Par exemple, si votre entrée était 4, vous devez soit imprimer:

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

Il n'y a pas de carrés latins à rotation sûre de taille inférieure à 4. Je me fiche de ce que fait votre programme si N est inférieur à 4. Pour les curieux, le nombre de carrés à rotation sûre est (à partir de 4): 2,5,5906,(too long to calculate)

Ceci est un , alors essayez de faire des réponses aussi courtes que possible dans votre langue préférée!

Nathan Merrill
la source
Y a-t-il un délai? (Connexes: les méthodes de Monte-Carlo sont-elles autorisées si elles ne sont techniquement pas garanties de se terminer pour des valeurs élevées en Nraison d'une qualité de nombre aléatoire insuffisante?)
Poignée de porte
Aucune limite de temps, mais votre solution doit être garantie de se terminer.
Nathan Merrill
1
Pour les langues indexées 1, la première ligne peut 1,2,3,...-elle être ?
miles
lié , lié
Abr001am
@miles oui, ça va
Nathan Merrill

Réponses:

2

SQL Server 2012 - 918 octets

Sur ma boîte, cela fonctionne pour @k = 5, même si cela prend 16 secondes.

C'est du code de construction de code (attention Skynet, vous avez de la concurrence)

Y a-t-il un prix pour le script le plus long?

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)

Essayez en ligne!

t-clausen.dk
la source