Haftungsausschluss: Mir sind keine Lösungen bekannt, die keine Bruteforce-Lösungen sind
Ein Graeco-Latin-Quadrat ist für zwei Sätze gleicher Länge eine Anordnung von Zellen, die jeweils ein eindeutiges (über das gesamte Quadrat verteiltes) Paar eines Elements des ersten Satzes und eines Elements des zweiten Satzes enthalten, z dass alle ersten Elemente und alle zweiten Elemente der Paare in ihrer Zeile und Spalte eindeutig sind. Die gebräuchlichsten Mengen sind, wie man ahnen könnte, die ersten Buchstaben des griechischen und des lateinischen Alphabets.
Hier ist ein Bild eines 4x4 Graeco-Latin Quadrats:
Graeco-Latin-Quadrate sind so nützlich wie sie klingen (der Wikipedia-Artikel erwähnt "Design von Experimenten, Turnierplanung und Konstruktion magischer Quadrate"). Ihre Aufgabe ist es, mit einer positiven ganzen Zahl ein Graeco-Latin-Quadrat zu generieren .
Eingang
Eine positive ganze Zahl ; Es ist garantiert, dass ein Graeco-Latin-Quadrat existiert (also ).
Ausgabe
Ein Graeco-Latin-Quadrat mit der Seitenlänge n als zweidimensionales Array, Array von Arrays, abgeflachtes Array oder direkt ausgegeben.
Anmerkungen
- Sie müssen das griechische und das lateinische Alphabet nicht speziell verwenden. Beispielsweise ist die Ausgabe von Paaren positiver Ganzzahlen ebenfalls zulässig.
- Wenn Sie ein Alphabet verwenden, das nicht willkürlich erweitert werden kann, müssen Sie (theoretisch: Ihr Code muss nicht vor dem Hitzetod des Universums fertig sein) eine maximale Seitenlänge von mindestens 20 unterstützen.
Das ist Code-Golf , also gewinnt der kürzeste Code!
Antworten:
Jelly ,
21 bis20 Bytes-1 dank Nick Kennedy (Flat-Output-Option ermöglicht eine Byte-Speicherung von→
ż"þ`ẎẎQƑ$Ƈ
F€p`Z€QƑƇ
)Probieren Sie es online! (Für
4
TIO in den 60ernzu langsam, aber wenn wir die kartesische Potenzṗ
durch Combinationsersetzen,œc
wird sie vervollständigt - obwohl 5 sicherlich nicht!)Wie?
quelle
05AB1E ,
262322 Bytes-3 Bytes dank Emigna
-1 Byte dank Kevin Cruijssen
Probieren Sie es online!
quelle
n<ÝI‰
kann sein<Ýã
<Ý
kann seinL
. Vielen Dank!ê}DIùQ
kann seinÙgQ}P
, ein Byte zu speichern.R ,
164148 Bytes-viele Bytes dank Giuseppe.
Probieren Sie es online!
Dramatisch ineffizient - ich denke, es ist noch schlimmer als andere Brute-Force-Ansätze. Selbst für
n=3
TIO wird es wahrscheinlich eine Zeitüberschreitung geben. Hier ist eine alternative Version (155 Bytes), dien=3
in etwa 1 Sekunde funktioniert .Arbeitet durch Ablehnung. Die Funktion1 und n (ohne zu erzwingen, dass jede Ganzzahl genau erscheint)n
m
zeichnet eine zufällige Ganzzahlmatrix zwischenl
g
all(1:n^2%in%(n*l+g-n))
: Gibt esl
g
l
undg
lateinische Quadrate?!
l
g
2^l
l
t(l)
l
g
sd
Eine letzte Anmerkung: Wie so oft beim R-Code-Golf habe ich die Variable
T
, die initialisiert wirdTRUE
, verwendet, um ein paar Bytes zu gewinnen. Das bedeutet aber, dass ich, als ich den tatsächlichen WertTRUE
in der Definition vonm
(parameterreplace
insample
) benötigte,1
anstelle von verwenden mussteT
. Ebenso musste ich, da ich!
als eine von der Negation verschiedene Funktion neu definiere ,1-all(...)
statt verwenden!all(...)
.quelle
JavaScript (ES6),
159 147140 ByteDies ist eine einfache Brute-Force-Suche und daher sehr langsam.
Probieren Sie es online!(mit schönem Ausgang)
Kommentiert
quelle
o
auch nicht. Sie können nurm
am Ende für 141Haskell ,
207 143233 BytesProbieren Sie es online!
OK, ich glaube, ich habe es dieses Mal endlich geschafft. Es funktioniert gut für n = 5, n = 6 mal auf TIO, aber ich denke, das könnte nur daran liegen, dass dieser neue Algorithmus UNGLAUBLICH ineffizient ist und im Grunde alle Möglichkeiten überprüft, bis er eine findet, die funktioniert. Ich starte jetzt n = 6 auf meinem Laptop, um zu sehen, ob es mit etwas mehr Zeit endet.
Nochmals vielen Dank an @someone für den Hinweis auf die Fehler in meinen vorherigen Versionen
quelle
C #,
520506494484 BytesDer Algorithmus zum Finden eines Quadrats ist sehr einfach. Es ist ... Bruteforce. Ja, es ist dumm, aber beim Codegolf geht es nicht um die Geschwindigkeit eines Programms, oder?
Der Code vor der Verkürzung:
Wenn Sie es nun mit n = 3 testen möchten, müssen Sie eine Stunde warten. Hier ist eine andere Version:
Update: vergessen, "public" zu entfernen.
Update: verwendet "System". anstelle von "using System;"; Dank Kevin Cruijssen wurde auch "a" anstelle von "args" verwendet.
Update: Danke an Gastropner und jemanden .
quelle
args
kann seina
:)for(X = 0; X < Y; X++)
nach transformiert werdenfor(X = Y; X-->0; )
, wodurch ein Byte pro Schleife eingespart werden sollte.i = 0
definiereni
und speichern.System
. Auchif((m[i,j,k]=(m[i,j,k]+ 1) % n)!=0)
kannif((m[i,j,k]=-~m[i,j,k]%n)>0)
.Write
Bytes verwenden sollte oder speichern könnte, indem\n
es der Zeichenfolge innerhalb des Aufrufs hinzugefügt wird , oder es ist auf andere Weise defekt. Ich denke, Sie können ein Array auch direkt zurückgeben.Oktave , 182 Bytes
Bei der Brute-Force-Methode läuft TIO immer aus und ich musste es einige Male ausführen, um die Ausgabe für n = 3 zu erhalten, aber theoretisch sollte dies in Ordnung sein. Anstelle von Paaren wie (1,2) wird eine Matrix komplexer Konjugate wie 1 + 2i ausgegeben. Dies könnte die Regel ein wenig ausdehnen, aber meiner Meinung nach entspricht es nicht den Ausgabeanforderungen. Es muss einen besseren Weg geben, die beiden Zeilen unter der Funktino-Deklaration zu machen, aber ich bin mir im Moment nicht sicher.
Probieren Sie es online!
quelle
Wolfram Language (Mathematica) , 123 Byte
Probieren Sie es online!
Ich benutze die
TwoWayRule
NotationTranspose[...,2<->4]
, um die 2. und 4. Dimension eines Arrays zu vertauschen. ansonsten ist das ziemlich einfach.Ungolfed:
quelle
Python 3 ,
271267241 BytesBrute-Force-Ansatz: Generieren Sie alle Permutationen der Paare, bis ein Graeco-Latin-Quadrat gefunden wird. Es ist zu langsam, um etwas Größeres als
n=3
bei TIO zu generieren .Danke an alexz02 für das Golfen mit 26 Bytes und an ceilingcat für das Golfen von 4 Bytes.
Probieren Sie es online!
Erläuterung:
quelle