Así como ya publiqué un desafío de automatización y otro para analizar la curiosidad en resolver problemas (en Linkedin y en Twitter), ahora voy con otro desafío de automatización un poco más complejo, también sobre un juego, esta vez el SetGame.
Introducción al SetGame
Comencemos viendo un poco de qué se trata el juego.
El SetGame es un juego de cartas que lo conozco de mis primeros años como tester, ya que es un juego bien interesante, te permite desarrollar habilidades muy buenas como el reconocimiento de patrones más que nada. En Uruguay se puede conseguir un equivalente llamado Touch en el local Habichuelas. Yo había comprado unos cuantos para la oficina y para mis clases de testing.
Una cosa que considero como uno de mis mayores achievements en mi vida, es que le gané a Michael Bolton jugando al Set 😄
Reglas del juego
Puede sonar complicado, pero las reglas son simples. Hay un mazo de cartas que tienen esas formas, colores, rellenos y distintos números de elementos. Entonces, cada carta tiene 4 propiedades que puede tener 3 valores diferentes:
- Color: rojo, verde, violeta
- Cantidad: 1, 2, 3
- Forma: redondeado, rombo, curvo
- Relleno: sólido, hueco o rayado
Se ponen 12 cartas sobre la mesa sobre la que vamos a buscar conjuntos (sets) de 3 cartas. Cada set que se busca tiene que cumplir lo siguiente para las 4 propiedades: ser en las 3 cartas iguales o en las 3 cartas diferente.
Por ejemplo:
Ese es un set porque:
- El color es distinto en las 3 cartas.
- La forma es distinta en las 3 cartas.
- El relleno es igual en las 3 cartas.
- El número es distinto en las 3 cartas.
Desafío de Automatización sobre el SetGame
Hay una versión online, que efectivamente es sobre la que podemos hacer la automatización.
Así que eso es el desafío, poder resolver el juego y que sea en tiempo record.
Algunos datos que quizá sean útiles:
- Como no se pueden repetir las cartas y no importa el orden, para calcular cuántas termas posibles hay calculamos las combinaciones de 12 tomadas de a 3 (12! / 3! x (12-3)! — ¡220 combinaciones!!
- Son cartas con 4 propiedades con 3 opciones para cada propiedad, entonces, tenemos 3 a la 4 cartas diferentes, o sea 81.
Solución
Por acá queda mi solución en GitHub, hecha en Ruby y Selenium para que puedas comparar con la tuya, proponer mejoras, sacar ideas, lo que sea. Mi primer approach fue por fuerza bruta, más adelante quizá le pongo más pienso para resolver de forma más eficiente.
Ahí mi solución llegó al resultado en 21.196s.
Si lográs hacerlo porfa comentá en el post y compartí alguna imagen, tu repo de código o algo así vamos haciendo crecer el desafío.
Hola Fede.
Te cuento que conocí el juego durante el programa +50 y me recontra enganchó. Lo recomiendo ampliamente.
Mis mejores tiempos están debajo de los 2 minutos y sigo tratando de bajar.
Excelente desafío!