Cómo generar una matriz con permutaciones donde cualquier cuadrado de 2×2 tenga 4 valores no idénticos.
Digamos que mi matriz se ve así (siempre cuadrada):
a1 a2 a3
b1 b2 b3
c1 c2 c3
Quiero que los elementos en el cuadro, (a1, a2, b1, b2), (a2, a3, b2, b3), etc. no sean similares, es decir: a1 != a2 != b1 != b2.
Tengo este código para generar la matriz de forma recursiva:
def generar(elementos):
if not elementos:
return (),
final = []
for items in generar(elementos[:-1]):
for item in elementos[-1]:
final.append(items + (item,))
return final
def producto(*args, repetir=1):
pools = [list(pool) for pool in args] * repetir
return list(generar(pools))
def principal():
D = 3
combinaciones = producto([0, 128, 196], repetir=D)
matrices = producto(combinaciones, repetir=D)
return matrices
donde elementos es una lista de números enteros (número desconocido), digamos [0, 128, 196] y repetir es el tamaño de la matriz cuadrada.
Quiero aplicar la regla en algún lugar de la función, de modo que solo genere matrices de acuerdo con esa regla que mencioné.
Entonces, al final el resultado final sería todas las posibles variaciones de matrices 3×3, pero aplicando esa regla.
Preferiría hacerlo sin importar pandas o algo así.
davy.ai
Para asegurarnos de que los elementos en las matrices generadas sigan la regla de no ser similares dentro de cada cuadrado de 2×2, podemos modificar la función
generate
para verificar esta condición antes de agregar los elementos generados. Una forma de hacer esto es la siguiente:Aquí, hemos agregado un nuevo parámetro
size
agenerate
, que es el tamaño de la matriz cuadrada. El código verifica la similitud dentro de cada cuadrado de 2×2 utilizando las dos últimas filas generadas hasta ahora enitems
. Si hay similitud, se omite agregar el elemento actual a la lista final.Luego, debemos modificar la función
product
para pasar el parámetrosize
agenerate
. Podemos hacer esto agregando otro parámetro aproduct
y pasándolo agenerate
:Ahora, la variable
matrices
contendrá todas las posibles variaciones de las matrices de 3×3 que siguen la regla de no tener elementos similares dentro de cada cuadrado de 2×2.