Flow Free es un adictivo juego de Android en el que debes conectar pares de elementos a través de serpientes que no se superponen y llenar toda la cuadrícula. Para una descripción, ver aquí:
https://play.google.com/store/apps/details?id=com.bigduckgames.flow&hl=en
Tengo una solución ASP (programación de conjunto de respuestas) que es solo un par de reglas y no creo que sea posible formular la misma solución de manera tan concisa como una instancia de SAT, pero me interesaría que se demuestre lo contrario.
Cualquier lenguaje está bien, pero dudo que se pueda hacer de manera concisa sin ejecutar algún tipo de solucionador, por eso lo etiqueté ASP / Prolog / SAT
El ganador es la menor cantidad de personajes.
Puede suponer que el problema se define utilizando los predicados:
v(V). % A vertex
a(V,W). % V and W are adjacent
c(C). % A color
s(V,C). % V is an endpoint of color C
Además, la entrada satisface
a(W,V) :- a(V,W) % Adjacencies are bidirectional
2{s(V,C) : v(V)}2 :- c(C). % Every color has exactly two endpoints
El predicado de la solución tendrá la forma
e(V,W,C).
Diciendo que hay un borde entre V y W del color C.
Los bordes deben ser bidireccionales (del mismo color). Cada vértice debe tener bordes hacia y desde él de exactamente un color. Los puntos finales tienen exactamente un borde, todos los demás vértices tienen exactamente dos bordes. No hay bucles, cada serpiente debe ser rastreable desde dos puntos finales.
Aquí hay una muestra de entrada para probarlo (5x5 Nivel 2 en el Paquete Regular):
v(v11; v12; v13; v14; v15).
v(v21; v22; v23; v24; v25).
v(v31; v32; v33; v34; v35).
v(v41; v42; v43; v44; v45).
v(v51; v52; v53; v54; v55).
a(v11, v12).
a(v12, v13).
a(v13, v14).
a(v14, v15).
a(v12, v11).
a(v13, v12).
a(v14, v13).
a(v15, v14).
a(v11, v21).
a(v12, v22).
a(v13, v23).
a(v14, v24).
a(v15, v25).
a(v21, v22).
a(v22, v23).
a(v23, v24).
a(v24, v25).
a(v22, v21).
a(v23, v22).
a(v24, v23).
a(v25, v24).
a(v21, v31).
a(v22, v32).
a(v23, v33).
a(v24, v34).
a(v25, v35).
a(v21, v11).
a(v22, v12).
a(v23, v13).
a(v24, v14).
a(v25, v15).
a(v31, v32).
a(v32, v33).
a(v33, v34).
a(v34, v35).
a(v32, v31).
a(v33, v32).
a(v34, v33).
a(v35, v34).
a(v31, v41).
a(v32, v42).
a(v33, v43).
a(v34, v44).
a(v35, v45).
a(v31, v21).
a(v32, v22).
a(v33, v23).
a(v34, v24).
a(v35, v25).
a(v41, v42).
a(v42, v43).
a(v43, v44).
a(v44, v45).
a(v42, v41).
a(v43, v42).
a(v44, v43).
a(v45, v44).
a(v41, v51).
a(v42, v52).
a(v43, v53).
a(v44, v54).
a(v45, v55).
a(v41, v31).
a(v42, v32).
a(v43, v33).
a(v44, v34).
a(v45, v35).
a(v51, v52).
a(v52, v53).
a(v53, v54).
a(v54, v55).
a(v52, v51).
a(v53, v52).
a(v54, v53).
a(v55, v54).
a(v51, v41).
a(v52, v42).
a(v53, v43).
a(v54, v44).
a(v55, v45).
s(v11, yellow).
s(v45, yellow).
s(v41, blue).
s(v55, blue).
s(v51, red).
s(v43, red).
s(v42, green).
s(v33, green).
c(red; green; blue; yellow).
Y para probar la salida
shouldbe(v33,v32,green).
shouldbe(v42,v32,green).
shouldbe(v43,v53,red).
shouldbe(v51,v52,red).
shouldbe(v55,v54,blue).
shouldbe(v41,v31,blue).
shouldbe(v45,v35,yellow).
shouldbe(v11,v12,yellow).
shouldbe(v12,v11,yellow).
shouldbe(v35,v45,yellow).
shouldbe(v31,v41,blue).
shouldbe(v54,v55,blue).
shouldbe(v52,v51,red).
shouldbe(v53,v43,red).
shouldbe(v32,v42,green).
shouldbe(v32,v33,green).
shouldbe(v53,v52,red).
shouldbe(v52,v53,red).
shouldbe(v54,v44,blue).
shouldbe(v31,v21,blue).
shouldbe(v35,v25,yellow).
shouldbe(v12,v13,yellow).
shouldbe(v13,v12,yellow).
shouldbe(v25,v35,yellow).
shouldbe(v21,v31,blue).
shouldbe(v44,v54,blue).
shouldbe(v44,v34,blue).
shouldbe(v21,v22,blue).
shouldbe(v25,v15,yellow).
shouldbe(v13,v14,yellow).
shouldbe(v14,v13,yellow).
shouldbe(v15,v25,yellow).
shouldbe(v22,v21,blue).
shouldbe(v34,v44,blue).
shouldbe(v34,v24,blue).
shouldbe(v22,v23,blue).
shouldbe(v15,v14,yellow).
shouldbe(v14,v15,yellow).
shouldbe(v23,v22,blue).
shouldbe(v24,v34,blue).
shouldbe(v24,v23,blue).
shouldbe(v23,v24,blue).
:-not e(V,W,C),shouldbe(V,W,C).
:-e(V,W,C),not shouldbe(V,W,C).
También el Nivel 21 5x5 debería ser el primer rompecabezas con más de 1 solución (específicamente, hay 9 soluciones, no 40) Para configurar el nivel 21, configure las últimas líneas de la entrada en
s(v55, yellow).
s(v44, yellow).
s(v15, blue).
s(v45, blue).
s(v51, red).
s(v53, red).
s(v22, green).
s(v14, green).
s(v23, orange).
s(v43, orange).
c(red; green; blue; yellow; orange).
Respuestas:
ASP (clingo), 180 bytes
Soy nuevo en ASP, así que estaba emocionado de encontrar esta tarea, incluso si es algo antigua. Fue agradable ver que había lugares para variaciones y una oportunidad para jugar al golf que me estaba llevando a los límites de mi comprensión (espero que todavía sea correcto, parece ser).
Aquí hay una versión comentada:
No sé acerca de los diferentes solucionadores ASP, pero usé clingo, que en debian está contenido en el paquete gringo.
Si tiene un problema en un archivo
prob
y mi código en un archivosolve
, llameclingo 0 prob solve
. Para cada solución, obtendrá la lista de bordes de colores que usa (y todos los demás predicados si usa la versión de golf que carece de la#show
línea). Si solo desea la cantidad de soluciones, agregue la opción-q
. Si solo desea saber si hay al menos una solución, llame sin ella0
.fuente