Desafío
Escriba un programa o una función que devuelva o imprima una matriz simétrica aleatoria cuadrada.
Entrada
N : el tamaño de la matriz, es decir6 x 6
Salida
La matriz. Puede imprimirlo, devolverlo como una cadena (con las nuevas líneas) o como una lista / matriz de listas / matrices.
Reglas
Debe usar al menos
Ncaracteres diferentes, dondeNes el tamaño de la matriz cuadrada (entrada). Como estamos usando solo la letra [a, z] [A, Z] y los dígitos [0, 9] (y solo 1 dígito a la vez), puede suponer esoN < 27yN > 2, eso es porqueN <= 2no puede tener ambas letras y dígitos. Por último, pero no menos importante, cada letra / dígito debe tener una probabilidad distinta de cero (la distribución uniforme no es una necesidad). Sin embargo, el resultado debe tener al menosNletras / dígitos diferentes.La matriz tiene que ser simétrica tanto horizontal como verticalmente.
Exactamente 2 filas y 2 columnas deben contener estrictamente un número de un solo dígito (su posición también debe ser aleatoria). El resto de filas / columnas contendrá solo letras. Considere letras como [a, z] y [A, Z] y, por supuesto, números de un solo dígito como [0, 9].
Para que quede más fácil, se puede asumir que el caso de las letras no importa, siempre y cuando los casos son simétricas cuyos medios:
a=A, b=B, etc.Cada salida posible debe tener una probabilidad distinta de cero. La distribución aleatoria no necesita ser uniforme.
Ejemplo
Entrada : 8
Salida :
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

Respuestas:
Carbón , 30 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Si
nsiempre es par, entonces para 23 bytes:Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Entrada .n
Crea una pornn2 n2 matriz de letras minúsculas al azar. Esto se imprime implícitamente como un cuadrado.
Salta a una posición aleatoria en el cuadrado.
Imprime un dígito al azar.
Refleje horizontal y verticalmente para completar la matriz.
fuente
R ,
124118 bytesPruébalo en línea!
En R, las cosas que parecen operadores son solo funciones que reciben un tratamiento especial del analizador.
Si redefine a un operador (como
-) para que sea otra función, mantiene el tratamiento especial del analizador. Como-es a la vez prefijo e infijo, y necesito llamar a lasamplefunción con uno y dos argumentos, puedo usarpara conseguir lo que quiero
Entonces el código
-lettersse traduce asample(letters), lo que aleatoriamente baraja ellettersincorporado. Peroj-1se traduce ensample(j,1), que muestra aleatoriamente un1elemento del vector1:j.(Este comportamiento de la
samplefunción, dependiendo de la cantidad de parámetros y cuál es el primer parámetro, es una gran molestia en el código de producción, ¡así que estoy feliz de encontrar un gran uso de su naturaleza perversa aquí!)De lo contrario, el código sólo hace que el cuadrante superior izquierdo del resultado requerido, reemplaza un elemento aleatorio (el
j-1,j-1bits) con un dígito al azar (el0:9-1bit), y se pliega hacia fuera para la simetría requerida. Eliy eljson necesarios para tratar los casos pares e impares.fuente
Python3, 287 bytes
Mi primer intento de jugar al golf aquí; Estoy seguro de que alguien puede hacerlo mucho mejor:
Pruébalo en línea!
Gracias a HyperNeurtrino, Ourous y Heiteria, esto se redujo a 193 bytes (ver comentarios). Sin embargo, TFeld señaló correctamente que varias llamadas a
sampleno garantizan al menosNcaracteres diferentes.Con eso en mente, pruebe esta nueva versión que debería garantizar al menos
Ndiferentes caracteres por ejecución.Python3,
265260 bytes, al menosNcaracteres distintosPruébalo en línea!
fuente
a[:-1][::-1]es fundamentalmente equivalente aa[:-2::-1], y puede importarrandomcomo enrlugar dern, y puede mover elforbucle a una expresión en línea. ¡Pruébelo en línea!mathimportación utilizando en-(-a // 2)lugar de lomath.ceil(a / 2)que es básicamente negativo floor-div de lo negativo (efectivamente techo). tio.run/##XY7LagMxDEX3/…sample()s no garantizan que obtenga al menosNcaracteres diferentes. He conseguido[['g', 'x', 'x', 'g'], [7, 'x', 'x', 7], [7, 'x', 'x', 7], ['g', 'x', 'x', 'g']]paraN=4, que sólo tiene 3 caracteres distintosAPL (Dyalog Classic) ,
45444340 bytesgracias @ Adám por -1 byte
Pruébalo en línea!
usa
⌈(max) de la matriz con sus reflejos para hacerla simétrica, por lo que está sesgada hacia la última parte del alfabetoel dígito se elige uniformemente entre 0 ... 25 mod 10, por lo que tiene un pequeño sesgo para valores más bajos
fuente
⌊2⍴⍵÷2)?⍵ ⍵⍴26]}→⌊⍺⍵÷2)?⍺⍵⍴26]}⍨⌊⍺⍵÷2→⍺⍵.Japt , 31 bytes (posición de dígito fijo)
Pruébalo en línea!
Japt , 41 bytes (posición de dígitos aleatorios)
Pruébalo en línea!
Explicación
fuente
Python 2 , 259 bytes
Pruébalo en línea!
fuente
05AB1E ,
294038 bytes+11 bytes para fijar el dígito estar en una posición al azar mientras que todavía mantiene la regla de 3 en cuenta para las entradas impares ..
-2 bytes gracias a @MagicOctopusUrn , cambiando
îïaòy el cambio de la posición de la».Pruébelo en línea de verificar algunos casos más de prueba .
La respuesta anterior (
2927 bytes ) donde las posiciones de los dígitos siempre estaban en las esquinas:Pruébelo en línea o verifique algunos casos de prueba más .
Explicación:
fuente
»ïse hizo implícitamente. Desafortunadamente, esto no se aplica a la versión de 40 bytes porque∊se insertaría en lugar de reemplazar.2, se garantiza que la entrada sea3 <= N <= 26.nletras del alfabeto, en lugar denletras aleatorias del alfabeto. Y primero uniéndose a nuevas líneas y solo luego haciendo los espejos también se guarda un byte en el mío. ¡Gracias por -2 bytes! :) PD: un byte se puede guardar en su 28 byte eliminando el final}. :)C (gcc) ,
198197196 bytesGuardado 2 bytes gracias a ceilingcat.
Pruébalo en línea!
Explicación:
fuente
JavaScript (ES6),
213209206 bytesPruébalo en línea!
Comentado
fuente
Limpio ,
346312 bytesjugará más golf mañana
Pruébalo en línea!
fuente
Python 3 , 197 bytes
Como mencionó @Emigna, no funciona para valores impares de
N(no entendí la pregunta correctamente)Pruébalo en línea!
Creo que las llamadas a
randint()+sample()+shuffle()son demasiado, y deshacerse de la mezcla en el lugar sería genial :)Estoy bastante seguro de que esta parte (que selecciona las letras y los dígitos) podría jugar un poco más.
fuente
N.Nque siempre sería así, ya que no entiendo cómo la matriz podría ser simétrica si es extraña!Python 2 ,
275266 bytesPruébalo en línea!
Devuelve la matriz como una lista de listas de caracteres. Para satisfacer la Regla 1, configuramos un grupo de caracteres:
El siguiente bit complicado es la regla 3: debe haber exactamente 2 columnas y filas que tengan un dígito; Esto significa, para
nimpar, que el dígito elegido puede no aparecer en la columna central o en la fila central. Como construimos la matriz usando una submatriz cuadrada reflejada dos vecess, eso se logra aquí usando:es decir, barajar al menos una vez; y luego, si
nes impar, siga repitiendo si el dígito está en la última columna o la última fila des.fuente
Pyth , 48 bytes
Pruébelo en línea aquí .
El programa consta de 3 partes: definición de la función de palindromización, elección de la ubicación de la función numérica y principal.
El uso de varios alfabetos barajados debería garantizar que el número de caracteres únicos sea siempre mayor que el número de entrada.
fuente
Python 2 / Python 3, 227 bytes
ungolfing un poco:
Mayor, Versiones más casi correctas a continuación:
Python2, Python3, 161 bytes
Parece que N elementos diferentes son solo casi garantizados.
Python 2 / Python 3, 170 bytes
Parece que olvidé la regla 3. También de alguna manera se deslizó [: n * n]
fuente
n = 3nunca tendrá una salida que contenga a'z', por lo que no todas las salidas son posibles).