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!


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


@ 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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.