elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Aporte] Código para generar tableros validos de sudoku
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Aporte] Código para generar tableros validos de sudoku  (Leído 3,533 veces)
engel lex
CoAdmin
***
Desconectado Desconectado

Mensajes: 15.347



Ver Perfil
[Aporte] Código para generar tableros validos de sudoku
« en: 23 Noviembre 2014, 21:08 pm »

Estaba buscando como resolver unos problemas y aprendiendo python (ya que puedo programar en android con QPython) asi que decidi hacer un metodo para generar tableros validos de sudoku, se genera un tablero original y con desplazamientos se lleva a la posición generada segun la semilla... la semilla genera (teoricamente) 60466175 tableros unicos

Si cualquier duda avisen

Código
  1. import pprint
  2.  
  3. #crea array bidimensiona
  4. def create_matrix(m, n): return [[0]*n for _ in xrange(m)]
  5.  
  6. #gira la matriz ccw
  7. def rotar_matrix(matrix):
  8.  matrix_auxiliar = create_matrix(9,9)
  9.  for x in range(9):
  10.    for y in range(9):
  11.      matrix_auxiliar[y][x] = matrix[x][y]
  12.  return matrix_auxiliar
  13.  
  14.  
  15.  
  16. def generar_tablero(semilla):
  17.  #se genera un sudoku base sobre el que aplicar transformaciones
  18.  basesudoku = create_matrix(9,9)
  19.  for y in range(9):
  20.    for x in range(9):
  21.      basesudoku[y][x]= (x+(y%3)*3+(y/3))%9+1
  22.  #declaracion e inicializacion de variables
  23.  #variables de transformacion
  24.  #desplazamiento del 0 al 8
  25.  desplazamiento = 0
  26.  #rotacion del 0 al 3
  27.  rotacion = 0
  28.  #combinacion cada elemento del 0 al 5
  29.  combinacion = [0,0,0,0,0,0,0,0]
  30.  
  31.  #numero generatriz de 0 60466175
  32.  desplazamiento = semilla%9
  33.  semilla /=9
  34.  rotacion = semilla%4
  35.  semilla /=4
  36.  for i in range(8):
  37.    combinacion[i] = semilla%6
  38.    semilla /= 6
  39.  
  40.  #sudoku final
  41.  sudoku = create_matrix(9,9)
  42.  
  43.  #auxiliar para copiar elementos
  44.  auxiliar = create_matrix(3,9)
  45.  
  46.  #posibles combinaciones de 3 elementos
  47.  combinatorias = create_matrix(6,3)
  48.  combinatorias = [[0,1,2],[1,2,0],[2,0,1],[1,0,2],[0,2,1],[2,1,0]]
  49.  
  50.  #combinacion para cada elemento segun combinacion escogida
  51.  combinador = create_matrix (8,3)
  52.  for i in range(8):combinador[i] = combinatorias[combinacion[i]]
  53.  
  54.  #modificacion de matriz por desplazamiento lateral con desp
  55.  for y in range(9):
  56.    for x in range(9):
  57.      sudoku[y][x] = basesudoku[y][(x+desplazamiento)%9]
  58.  
  59.  #mecla lineas de 3 en 3 segun combinacion
  60.  for z in range(3):
  61.    for copia in range(3): auxiliar[copia] = sudoku[z*3+copia]
  62.    for y in range(3):
  63.      sudoku[z*3+y] = auxiliar[combinador[z][y]]
  64.  
  65.  #se copia sudoku en auxiliar
  66.  auxiliar = sudoku[:]
  67.  
  68.  #se mezclan los 3 renglones mayores
  69.  for z in range(3):
  70.    for y in range(3):
  71.      sudoku[z*3+y] = auxiliar[combinador[3][z]*3+y]
  72.  
  73.  #se rota la matriz para aplicar conversiones en otro eje
  74.  sudoku = rotar_matrix(sudoku)
  75.  
  76.  #se repite el proceso
  77.  for z in range(3):
  78.    for copia in range(3): auxiliar[copia] = sudoku[z*3+copia]
  79.    for y in range(3):
  80.      sudoku[z*3+y] = auxiliar[combinador[z+4][y]]
  81.  
  82.  auxiliar = sudoku[:]
  83.  
  84.  for z in range(3):
  85.    for y in range(3):
  86.      sudoku[z*3+y] = auxiliar[combinador[7][z]*3+y]
  87.  
  88.  #se endereza la matriz a su orientacion original
  89.  for i in range(3): sudoku = rotar_matrix(sudoku)
  90.  
  91.  #se le da la orientacion indicada en rot
  92.  for i in range(rotacion): sudoku = rotar_matrix(sudoku)
  93.  return sudoku
  94.  
  95. pprint.pprint( generar_tablero(0) )
  96.  



[Elektro]: Título corregido, ponía "odigo" :P


« Última modificación: 25 Noviembre 2014, 11:23 am por Eleкtro » En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
charlie2019

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: [Aporte] Código para generar tableros validos de sudoku
« Respuesta #1 en: 7 Abril 2019, 15:44 pm »

Se puede generar nuevos SUDOKU con Octave o Matlab con un algoritmo de no mas de 20 lineas de código. Este algoritmo consiste en partir de un SUDOKU completado -81 casillas completas- y desde este se generan tantos como se quiera x simple eliminacion de n casillas elegidas al azar. Es decir de una solucion se pasa x eliminacion a otro tablero para solucionar. Realmente este algotitmo se puede hacer con cualquier lenguaje d programación pues no tiene pretensiones de ningun calculo matem´tico.


En línea

**Aincrad**


Desconectado Desconectado

Mensajes: 510



Ver Perfil
Re: [Aporte] Código para generar tableros validos de sudoku
« Respuesta #2 en: 8 Abril 2019, 02:39 am »

es raro ver un aporte tuyo .  :P , se agradece.  ;)
En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines