Avertissement: je ne connais aucune solution non bruteforce
Un carré gréco-latin est, pour deux ensembles de même longueur , un arrangement de cellules, chacune contenant une paire unique (sur l'ensemble du carré) d'un élément du premier ensemble et d'un élément du deuxième ensemble, de telle sorte que tous les premiers éléments et tous les seconds éléments des paires sont uniques dans leur ligne et leur colonne. Les ensembles les plus couramment utilisés sont, comme on pourrait le deviner, les premières lettres des alphabets grec et latin.
Voici une photo d'un carré gréco-latin 4x4:
Les carrés gréco-latins sont aussi utiles qu'ils le paraissent ( l'article de Wikipédia mentionne "la conception d'expériences, la programmation de tournois et la construction de carrés magiques"). Votre tâche est, étant donné un entier positif , de générer un carré gréco-latin .
Contribution
Un entier positif ; il est garanti qu'il existe carré gréco-latin (c'est-à-dire ).
Sortie
Un carré gréco-latin de longueur latérale n sous forme de tableau à deux dimensions, un tableau de tableaux, un tableau aplati ou directement émis.
Remarques
- Vous n'êtes pas obligé d'utiliser spécifiquement les alphabets grec et latin; par exemple, la sortie de paires d'entiers positifs est également autorisée.
- Si vous choisissez d'utiliser un alphabet qui ne peut pas être étendu arbitrairement, vous devez (théoriquement; votre code n'a pas à se terminer avant la mort thermique de l'univers) supporter une longueur de côté maximale d'au moins 20.
C'est le code-golf , donc le code le plus court gagne!
Réponses:
Gelée ,
2120 octets-1 grâce à Nick Kennedy (l'option de sortie plate permet une sauvegarde d'octets de→
ż"þ`ẎẎQƑ$Ƈ
F€p`Z€QƑƇ
)Essayez-le en ligne! (Trop lent pour
4
dans les années 60 sur TIO, mais si nous remplaçons la puissance cartésienneṗ
, avec des combinaisonsœc
, cela se terminera - bien que 5 ne le sera certainement pas!)Comment?
la source
05AB1E ,
262322 octets-3 octets grâce à Emigna
-1 octet grâce à Kevin Cruijssen
Essayez-le en ligne!
la source
n<ÝI‰
peut être<Ýã
<Ý
peut l'êtreL
. Merci!ê}DIùQ
peut êtreÙgQ}P
de sauvegarder un octet.R ,
164148 octets-de nombreux octets grâce à Giuseppe.
Essayez-le en ligne!
Dramatiquement inefficace - je pense que c'est encore pire que les autres approches par force brute. Même pour
n=3
, il s'arrêtera probablement sur TIO. Voici une version alternative (155 octets) qui fonctionnen=3
en environ 1 seconde.m
l
g
all(1:n^2%in%(n*l+g-n))
l
g
l
etg
carrés latins?!
l
g
2^l
l
t(l)
l
g
sd
Une dernière note: comme souvent en R code golf, j'ai utilisé la variable
T
, qui est initialisée commeTRUE
, pour gagner quelques octets. Mais cela signifie que lorsque j'ai eu besoin de la valeur réelleTRUE
dans la définition dem
(paramètrereplace
danssample
), j'ai dû utiliser à la1
place deT
. De même, comme je redéfinis!
comme une fonction différente de la négation, j'ai dû utiliser à la1-all(...)
place de!all(...)
.la source
JavaScript (ES6),
159 147140 octetsIl s'agit d'une simple recherche par force brute, et donc très lente.
Essayez-le en ligne! (avec sortie prettifiée)
Commenté
la source
o
non plus; vous pouvez simplement revenirm
à la fin pour 141Haskell ,
207 143233 octetsEssayez-le en ligne!
OK, je pense que j'ai finalement compris cette fois. Cela fonctionne très bien pour n = 5, n = 6 fois sur TIO mais je pense que cela pourrait être juste parce que ce nouvel algorithme est INCROYABLEMENT inefficace et vérifie essentiellement toutes les possibilités jusqu'à ce qu'il en trouve une qui fonctionne. J'exécute n = 6 sur mon ordinateur portable maintenant pour voir s'il se termine avec un peu plus de temps.
Merci encore à @someone d'avoir signalé les bugs dans mes versions précédentes
la source
C #,
520506494484 octetsL'algorithme de recherche d'un carré est très simple. C'est ... bruteforce. Ouais, c'est stupide, mais le golf de code ne concerne pas la vitesse d'un programme, non?
Le code avant de le raccourcir:
Maintenant, si vous voulez le tester avec n = 3, vous devrez attendre environ une heure, alors voici une autre version:
Mise à jour: oublié de supprimer "public".
Mise à jour: utilisé "Système". au lieu de "utiliser System;"; Merci également à Kevin Cruijssen d'avoir utilisé "a" au lieu de "args".
Mise à jour: merci à gastropner et à quelqu'un .
la source
args
peut êtrea
:)for(X = 0; X < Y; X++)
enfor(X = Y; X-->0; )
, ce qui devrait économiser un octet par boucle.i = 0
et définiri
un octet.System
. , Aussiif((m[i,j,k]=(m[i,j,k]+ 1) % n)!=0)
peut êtreif((m[i,j,k]=-~m[i,j,k]%n)>0)
.Write
ou pourrait économiser des octets en ajoutant\n
à la chaîne à l'intérieur de l'appel ou est autrement cassé. Je pense que vous pouvez également retourner un tableau directement.Octave , 182 octets
Méthode de la force brute, TIO continue de temporiser et j'ai dû l'exécuter plusieurs fois pour obtenir une sortie pour n = 3, mais théoriquement, cela devrait être bien. Au lieu de paires comme (1,2), il produit une matrice de conjugués complexes comme 1 + 2i. Cela pourrait étirer un peu la règle, mais à mon avis, cela correspond toujours aux exigences de sortie. Il doit y avoir un meilleur moyen de faire les deux lignes sous la déclaration functino, mais je ne suis pas sûr pour le moment.
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) , 123 octets
Essayez-le en ligne!
J'utilise la
TwoWayRule
notationTranspose[...,2<->4]
pour permuter les 2e et 4e dimensions d'un tableau; sinon, c'est assez simple.Non golfé:
la source
Python 3 ,
271267241 octetsApproche par force brute: générer toutes les permutations des paires jusqu'à ce qu'un carré gréco-latin soit trouvé. Trop lent pour générer quelque chose de plus grand que
n=3
sur TIO.Merci à alexz02 pour avoir joué au golf 26 octets et à plafond pour jouer au golf 4 octets.
Essayez-le en ligne!
Explication:
la source