introduction
Ce défi est similaire aux problèmes du projet Euler . Je l'ai trouvé parce que je jouais à un jeu de société trompeusement simple et que je ne pouvais pas trouver de solution efficace pour répondre à une simple question sur ses mécanismes.
Quarto est une variante amusante de 4 d'affilée. Il se joue sur un plateau de 4 x 4 avec 16 pièces uniques (aucune pièce n'est dupliquée). Chaque tour, chaque joueur place 1 pièce sur le plateau. Chaque pièce a 4 caractéristiques binaires (courte / haute, noire / blanche, carrée / circulaire, creuse / solide). Le but est d'en faire quatre de suite, soit horizontalement, verticalement ou le long des 2 diagonales, pour n'importe laquelle des quatre caractéristiques! Donc 4 pièces noires, 4 pièces blanches, 4 pièces hautes, 4 pièces courtes, 4 pièces carrées, 4 pièces circulaires, 4 pièces creuses ou 4 pièces solides.
L'image ci-dessus montre un jeu terminé, il y a quatre de suite à cause de 4 pièces carrées.
Défi
Dans Quarto, certains matchs peuvent se terminer par un match nul.
Le nombre total de positions finales possibles est d' 16!
environ 20 000 milliards.
Combien de ces positions finales sont des tirages?
Règles
La solution doit être un programme qui calcule et génère le nombre total de positions finales qui sont des tirages. La bonne réponse est
414298141056
Vous ne pouvez utiliser que les informations des règles du jeu qui ont été déduites manuellement (pas de preuve assistée par ordinateur).
Les simplifications mathématiques du problème sont autorisées, mais doivent être expliquées et prouvées (manuellement) dans votre solution.
Le gagnant est celui qui a la solution la plus optimale en termes de temps d'exécution du processeur.
Pour déterminer le gagnant, j'exécuterai chaque solution avec une durée d'exécution inférieure à 30 m sur un MacBook Pro Intel Core i7 2,5 GHz avec 16 Go de RAM .
Aucun point bonus pour trouver une solution qui fonctionne également avec d'autres tailles de cartes. Même si ce serait bien.
Le cas échéant, votre programme doit compiler en 1 minute sur le matériel mentionné ci-dessus (pour éviter les abus d'optimisation du compilateur)
Les failles par défaut ne sont pas autorisées
Soumissions
Veuillez poster:
- Le code ou un lien github / bitbucket vers le code.
- La sortie du code.
- Votre temps de course mesuré localement
- Une explication de votre approche.
Date limite
La date limite pour les soumissions est le 1er mars, donc encore beaucoup de temps.
Réponses:
C: 414298141056 tirages trouvés en environ
52,5 minutes.Recherche simple en profondeur avec une table de transposition sensible à la symétrie. Nous utilisons la symétrie des attributs sous permutation et la symétrie dièdre 8 fois de la carte.
Score mesuré (@wvdz):
Score (utilisateur + sys): 1m35.727s
la source
-O3 -march=native
et obtenu 1m48s sur ma machine. (CC @wvdz)Java, 414298141056 nuls, 23m42.272s
J'espère que ce n'est pas mal vu de publier une solution à son propre défi, mais la raison pour laquelle j'ai posté ce défi en premier lieu était que cela me rendait fou de ne pas pouvoir trouver une solution efficace moi-même. Mon meilleur essai prendrait des jours.
Après avoir étudié la réponse de user1502040 , j'ai réussi à modifier mon code pour qu'il s'exécute dans un délai assez raisonnable. Ma solution est toujours très différente, mais j'ai volé quelques idées:
La principale différence entre cette solution et celle de l'utilisateur1502040 est que je n'utilise pas une table Zobrist, mais une représentation canonique d'une carte, où je considère que chaque carte a 48 transpositions possibles sur les caractéristiques (2 * 4!). Je ne fais pas pivoter ou transposer la planche entière, mais juste les caractéristiques des pièces.
C'est le mieux que j'ai pu trouver. Les idées d'optimisations évidentes ou moins évidentes sont les bienvenues!
Score mesuré:
Score (utilisateur + sys): 23m42.272s
la source