Aprende a usar Python para DESTRUIR sudokus

Поділитися
Вставка
  • Опубліковано 2 жов 2024

КОМЕНТАРІ • 62

  • @antoniogamez2651
    @antoniogamez2651 2 роки тому +1

    El ejercicio espectacular, funciona a la perfección! Ahora estoy haciendo el del New York Times con Selenium. Ya tengo todo listo, incluso como meter números. El problema está en que la función de resolver el sudoku, no me devuelve el sudoku resuelto, aunque lo ponga detrás del return. Básicamente no devuelve nada (None), solo llama a la función de print pero no logro que me devuelva el sudoku resuelto para almacenarlo en una variable, la cual será la que suba al New York Times :(

    •  2 роки тому +1

      Qué tal Antonio, qué bueno que te gusto este proyecto. Muchas gracias por ver el video y tu comentario.
      Que bien que ya hiciste la parte de subirlo a NY times automáticamente.
      Espero ya hayas visto también cómo leerlo automáticamente aquí:
      ua-cam.com/video/-acpBVFhYEE/v-deo.html
      La parte de subirlo a la página yo la hice con otra librería y el video tutorial lo haré a principios de enero. A ver si te queda similar a ti.
      Para resolver el sudoku y regresar el sudoku resuelto es fácil confundirse y poner el return adentro de el for o if equivocado. Eso me pasó a mi jejeje. Pero asegúrate que esté al nivel del primer for y que si regrese la variable de sudoku.
      Aquí está el código que hice en este video yo. En esta etapa aún no regresó el sudoku pero lo imprimo. Solo cámbialo por regresar tu variable y debe funcionar.
      github.com/DanyYax/MisionCodigoRepo/blob/main/Resolver%20Sudoku/resolver_sudoku.py
      Cualquier duda aquí estoy disponible.
      Saludos y felices fiestas

    • @antoniogamez2651
      @antoniogamez2651 2 роки тому +1

      @ Hola! Muchas gracias por contestar tan pronto, de verdad que se agradece :D
      Genial! Pues revisaré el video a principios de enero, que siempre está bien ver otros caminos para hacer una determinada tarea :D
      Sigo teniendo el mismo problema me temo, tras el último return pongo la variable sudoku. Después llamo a la función asignando una nueva variable a dicha función pero me devuelve un NoNeTypeObject, vamos, que no retorna nada la función, a pesar de que si hace el print correctamente...Acaba siendo desesperante jajaja. Te dejo por aqui el codigo del que hablo, a ver si pudieras detectar el fallo. Antes de nada muchas gracias, se agradece enormemente :D
      def resolver_sudoku(sudoku):
      for fila in range(9):
      for columna in range(9):
      if sudoku[fila][columna] == 0:

      for valor in range(1,10):

      if es_posible(fila,columna,valor,sudoku):

      sudoku[fila][columna] = valor
      resolver_sudoku(sudoku)
      sudoku[fila][columna] = 0

      return
      print_sudoku(sudoku)
      return sudoku
      Sudoku_resuelto =resolver_sudoku(Sudoku)

    •  2 роки тому

      @@antoniogamez2651 Hola Antonio, tienes razón, siempre es interesante ver otras forms de resolver un problema. Ojala te sirva.
      Ya vi cual es el problema. Mira te explico:
      - Este algoritmo es recursivo. Incluso cuando encuentras la solución el algoritmo va a seguir ejecutandose porque no pusimos un escape en el código de este video.
      - Si te fijas hay 2 returns en la función resolver_sudoku. El primero es cuando no encuentra solución y se regresa a seguir intentando otras opciones. El segundo return es para cuando si encontramos un resultado. De hecho por eso el print te muestra la solución.
      Pero justo si lo piensas ese return te va a regresar a otra llamada de la misma función y se va a seguir ejecutando y como ya encontro la solución eventualmente el algoritmo continua y no encuentra otra. Esto hace que se ejecute el primer return que no tiene nada así que te regresa None.
      Cuando yo hice el proyecto completo utilice clases y por eso no noté este bug (buen trabajo atrapandolo). Pero se puede resolver si cambias tu función a que regrese un sudoku y un boleano indicando si se resolvio o no.
      Mira algo asi:
      def resolver_sudoku(sudoku):
      for fila in range(9):
      for columna in range(9):
      if sudoku[fila][columna] == 0:

      for valor in range(1,10):

      if es_posible(columna,fila,valor,sudoku):

      sudoku[fila][columna] = valor
      sudoku, resuelto = resolver_sudoku(sudoku)
      if resuelto:
      return (sudoku, True)
      sudoku[fila][columna] = 0

      return (sudoku, False)
      print_sudoku(sudoku)
      return (sudoku, True)
      Espero esto te sirva y resuelva tu duda. De nuevo muchas gracias por ayudarme a mejorar este ejercicio. Agregare esta actualización al link de github por si quieres ver como quedo todo junto.
      Saludos

    •  2 роки тому +1

      @@antoniogamez2651 So yo de nuevo ...
      Hice un cambio más a la función. La hice para que regresara solamente un bool indicando si se encontro solución al sudoku.
      Esto fue porque conforme se ejecuta el algoritmo el sudoku original esta siendo actualizado asi que no necesitamos regresarlo.
      Esta es la versión final que tengo.
      def resolver_sudoku(sudoku):
      """
      Esta implementación es casi la misma que la de resolver_sudoku1
      Pero aqui regresamos un bool indicando si ya fue resuelto
      o no
      Esto nos permite terminar el algoritmo cuando se encuentra una solución
      El sudoku original es actualizado y contiene la respuesta
      """
      for fila in range(9):
      for columna in range(9):
      if sudoku[fila][columna] == 0:

      for valor in range(1,10):

      if es_posible(columna,fila,valor,sudoku):

      sudoku[fila][columna] = valor
      resuelto = resolver_sudoku(sudoku)
      if resuelto:
      return True
      sudoku[fila][columna] = 0

      return False
      #print_sudoku(sudoku)
      return True

      Dime que opinas y si te sirve para tu código.

    • @antoniogamez2651
      @antoniogamez2651 2 роки тому +1

      @ Hola!! Muchísimas gracias por todo :D
      Efectivamente así funciona a la perfección. En otras cosas suelo ser más "avispado" pero la funciones recursivas me cuestan más. Ahora ha quedado todo mucho más claro y lo entiendo bien :D
      Una vez más, muchas gracias de nuevo y esperaré el video del New York Times para ver como lo solucionas tú.
      Un saludo

  • @acasaresm
    @acasaresm Рік тому +1

    Muy fácil, interesante y didáctico el programa. Por favor, respóndeme un par de preguntas referentes a la implementación. Tengo experiencia en programación y conozco Python. Trabajo con Python 3 de Anaconda (3.9.7), IPython 7.31.1, pero no he utilizado Selenium anteriormente.
    1).- Para la versión en que se ingresa manualmente un puzzle, tu algoritmo halla la primera solución, pero no detecta el caso no estándar de esquemas con múltiples soluciones. Qué cambios habría que añadir para hallar la solución completa en ese caso?
    (Si quieres, puedo enviarte uno de esos casos, que tiene 4 soluciones).
    2).- Parece que en la última versión de Selenium se han cambiado varias funciones del WebDriver, y por eso, aunque el programa entra correctamente al sitio web del new York Times, aborta con error al tratar de usar
    grid = driver.find_element_by_class_name("su-board")
    porque esa forma está obsoleta ('deprecated'). Se necesitaría la forma actualizada de hacer esa llamada, o, en su defecto, la manera de instalar con pip la versión anterior de Selenium.
    Gracias anticipadas por tu respuesta.

    •  Рік тому

      que tal Alejandro,
      El algoritmo que use encuentra solamente la primera solucion. Si quisieras encontrar todas las posibles soluciones seria un cambio sencillo.
      Como yo lo haria sería que almacenaria la solucion econtrada (actualmente la regresa) y pasas a la siguiente posible combinacion (como si hubiera sido una respuesta incorrecta)
      Al final te regresaria el numero de respuestas.
      En cuanto a las actualizaciones de selenium no estoy seguro porque hacee mucho que no uso este programa. Si esta deprecada significa que aun sirve pero que pronto la dejara de ser soportada (va dejar de funcionar pronto). Me meti rapido a la pagina de ny times y la clase (html) aun se llama "su-board" asi que no estoy seguro que pueda ser el error. Tendria que ponerme a verlo, hoy en la noche lo reviso y si quieres enviame el sudoku de 4 soluciones y tambien lo vemos.
      Saludos

  • @Carlos-po4px
    @Carlos-po4px 5 місяців тому

    Excelente Video, muy buena forma de explicar la resolucion de los sudokus, no me quedo ninguna duda sobre el tema, todo bien aclarado sobre recursividad y backtracking. Gracias.
    He visto muchos videos sobre como resolver el problema, pero esta es la mejor, con muchas pruebas en pantalla para entenderlo mejor. Ademas de dejar el archivo de referencia resuelto, que sirve muchisimo. Felicitaciones

  • @pepekoko-m2y
    @pepekoko-m2y Рік тому +1

    sabes de algoritmos geneticos con el juego de sudoku

    •  Рік тому

      He leído un poco pero no tengo ningún video. Son interesantes pero entran en el ares de IA

  • @varelatao
    @varelatao Рік тому +2

    Te hago una consulta: estoy cursando estructura de datos( estamos viendo árboles, grafos, etc) : como enlazo esto con la materia? Que estructura seria la utilizada para esta resolución?

    •  Рік тому +2

      Esta es una muy buena pregunta.
      Esto se puede considerar como un grafo y el algoritmo que use es también típico aunque con unos ligeros cambios. Se le conoce como DFS o Depth First Search. Esto es porque cada camino del grafo se recorre hasta el fondo.

  • @erickchicas9808
    @erickchicas9808 Рік тому +1

    Lo has trabajado con Branch and bound ?

    •  Рік тому

      Branch and bound se parece mucho pero es más para optimización de resultados. En los sudoku regularmente solo hay una solución (REGULARMENTE) entonces no estamos buscando la solución óptima sino la única solución.

  • @tomasalvarez922
    @tomasalvarez922 Рік тому +1

    Que buen video. Lastima que no logro entender la parte de backtracking, no entiendo por que pone un cero despues de llamar a la funcion de nuevo

    • @tomasalvarez922
      @tomasalvarez922 Рік тому +1

      O sea, como “quita” esa solucion, como lo corre de nuevo?

    •  Рік тому +1

      Es un poco explicar en texto… una manera de entender backtracking es con una analogía.
      Imagínate que estás en un laberinto y tienes una hoja de papel donde vas anotando cada decisión que tomas.
      Empiezas y tomas derecha, la siguiente intersección derecha de nuevo y te topas con un camino sin salida.
      Te regresas caminando a la última derecha y le das a la izquierda.
      Sigues tu camino y de nuevo llegas a una intersección pero ahora con 3 caminos. Tomas el de la derecha y otravez camino sin salida. Regresas y tomas el camino central. Y otravez camino cerrado. Así que vuelves y ahora tomas el de la izquierda.
      Así continuas hasta que logras salir del otro lado. Eso es backtracking, regresar a la última decisión y cambiarla.

    • @tomasalvarez922
      @tomasalvarez922 Рік тому

      @Muchas graciAaa!!

  •  3 роки тому +4

    Si hiciste este ejercicio déjame un comentario para saber si te sirvió!

    • @AESRI_Projects
      @AESRI_Projects Рік тому

      Hola, muy buena implementación del código,sin embargo, noté una particularidad, cuando asignas sudoku[x][y]=0, sí es correcto para que el retroceso funcione, pero cuando el arreglo tiene más de una solución (lo que es común cuando hay muy pocas pistas en el arreglo), la función se queda en una especie de bucle infinito donde imprime una y otra vez la solución a pesar de que esta ya se alcanzara, para resolver eso agregué un if con una función nueva que verifica si el resultado ya es el sudoku resuelto, sino, ahí sí asigno sudoku[x][y]=0, es como un criterio de parada que me funcionó para casos así. saludos,

    • @AESRI_Projects
      @AESRI_Projects Рік тому

      otro detalle, debido a que muchas veces la recursividad de funciones no permite el retorno del resultado (supongo que por eso usaste print()), para guardar el resultado para alguna manipulación posterior, utilicé funciones como open para poder almacenarlo en un .txt, esto sería por si quisiera usarlo en una aplicación de escritorio o alguna otra locura que piense XD, y tener siempre el .txt para invocar el arreglo.

    •  Рік тому

      Muy buenas observaciones.
      De hecho si ves el código en mi GitHub está actualizado para regresar el resultado y terminar el proceso si llega a una solución.
      En cuanto a un txt es una buena forma de almacenar tus resultados y usarlos después.
      Gracias por tus contribuciones!! Saludos

    •  Рік тому

      Otra posible opción es llevar una base sita de datos con el sudoku resuelto y su solución. Sería un proyecto interesante 🤓

    • @AESRI_Projects
      @AESRI_Projects Рік тому +1

      @ o que dado un sudoku detecte si tiene múltiples soluciones e imprimirlas todas :D

  • @juandaniel1320
    @juandaniel1320 Рік тому

    papucho

  • @ROXANASUASACA
    @ROXANASUASACA Рік тому +1

    no funciona
    quiero comunicarme nose si me puede dar su correo o numero de whatsap

    •  Рік тому

      El código está en GitHub
      github.com/DanyYax/MisionCodigoRepo

  • @davidandbar22
    @davidandbar22 2 роки тому +2

    Hola amigo, excelente tutorial. Eres muy bueno. Tengo una pregunta, en la línea 63 del código pones sudoku[y][x] = 0, está justo después de ejecutarse la función de resolver_sudoku, no entiendo cómo se ejecuta esa orden si cuando se ejecuta nuevamente el resolver sudoku no debería necesariamente empiezar nuevamente a ejecutarse la función y saltarse por completo esa línea? Gracias 👍👍

    •  2 роки тому +2

      Muchas gracias por tu comentario David. No estoy seguro de entender completamente tu comentario pero creo que se cual es la duda. Esta línea solo se ejecuta si la opción actual llegó a un punto donde ya no puede generar una opción válida. En este caso se ejecuta sudoku[x][y] = 0.
      Si encuentras una solución correcta esto no necesitas ejecutarlo. Esta versión de código te imprime la solución pero no la almacena. En el último tutorial explico cómo arreglarlo.
      Espero que eso ayude a aclarar tu duda, si no escríbeme de nuevo!
      Saludos

    • @jirivchi
      @jirivchi Рік тому +1

      @ Buenas, he estado mirando muchos tutoriales para intentar entender pero tengo la misma duda que @David Barrios. como llega el codigo a sudoku[y][x] = 0. Si entiendo el concepto de backtracking, la analogía etc. lo que no entiendo es el flujo del código. También el return. estas dos partes no entiendo.

    •  Рік тому +1

      @@jirivchi hola amigo, a cuál return te refieres?
      Es difícil explicar todo por mensaje pero haré el intento. (También puedes entrar a los directos y ahí podemos ver esto directo en el código)
      El algoritmo hace ciclos por la fila y Columna. Si el valor es 0 entonces busca un valor posible.
      Después llama a la función misma y así va a seguir con el siguiente nivel de recursion.
      El valor que pone en ese lugar disponible es un valor cualquiera (no se calcula) y estamos intentando adivinar el valor correcto.
      Así continúa el algoritmo.
      Si llega un momento donde hay una posición con valor 0 y no hay un valor posible eso significa que toooooodo lo que hemos hecho está mal.
      Entonces el algoritmo llega al return y se regresa un nivel y pone otro valor para el último número que “adivinamos”.
      Esto mismo continúa hasta encontrar la solución correcta.
      Espero sea un poco más claro

    • @jirivchi
      @jirivchi Рік тому

      @Mision Codigo. Muchas gracias por responderme tan pronto. Lo que has escrito lo entiendo perfectamente. He hecho muchos print() para ver lo que esta pasando pero hay un punto que no entiendo cuando regresa hacia atrás. En el flujo del código después del for para probar los 9 números está un return. No entiendo que hace que regrese ese return si no tiene ninguna variable/true/false. Tampoco entiendo dentro del flujo del codigo como llega a sudoku[y][x]=0 si antes esta la función recursiva solve(). Posiblemente la clave esta en ese return porque hace que vuelva a los indices anteriores y despues pone sudoku[y][x]=0. Muchas gracias por responderme.Un saludo,

    •  Рік тому +1

      @@jirivchi con gusto.
      Si, la mejor forma de entender es con un debugger.
      Pero según tu mensaje parece que ya quedó más claro.
      Saludos

  • @oscarpavonvaquero1001
    @oscarpavonvaquero1001 2 роки тому +1

    Hola, muy didactico, gracias. Como se podria hacer en caso de letras en lugar de numeros, por ejemplo un sudoku de 4x4? gracias

    •  2 роки тому

      Qué tal Oscar, muy buena pregunta.
      Si, el algoritmo es el mismo con el “sudoku” del tamaño que sea, sin importar el tamaño y si usas letras o números el algoritmo de recursividad y backtracking te ayudaría a resolverlo.
      El único cambio que requeriría es en la parte de definir si un número puede ir en la casilla o no. Es decir, tendrías que cambiar eso a que refleje las reglas de tu sudoku de letras.
      Si tienes dudas o quieres saber más escríbeme por aquí o Instagram y con gusto hago un video al respecto.
      Saludos

  • @luisandraschnik3001
    @luisandraschnik3001 2 роки тому +1

    Muy buen video. Esto es la base para un algoritmo de búsqueda en juegos como el ajedrez, sólo hay que agregarle una función de evaluación, el algoritmo alfa-beta y algunas heurísticas.

    •  2 роки тому

      Gracias por tu comentario Luis!
      Nunca he hecho un algoritmo para jugar ajedrez, de hecho es algo que tengo en la lista de futuros proyectos. Voy a revisarlo y a ver si hago uno, gracias por el tip.

  • @setalokaa
    @setalokaa 2 роки тому +2

    recién estoy aprendiendo python, de momento solo se sumar y poco mas xD pero espero que en un futuro pueda llegar a hacer cosas asi, me parece MAGIA jajaja
    No se si es el mejor lenguaje para aprender a programar, pero estare pendiente de tu canal para ver que mas cosas se pueden hacer con python .
    Un saludo desde españa:)

    •  2 роки тому

      que tal, gracias por haber pasado por mi canal y visto el video. Este es un proyecto bastante práctico e interesante pero si un poco mas avanzado para alguien que está empezando. Pero no te preocupes, programar es una habilidad que cualquiera puede aprender y desarrollar.
      De hecho tengo una serie de videos para aprender a usar Python desde cero que te puede servir si quieres aprender sobre el lenguaje:
      ua-cam.com/video/x37SvTME8BA/v-deo.html
      Y pronto estaré subiendo más proyectos que te podrá dar una buena idea de lo que se puede hacer con python ;)
      Saludos

    • @zoilOxD
      @zoilOxD 2 роки тому +1

      No es el mejor lenguaje para aprender.

    •  2 роки тому +1

      Depende de tus objetivos pero si es un buen lenguaje introductorio debido a sus cualidades como facilidad de configuración, lectura y versatilidad.
      De ahí en fuera sería imposible decir cuál es el “mejor” lenguaje para aprender para TODOS. Porque todos tienen distintas cosas que quieren lograr con la programación.

    • @zoilOxD
      @zoilOxD 2 роки тому +1

      @ Es que es un lenguaje muy amigable, pero no propicia las buenas prácticas, es muy personal para cada uno, al final de cuentas, pero la mejor ruta que podría decir sería primero C para aprender sobre memoria, estructuras y prototipos tanto de funciones como de variables, posteriormente Java para aprender el paradigma orientado a objetos, que es sumamente importante y de ahí brincar a cualquier otro lenguaje va a ser mucho más sencillo y amigable.

    •  2 роки тому +1

      Es cierto que en Python podrías escribir código sin “buenas prácticas” pero eso realmente podrías hacerlo en cualquier lenguaje.
      Los puntos que dices son totalmente válidos y por eso digo que depende de cada quien. Pero empezar con C hace la curva de aprendizaje mucho más inclinada.
      Al final del día es preferencia personal. Y si aprendes bien puedes brincar de un lenguaje a otro sin muchas dificultades.
      Lo que a mi me gusta de Python y la razón por la que recomiendo iniciar con el es que muy rápido puedes empezar a escribir programas útiles.
      No requiere configuraciones y además es muy versátil. Puedes aprender programación orientada a objetos, se usa en muchas áreas como gaming, web dev, ciencia de datos, IA, cómo pegamento de códigos en otros lenguajes.
      Gracias por tu comentario! Honestamente muy buenos puntos.
      Saludos

  • @lucasmartinez9466
    @lucasmartinez9466 7 місяців тому

    No podría el algoritmo alterar los valores que proporciona el enunciado ?

  • @perezortizsaul6903
    @perezortizsaul6903 2 роки тому +1

    buen video, habra algun algoritmo que de solucion a un sudoku de NxN, me parece que es un problema np pero no entiendo como hacer un algoritmo al respecto

    •  2 роки тому

      Qué tal Saúl, gracias por tu comentario. Este mismo algoritmo podría resolver tu sudoku NxN. El que uso en el video sería el caso de N= 9 pero debe funcionar para cualquier tamaño.
      Incluso hay otros juegos similares con reglas ligeramente diferentes, para esos tendrías que adaptar unas de las funciones pero el algoritmo general sería el mismo también.

  • @joseantoniocharnicharovida1517
    @joseantoniocharnicharovida1517 2 роки тому +1

    Quisiera que se agregara al tutorial el calculo para los posibles candidatos de cada celda y valores unicos ocultos

    •  2 роки тому +1

      El algoritmo prueba todos los posibles candidatos, así es como encuentra la solución. Entonces creo que no estoy entendiendo tu sugerencia

    • @joseantoniocharnicharovida1517
      @joseantoniocharnicharovida1517 2 роки тому +2

      Lo que quise decir es que en el algoritmo se adicionara salida gráfica mostrando primero los posibles candidatos y posteriormente la solución final. Completaría de este modo el excelente algoritmo que se muestra en el video.
      Gracias anticipadas

    •  2 роки тому +1

      @@joseantoniocharnicharovida1517 ahh ya entendí la pregunta. Es algo sencillo de agregar de hecho. Lo hago y te lo pongo en este comentario!
      Saludos

    • @joseantoniocharnicharovida1517
      @joseantoniocharnicharovida1517 2 роки тому +2

      @
      Ingeniero sin el ánimo de presionar, pero estoy deseando ver el código con las peticiones que le hice.
      Admiro su trabajo
      Saludos

    •  2 роки тому +1

      @@joseantoniocharnicharovida1517 está semana lo hago 🤓