Desafio
Escreva um programa ou uma função que retorne ou imprima uma matriz simétrica quadrada aleatória.
Entrada
N : O tamanho da matriz, ou seja,6 x 6
Resultado
O Matrix. Você pode imprimi-lo, devolvê-lo como string (com as novas linhas) ou como uma lista / matriz de listas / matrizes.
Regras
Você precisa usar pelo menos
N
caracteres diferentes, ondeN
é o tamanho da matriz quadrada (entrada). Como estamos usando apenas as letras [a, z] [A, Z] e dígitos [0, 9] (e apenas 1 dígito de cada vez), você pode assumir issoN < 27
eN > 2
, isso porqueN <= 2
você não pode ter as duas letras e dígitos. Por último, mas não menos importante, toda letra / dígito deve ter uma probabilidade diferente de zero (a distribuição uniforme não é uma necessidade). No entanto, o resultado deve ter pelo menosN
letras / dígitos diferentes.A matriz deve ser horizontal e verticalmente simétrica.
Exatamente 2 linhas e 2 colunas devem conter estritamente um número de um dígito (sua posição também deve ser aleatória). O restante das linhas / colunas conterá apenas letras. Considere letras como [a, z] e [A, Z] e, claro, números de um dígito como [0, 9].
Só para ser mais fácil, você pode assumir que o caso das cartas não importa, contanto que os casos são simétricas que significa:
a=A, b=B, etc
.Toda saída possível deve ter uma probabilidade diferente de zero de ocorrer. A distribuição aleatória não precisa ser uniforme.
Exemplo
Entrada : 8
Saída :
c r p s s p r c
r k o z z o k r
u t 2 a a 2 t u
y n q z z q n y
y n q z z q n y
u t 2 a a 2 t u
r k o z z o k r
c r p s s p r c
Respostas:
Carvão , 30 bytes
Experimente online! Link é a versão detalhada do código. Se
n
for sempre par, então para 23 bytes:Experimente online! Link é a versão detalhada do código. Explicação:
Entrada .n
Crie um pornn2 matriz de letras minúsculas aleatórias. Isso imprime implicitamente como um quadrado.n2
Ir para uma posição aleatória no quadrado.
Imprima um dígito aleatório.
Reflita horizontalmente e verticalmente para completar a matriz.
fonte
R ,
124118 bytesExperimente online!
Em R, coisas que parecem operadores são apenas funções que recebem tratamento especial do analisador.
Se você redefinir um operador (como
-
) para ser alguma outra função, ele mantém o tratamento especial do analisador. Como-
é o prefixo e o infixo, e eu preciso chamar asample
função com um e dois argumentos, eu posso usarpara conseguir o que eu quero.
Portanto, o código
-letters
é traduzido parasample(letters)
, que aleatoriamente embaralha oletters
built-in. Masj-1
é traduzido parasample(j,1)
, que faz uma amostragem aleatória do1
item do vetor1:j
.(Esse comportamento da
sample
função, dependendo do número de parâmetros e qual é o primeiro parâmetro, é um grande problema no código de produção, por isso estou feliz em encontrar um ótimo uso de sua natureza perversa aqui!)Caso contrário, o código só faz o quadrante superior esquerdo do resultado necessário, substitui um elemento aleatório (o
j-1
,j-1
bit) com um dígito aleatório (o0:9-1
bit), e dobra-lo para a simetria necessário. Oi
e oj
são necessários para lidar com os casos pares e ímpares.fonte
Python3, 287 bytes
Minha primeira tentativa de jogar algo aqui; Tenho certeza que alguém pode fazer muito melhor:
Experimente Online!
Graças ao HyperNeurtrino, Ourous e Heiteria, isso reduziu para 193 bytes (ver comentários). No entanto, TFeld apontou corretamente que várias chamadas para
sample
não estão garantindo pelo menosN
caracteres diferentes.Com isso em mente, tente esta nova versão que deve garantir pelo menos
N
caracteres diferentes por execução.Python3,
265260 bytes, pelo menosN
caracteres distintosExperimente online!
fonte
a[:-1][::-1]
é fundamentalmente equivalente aa[:-2::-1]
, e você pode importarrandom
como emr
vez dern
e pode mover ofor
loop para uma expressão embutida. Experimente Online!math
importação usando, em-(-a // 2)
vez domath.ceil(a / 2)
que é basicamente div negativo do piso (teto efetivamente). tio.run/##XY7LagMxDEX3/…sample()
s não garantem que você obtenha pelo menosN
caracteres diferentes. Eu consegui[['g', 'x', 'x', 'g'], [7, 'x', 'x', 7], [7, 'x', 'x', 7], ['g', 'x', 'x', 'g']]
paraN=4
, que tem apenas 3 caracteres distintosAPL (Dyalog Classic) ,
45444340 bytesthanks @ Adám por -1 byte
Experimente online!
usa
⌈
(max) da matriz com seus reflexos para torná-la simétrica; portanto, é inclinado para a última parte do alfabetoo dígito é escolhido uniformemente de 0 a 25 mod 10, portanto, possui um pequeno viés para valores mais baixos
fonte
⌊2⍴⍵÷2)?⍵ ⍵⍴26]}
→⌊⍺⍵÷2)?⍺⍵⍴26]}⍨
⌊⍺⍵÷2
→⍺⍵
.Japt , 31 bytes (posição de dígito fixo)
Experimente online!
Japt , 41 bytes (posição de dígito aleatório)
Experimente online!
Explicação
fonte
Python 2 , 259 bytes
Experimente online!
fonte
05AB1E ,
294038 bytes+11 bytes para corrigir o dígito estar em uma posição aleatória enquanto ainda mantém a regra de 3 em mente para entradas ímpares ..
-2 bytes graças a @MagicOctopusUrn , mudando
îï
paraò
e mudando a posição do»
.Experimente on-line para verificar mais alguns casos de teste .
Resposta antiga (
2927 bytes ) onde o dígito está sempre nos cantos:Experimente online ou verifique mais alguns casos de teste .
Explicação:
fonte
»
ï
foi feito implicitamente. Infelizmente, isso não se aplica à versão de 40 bytes, porque∊
seria inserida em vez de substituída.2
, a entrada é garantida3 <= N <= 26
.n
letras do alfabeto, em vez den
letras aleatórias do alfabeto. E primeiro ingressar em novas linhas e só então fazer os espelhos economiza um byte também no meu. Obrigado por -2 bytes! :) PS: Um byte pode ser salvo no seu 28-byter removendo o final}
. :)C (GCC) ,
198197196 bytesEconomizou 2 bytes graças ao ceilingcat.
Experimente online!
Explicação:
fonte
JavaScript (ES6),
213209206 bytesExperimente online!
Comentado
fonte
Limpo ,
346312 bytesvai jogar mais amanhã
Experimente online!
fonte
Python 3 , 197 bytes
Conforme mencionado por @Emigna, não funciona com valores ímpares de
N
(não entendi a pergunta corretamente)Experimente online!
Eu acho que as chamadas para o
randint()
+sample()
+shuffle()
são demais, e seria ótimo se livrar do embaralhamento no local :)Tenho certeza de que essa parte (que seleciona as letras e o dígito) pode ser um pouco mais jogada.
fonte
N
.N
que sempre seria igual, já que eu não entendo como a matriz pode ser simétrica se for estranha!Python 2 ,
275266 bytesExperimente online!
Retorna a matriz como uma lista de listas de caracteres. Para satisfazer a Regra 1, montamos um conjunto de caracteres:
O próximo passo complicado é a regra 3: deve haver exatamente 2 colunas e linhas com um dígito; isso significa para
n
ímpar, que o dígito escolhido pode não aparecer na coluna do meio ou na linha do meio. Como construímos a matriz usando uma sub-matriz quadrada refletida duas vezess
, isso é feito aqui usando:ou seja, embaralhe pelo menos uma vez; e, se
n
for ímpar, continue em loop se o dígito estiver na última coluna ou na última linha des
.fonte
Pitão , 48 bytes
Experimente online aqui .
O programa está dividido em 3 partes - definição da função de palindromização, escolhendo o local da função numérica e principal.
O uso de vários alfabetos aleatórios deve garantir que o número de caracteres exclusivos seja sempre maior que o número de entrada.
fonte
Python 2 / Python 3, 227 bytes
ungolfing um pouco:
Versões mais antigas e quase corretas abaixo:
Python2, Python3, 161 bytes
Parece que N elementos diferentes são apenas quase garantidos.
Python 2 / Python 3, 170 bytes
Parece que eu esqueci a regra 3. Também de alguma forma o [: n * n] entrou.
fonte
n = 3
você nunca terá uma saída contendo a'z'
, portanto, nem toda saída é possível).