Isenção de responsabilidade: não conheço nenhuma solução que não seja da bruteforce
Um quadrado graeco-latino é, para dois conjuntos do mesmo comprimento , um arranjo de células, cada um contendo um par único (em todo o quadrado) de um elemento do primeiro conjunto e um elemento do segundo conjunto, de modo que todos os primeiros elementos e todos os segundos elementos dos pares sejam exclusivos em suas linhas e colunas. Os conjuntos mais comuns usados são, como se poderia imaginar, as primeiras letras dos alfabetos grego e latino.
Aqui está uma foto de uma praça greco-latina 4x4:
Os quadrados greco-latinos são tão úteis quanto parecem (o artigo da Wikipedia menciona "design de experimentos, programação de torneios e construção de quadrados mágicos"). Sua tarefa é, dado um número inteiro positivo , gerar um quadrado graeco-latino.
Entrada
Um número inteiro positivo ; é garantido que exista quadrado greco-latino (ou seja, ).
Saída
Um quadrado graeco-latino com comprimento lateral n como uma matriz bidimensional, uma matriz de matrizes, uma matriz achatada ou produzida diretamente.
Notas
- Você não precisa usar os alfabetos grego e latino especificamente; por exemplo, a saída de pares de números inteiros positivos também é permitida.
- Se você optar por usar um alfabeto que não pode ser estendido arbitrariamente, precisará (teoricamente; seu código não precisa terminar antes da morte pelo calor do universo) para suportar um comprimento máximo lateral de pelo menos 20.
Isso é código-golfe , então o código mais curto vence!
Respostas:
Geléia ,
2120 bytes-1 graças a Nick Kennedy (a opção de saída plana permite uma economia de bytes de )→
ż"þ`ẎẎQƑ$Ƈ
F€p`Z€QƑƇ
Experimente online! (Muito lento para os
4
anos 60 no TIO, mas se substituirmos o poder cartesianoṗ
, por Combinaçõesœc
, ele será concluído - embora 5 certamente não o seja!)Quão?
fonte
05AB1E ,
262322 bytes-3 bytes graças a Emigna
-1 byte graças a Kevin Cruijssen
Experimente online!
fonte
n<ÝI‰
pode ser<Ýã
<Ý
pode serL
. Obrigado!ê}DIùQ
pode serÙgQ}P
para salvar um byte.R ,
164148 bytes-muitos bytes graças a Giuseppe.
Experimente online!
Dramaticamente ineficiente - acho que é ainda pior do que outras abordagens de força bruta. Mesmo
n=3
assim, provavelmente o tempo limite será atingido no TIO. Aqui está uma versão alternativa (155 bytes) que funcionan=3
em cerca de 1 segundo.m
l
g
all(1:n^2%in%(n*l+g-n))
l
g
l
eg
quadrados latinos?!
l
g
2^l
l
t(l)
l
g
sd
Uma observação final: tantas vezes no código R do golfe, usei a variável
T
inicializada comoTRUE
para obter alguns bytes. Mas isso significa que, quando eu precisava do valor realTRUE
na definição dem
(parâmetroreplace
insample
), precisava usar em1
vez deT
. Da mesma forma, como estou redefinindo!
como uma função diferente da negação, tive que usar em1-all(...)
vez de!all(...)
.fonte
JavaScript (ES6),
159 147140 bytesEsta é uma pesquisa simples de força bruta e, portanto, muito lenta.
Experimente online! (com saída prettificada)
Comentado
fonte
o
; você pode simplesmente retornarm
no final para 141Haskell ,
207 143233 bytesExperimente online!
OK, acho que finalmente entendi desta vez. Ele funciona bem para n = 5, n = 6 vezes no TIO, mas acho que pode ser porque esse novo algoritmo é INCRÍVEL, ineficiente e basicamente verifica todas as possibilidades até encontrar um que funcione. Agora estou executando n = 6 no meu laptop para ver se ele termina com mais algum tempo.
Mais uma vez obrigado a @oneone por apontar os bugs nas minhas versões anteriores
fonte
C #,
520506494484 bytesO algoritmo de encontrar um quadrado é muito simples. É ... força bruta. Sim, é estúpido, mas o código de golfe não é sobre a velocidade de um programa, certo?
O código antes de torná-lo mais curto:
Agora, se você quiser testá-lo com n = 3, terá que esperar uma hora, então aqui está outra versão:
Atualização: esqueceu de remover "public".
Atualização: usado "Sistema". em vez de "using System;"; Além disso, graças a Kevin Cruijssen , usou "a" em vez de "args".
Atualização: graças a gastropner e alguém .
fonte
args
pode sera
:)for(X = 0; X < Y; X++)
parafor(X = Y; X-->0; )
, o que deve salvar um byte por loop.i = 0
a definiçãoi
e salvar um byte.System
. Além disso,if((m[i,j,k]=(m[i,j,k]+ 1) % n)!=0)
pode serif((m[i,j,k]=-~m[i,j,k]%n)>0)
.Write
ou pode salvar bytes adicionando\n
à cadeia de caracteres dentro da chamada ou está quebrado. Eu acho que você também pode retornar uma matriz diretamente.Oitava , 182 bytes
Método de força bruta, o TIO continua expirando e eu tive que executá-lo várias vezes para obter saída para n = 3, mas teoricamente isso deve ser bom. Em vez de pares como (1,2), gera uma matriz de conjugados complexos como 1 + 2i. Isso pode esticar um pouco a regra, mas, na minha opinião, ela ainda se ajusta aos requisitos de saída. Porém, deve haver uma maneira melhor de executar as duas linhas sob a declaração functino, mas não tenho certeza no momento.
Experimente online!
fonte
Wolfram Language (Mathematica) , 123 bytes
Experimente online!
Eu uso a
TwoWayRule
notaçãoTranspose[...,2<->4]
para trocar as 2ª e 4ª dimensões de uma matriz; caso contrário, isso é bastante direto.Ungolfed:
fonte
Python 3 ,
271267241 bytesAbordagem de força bruta: gere todas as permutações dos pares até encontrar um quadrado graeco-latino. Muito lento para gerar algo maior que
n=3
no TIO.Graças a alexz02 por jogar 26 bytes e ao ceilingcat por jogar 4 bytes.
Experimente online!
Explicação:
fonte