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
N
caracteres diferentes, dondeN
es 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 < 27
yN > 2
, eso es porqueN <= 2
no 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 menosN
letras / 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
n
siempre 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 lasample
función con uno y dos argumentos, puedo usarpara conseguir lo que quiero
Entonces el código
-letters
se traduce asample(letters)
, lo que aleatoriamente baraja elletters
incorporado. Peroj-1
se traduce ensample(j,1)
, que muestra aleatoriamente un1
elemento del vector1:j
.(Este comportamiento de la
sample
funció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-1
bits) con un dígito al azar (el0:9-1
bit), y se pliega hacia fuera para la simetría requerida. Eli
y elj
son 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
sample
no garantizan al menosN
caracteres diferentes.Con eso en mente, pruebe esta nueva versión que debería garantizar al menos
N
diferentes caracteres por ejecución.Python3,
265260 bytes, al menosN
caracteres distintosPruébalo en línea!
fuente
a[:-1][::-1]
es fundamentalmente equivalente aa[:-2::-1]
, y puede importarrandom
como enr
lugar dern
, y puede mover elfor
bucle a una expresión en línea. ¡Pruébelo en línea!math
importació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 menosN
caracteres 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
.n
letras del alfabeto, en lugar den
letras 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
.N
que 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
n
impar, 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
n
es 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 = 3
nunca tendrá una salida que contenga a'z'
, por lo que no todas las salidas son posibles).