Chomp est un jeu à deux joueurs avec une configuration d'un rectangle de pièces. Chaque joueur retire à tour de rôle n'importe quelle pièce, ainsi que toutes les pièces au-dessus et à sa droite. Celui qui prend la pièce en bas à gauche perd. Il peut être prouvé assez facilement que le premier joueur a toujours un coup gagnant (sauf avec un rectangle 1 par 1); trouve le.
- L'entrée correspond aux dimensions du rectangle (deux chiffres)
- La sortie est l'emplacement du coup gagnant (deux chiffres)
- S'il y a plus d'un coup gagnant, vous pouvez en sortir n'importe lequel.
C'est le golf de code; le code le plus court (n'importe quelle langue) gagne.
Exemples
Remarque: Les sorties ne sont que les deux nombres; l'art ASCII ci-dessous est juste pour démontrer ce que signifient les chiffres.
Entrée: 5 3 (index basés sur 1 à partir du coin inférieur gauche)
Sortie: 4 3
XXX--
XXXXX
XXXXX
Entrée: 4 4
Sortie: 2 2
X---
X---
X---
XXXX
Prime
Soustrayez 15 caractères de votre score si vous produisez tous les coups gagnants. Chaque paire de numéros doit être séparée par une nouvelle ligne.
Réponses:
GolfScript, 82 (
10897 caractères - 15 bonus)Comme je ne connaissais aucune heuristique, cette solution effectue une recherche exhaustive sur l'espace de la solution. Vous pouvez essayer le code en ligne . Bien que l'implémentation soit très efficace, l'espace de recherche croît très rapidement avec l'augmentation des entrées.
Exemples:
Comme mentionné ci-dessus, l'implémentation ne repose pas sur la récursivité mais visite chaque nœud de l'espace de recherche une seule fois. Vous trouverez ci-dessous une version annotée du code qui décrit les blocs de construction plus en détail.
La représentation d'une seule planche de taille w * h est donnée par une liste de w nombres compris entre 0 et h . Chaque numéro donne le nombre de pièces dans la colonne correspondante. Ainsi, une configuration valide est une liste où les nombres n'augmentent pas du début à la fin (à chaque déplacement, vous vous assurez que toutes les colonnes à droite sont au plus aussi hautes que celles choisies).
la source
Python
23, 141-15 = 126Recherche minimax par force brute. Pour chaque coup possible, nous voyons récursivement si l'adversaire peut gagner après avoir fait ce coup. Assez faiblement golfé; quelqu'un d'autre devrait pouvoir faire beaucoup mieux. Cela ressemble à un travail pour APL.
win
est l'interface publique. Il prend les dimensions du tableau, le convertit en une représentation du tableau et le transmet àw
.w
est l'algorithme minimax. Il prend un état de plateau, essaie tous les coups, construit une liste dont les éléments correspondent aux coups gagnants et retourne True si la liste est vide. Avec la valeur par défautf=print
, la création de la liste a pour effet secondaire d'imprimer les coups gagnants. Le nom de la fonction avait plus de sens lorsqu'il renvoyait une liste de coups gagnants, mais j'ai ensuite déplacé l'not
avant de la liste pour économiser de l'espace.for r,p in enumerate(b)for c in xrange(p) if(r+c)
: Itérer sur tous les mouvements possibles.1 1
est traité comme un pas légal, simplifiant un peu le cas de base.b[:r]+[min(i,c)for i in b[r:]]
: Construire l'état du plateau après le mouvement représenté par des coordonnéesr
etc
.w(b[:r]+[min(i,c)for i in b[r:]],max)
: Recurse pour voir si le nouvel état est un état perdant.max
est la fonction la plus courte que j'ai pu trouver qui prendrait deux arguments entiers et ne se plaindrait pas.f(r+1,c+1)
: Sif
est imprimer, imprime le mouvement. Peu importef
soit, il produit une valeur pour remplir la longueur de la liste.not [...]
:not
renvoieTrue
pour les listes vides etFalse
pour les non vides.Code Python 2 original, complètement non golfé, y compris la mémorisation pour gérer des entrées beaucoup plus importantes:
Démo:
la source
13x13
prise2x2
et vous gagneriez.Perl 6:
113108 caractères - 15 = 93 pointsCelui-ci était difficile! Voici la version non mise en cache, qui est techniquement correcte mais prendra beaucoup de temps pour les entrées non triviales.
Cela fonctionne exactement comme l'implémentation Python de @ user2357112 (votez pour lui / elle, je n'aurais pas pu comprendre cela sans son travail!) Sauf que win () prend une planche (tableau) Chomp au lieu d'une largeur et d'une longueur. Il peut être utilisé comme:
Une version avec mémorisation, qui peut réellement gérer des entrées décentes (pas optimisées pour la lisibilité, cependant):
la source