Drehsichere lateinische Quadrate

12

Ein lateinisches Quadrat ist ein Quadrat, das weder in der X- noch in der Y-Spalte wiederholte Symbole enthält . Beispielsweise:

ABCD    
DABC
CDAB
BCDA

ist ein solches Quadrat. Beachten Sie, dass jede Spalte und Zeile eine Permutation mit den gleichen 4 Buchstaben enthält.

Unser lateinisches Quadrat hat jedoch ein Problem: Wenn ich die zweite Zeile ( DABC) 1 nach links drehen würde, hätte ich das Ergebnis ABCD, das mit der darüber liegenden Permutation identisch ist. Wenn es unmöglich jede 1 Spalte / Zeile zu drehen , und eine weitere Spalte / Zeile zu erhalten, dann betrachten wir das Quadrat sein Rotation sicher .

Beispielsweise:

ABCD
BDAC
CADB
DCBA

ist rotationssicher. Das Raster hat folgende Eigenschaften:

  1. Punkt [0, N] verwendet das N-te Symbol
  2. Punkt [0, N] und [N, 0] sind immer dasselbe Symbol . (Ich möchte auch sagen, dass [x, y] und [y, x] immer der gleiche Buchstabe sind, aber ich kann es nicht beweisen.)

Ihre Aufgabe ist es, 1 rotationssicheres lateinisches Quadrat bei Übergabe von N auszudrucken. Es ist mir egal, ob Sie Buchstaben, Zahlen, eine Liste oder ein 2D-Array ausgeben. Wenn Sie Zahlen verwenden, müssen die oberste Spalte und Zeile 0,1,2,3,...(in dieser Reihenfolge) sein. Wenn Sie Buchstaben verwenden, muss es seinA,B,C,D,....

Wenn Ihre Eingabe beispielsweise 4 war, sollten Sie entweder Folgendes drucken:

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

Es gibt keine rotationssicheren lateinischen Quadrate mit einer Größe von weniger als 4. Es ist mir egal, was Ihr Programm tut, wenn N kleiner als 4 ist. Für die Neugierigen ist die Anzahl der rotationssicheren Quadrate (beginnend bei 4): 2,5,5906,(too long to calculate)

Dies ist ein , also versuchen Sie, die Antworten so kurz wie möglich in Ihrer Lieblingssprache zu halten!

Nathan Merrill
quelle
Gibt es eine zeitliche Begrenzung? (Verwandte: Sind Monte-Carlo-Methoden zulässig, wenn technisch nicht garantiert wird, dass sie bei hohen Werten enden, weil die NQualität der Zufallszahlen nicht ausreicht?)
Türknauf
Keine zeitliche Begrenzung, aber Ihre Lösung sollte garantiert enden.
Nathan Merrill
1
Kann bei 1-indizierten Sprachen die erste Zeile sein 1,2,3,...?
Meilen
verwandt , verwandt
Abr001am
@ Meilen ja, das ist in Ordnung
Nathan Merrill

Antworten:

2

SQL Server 2012 - 918 Bytes

Auf meiner Box läuft dies für @k = 5, obwohl es 16 Sekunden dauert.

Dies ist Code Building Code (Achtung Skynet, Sie haben Wettbewerb)

Gibt es einen Preis für das längste Drehbuch?

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)

Online versuchen!

t-clausen.dk
quelle