Si cualquier duda avisen
Código
import pprint #crea array bidimensiona def create_matrix(m, n): return [[0]*n for _ in xrange(m)] #gira la matriz ccw def rotar_matrix(matrix): matrix_auxiliar = create_matrix(9,9) for x in range(9): for y in range(9): matrix_auxiliar[y][x] = matrix[x][y] return matrix_auxiliar def generar_tablero(semilla): #se genera un sudoku base sobre el que aplicar transformaciones basesudoku = create_matrix(9,9) for y in range(9): for x in range(9): basesudoku[y][x]= (x+(y%3)*3+(y/3))%9+1 #declaracion e inicializacion de variables #variables de transformacion #desplazamiento del 0 al 8 desplazamiento = 0 #rotacion del 0 al 3 rotacion = 0 #combinacion cada elemento del 0 al 5 combinacion = [0,0,0,0,0,0,0,0] #numero generatriz de 0 60466175 desplazamiento = semilla%9 semilla /=9 rotacion = semilla%4 semilla /=4 for i in range(8): combinacion[i] = semilla%6 semilla /= 6 #sudoku final sudoku = create_matrix(9,9) #auxiliar para copiar elementos auxiliar = create_matrix(3,9) #posibles combinaciones de 3 elementos combinatorias = create_matrix(6,3) combinatorias = [[0,1,2],[1,2,0],[2,0,1],[1,0,2],[0,2,1],[2,1,0]] #combinacion para cada elemento segun combinacion escogida combinador = create_matrix (8,3) for i in range(8):combinador[i] = combinatorias[combinacion[i]] #modificacion de matriz por desplazamiento lateral con desp for y in range(9): for x in range(9): sudoku[y][x] = basesudoku[y][(x+desplazamiento)%9] #mecla lineas de 3 en 3 segun combinacion for z in range(3): for copia in range(3): auxiliar[copia] = sudoku[z*3+copia] for y in range(3): sudoku[z*3+y] = auxiliar[combinador[z][y]] #se copia sudoku en auxiliar auxiliar = sudoku[:] #se mezclan los 3 renglones mayores for z in range(3): for y in range(3): sudoku[z*3+y] = auxiliar[combinador[3][z]*3+y] #se rota la matriz para aplicar conversiones en otro eje sudoku = rotar_matrix(sudoku) #se repite el proceso for z in range(3): for copia in range(3): auxiliar[copia] = sudoku[z*3+copia] for y in range(3): sudoku[z*3+y] = auxiliar[combinador[z+4][y]] auxiliar = sudoku[:] for z in range(3): for y in range(3): sudoku[z*3+y] = auxiliar[combinador[7][z]*3+y] #se endereza la matriz a su orientacion original for i in range(3): sudoku = rotar_matrix(sudoku) #se le da la orientacion indicada en rot for i in range(rotacion): sudoku = rotar_matrix(sudoku) return sudoku pprint.pprint( generar_tablero(0) )
[Elektro]: Título corregido, ponía "odigo"