Flow Free est un jeu Android addictif où vous devez connecter des paires d'éléments ensemble via des serpents qui ne se chevauchent pas et remplir toute la grille. Pour une description, voir ici:
https://play.google.com/store/apps/details?id=com.bigduckgames.flow&hl=en
J'ai une solution ASP (Answer Set Programming) qui n'est que quelques règles et je ne pense pas qu'il soit possible d'exprimer la même solution de manière aussi concise qu'une instance SAT, mais je serais intéressé à avoir tort.
N'importe quelle langue va bien, mais je doute que cela puisse être fait de manière concise sans exécuter une sorte de solveur, c'est pourquoi je l'ai étiqueté ASP / Prolog / SAT
Le gagnant est le moins de personnages.
Vous pouvez supposer que le problème est défini à l'aide des prédicats:
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
De plus, l'entrée satisfait
a(W,V) :- a(V,W) % Adjacencies are bidirectional
2{s(V,C) : v(V)}2 :- c(C). % Every color has exactly two endpoints
Le prédicat de la solution sera de la forme
e(V,W,C).
Dire qu'il y a un bord entre V et W de couleur C.
Les bords doivent être bidirectionnels (de la même couleur). Chaque sommet doit avoir des arêtes allant et venant d'une seule couleur. Les extrémités ont exactement une arête, tous les autres sommets ont exactement deux arêtes. Il n'y a pas de boucles, chaque serpent doit être traçable jusqu'à deux points d'extrémité.
Voici un exemple d'entrée pour le tester (5x5 niveau 2 dans le pack régulier):
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).
Et pour tester la sortie
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).
Le niveau 21 5x5 devrait également être le premier casse-tête avec plus d'une solution (en particulier, il y a 9 solutions, pas 40). Pour configurer le niveau 21, définissez les dernières lignes de l'entrée sur
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).
Réponses:
ASP (clingo), 180 octets
Je suis nouveau sur ASP, donc j'étais ravi de trouver cette tâche, même si elle est un peu ancienne. C'était agréable de voir qu'il y avait des endroits pour les variations et une opportunité pour le golf qui menait aux limites de ma compréhension (j'espère que c'est toujours correct, il semble que ce soit le cas).
Voici une version commentée:
Je ne connais pas les différents solveurs ASP, mais j'ai utilisé clingo, qui dans debian est contenu dans le paquet gringo.
Si vous avez un problème dans un fichier
prob
et mon code dans un fichiersolve
, appelezclingo 0 prob solve
. Pour chaque solution, vous obtiendrez la liste des bords colorés qu'elle utilise (et tous les autres prédicats si vous utilisez la version golfée qui n'a pas la#show
ligne). Si vous ne voulez que le nombre de solutions, ajoutez l'option-q
. Si vous voulez seulement savoir s'il existe au moins une solution, appelez sans0
.la source