Le jeu de plateau
Dans le jeu de société " Carcassonne ", les joueurs placent des tuiles en faisant correspondre leurs bords et gagnent les meilleurs scores en créant de grandes zones de terrain contiguës. Voici (grosso modo) les types et quantités de tuiles incluses dans le jeu:
#01
x4
#02
x5
#03
x8
#04
x2
#05
x9
#06
x4
#07
x1
#08
x3
#09
x3
#10
x3
#11
x4
#12
x5
#13
x3
#14
x3
#15
x2
#16
x5
#17
x5
#18
x2
#19
x3
#20
x1
#21
x5
#22
x2
#23
x1
#24
x1
#25
x1
La tâche
Vous devez placer une tuile en faisant correspondre les bords, tout en essayant de conserver les plus grandes zones de terrain contiguës possibles.
Placement
- Les tuiles ne peuvent être placées que dans l'un des (jusqu'à 4) espaces vides adjacents à toute tuile (ou tuiles) existante dans la zone de jeu.
- Les carreaux peuvent être tournés de 90, 180 ou 270 degrés.
Correspondance des bords
- Les bords d'une tuile placée doivent correspondre aux bords en contact des (jusqu'à 4) tuiles voisines, c'est-à-dire que les pixels en contact sont de la même couleur.
Terrain contigu
- La «fermeture d'une zone de terrain» fait référence au placement d'une tuile de telle sorte qu'aucune zone de couleur contiguë ne puisse ensuite être poursuivie avec d'autres placements de tuiles.
- Si un placement alternatif est possible, il doit être choisi par rapport à tout placement de tuiles qui fermerait une zone de terrain.
- Si vous devez choisir entre plusieurs emplacements de clôture, choisissez-en un. Si vous devez choisir entre plusieurs emplacements non fermés, choisissez-en un.
- Ignorez # ff00ff (les pixels d'angle) lors du calcul des zones contiguës. Ne tenez pas compte non plus des bâtiments, c'est-à-dire des zones de couleur déjà entièrement enfermées dans une tuile.
Contribution
L'entrée est deux images:
L'aire de jeux.
- La zone de jeu initiale est constituée de tuiles
#11
(une seule tuile). - La zone de lecture augmentée créée en sortie doit également être prise en charge en entrée.
- La zone de jeu initiale est constituée de tuiles
La tuile à placer.
- Tous les exemples de tuiles doivent être pris en charge en entrée.
Déterminez les bords / terrains contigus correspondants en utilisant uniquement ces données d'image. Pas de codage en dur.
Sortie
- La sortie est une image montrant la zone de jeu résultante après avoir placé la tuile.
- L'image doit être compatible avec votre propre programme, c'est-à-dire qu'elle peut être utilisée comme entrée de zone de lecture.
- S'il est impossible de placer une tuile, retournez une erreur.
Vous pouvez supposer que
- Les tuiles mesurent toujours 55 px par 55 px
- Les tuiles ne comporteront que les couleurs actuellement utilisées dans les tuiles d'exemple.
Remarques
- Votre réponse doit comporter un exemple de sortie après au moins 2 passages (plus est encouragé).
- Il s'agit d'un rendu partiel et inexact du jeu de société d'origine, vous n'avez pas besoin d'appliquer les règles ou tactiques non mentionnées ici.
But
- Votre score est le nombre d'octets de votre soumission.
- Les données d'image ne sont pas incluses dans votre score.
- Le score le plus bas l'emporte.
Jouer à un jeu complet
Vous voudrez peut-être écrire un script qui utilise votre soumission pour jouer à un jeu complet, qui pourrait consister en:
- Placer une tuile choisie de manière pseudo-aléatoire parmi l'ensemble complet de 85.
- Rendre la tuile à l'ensemble si elle ne peut pas être placée.
- Répéter jusqu'à ce que chaque tuile ait été placée - ou jusqu'à ce que deux tuiles d'affilée ne puissent pas être placées.
Il ne sera pas inclus dans votre nombre d'octets, ou améliorera votre score, mais je proposerai probablement une prime à ce type de réponse.
Réponses:
Perl 5 avec PerlMagick:
875 789763Je n'ai pas compté la ligne commençant par
sub w
, qui sert à trier les positions sur la distance au centre pour privilégier les solutions compactes (fonctionne désormais correctement). Dans cette version, la fermeture est évitée comme demandé mais je trouve le contraire plus intéressant et plus fidèle au jeu. Pour y parvenir, changez la ligne$s=$t if!grep...
en$s=$t if grep...
.Utilisation:
perl car.pl board.png tile.png
. Résultat stocké danscar.png
. Le statut de sortie est 1 si la tuile n'a pas pu être placée.Script pour exécuter un jeu complet. Il suppose que le code ci - dessus est dans le fichier
car.pl
et les carreaux sont stockés dans letiles
répertoire nommé01.png
à25.png
.Cela fonctionne assez lentement maintenant. 8-12 minutes sur ma machine. Avec fermeture préférée: Avec fermeture évitée (notez que rien n'est fermé).
la source
Lisp commun,
26502221199211861111 octetsMise à jour: golf "facile" maintenant terminé, les gains supplémentaires nécessiteront des changements plus importants.Mise à jour 2: Avec la concurrence de plus en plus féroce, la nouvelle version ne favorise plus les positions à l'intérieur du rectangle du terrain de jeu actuel (qui serait de 57 octets supplémentaires). Cette option, ainsi qu'une simple optimisation de la vitesse, sont activées par défaut dans la version téléchargeable avec le simulateur, mais pas dans la réponse officielle ci-dessous.Mise à jour 3: modifications mineures de l'interface pour les gains de comptage d'octets majeurs.
J'ai également créé une interface utilisateur Web simple. Le package complet (un seul fichier LISP et les images des tuiles) peut être téléchargé ici . Pour l' essayer, installer
hunchentoot
,zpng
etpng-read
avec quiclisp, chargezcarcassonne.lisp
et connectez - vouslocalhost:8080
. Le code a été testé sur CCL / Windows et SBCL / Linux. Les bibliothèques mentionnées ci-dessus ne sont nécessaires que pour la partie UI / simulateur; la solution elle-même est un simple Lisp commun ANSI.Tous les sauts de ligne et les espacements de début de ligne sont uniquement destinés aux cosmétiques, pour garantir la lisibilité, et ne sont pas pris en compte dans la somme totale.
Vous devez appeler la fonction
c
avec deux arguments: le champ de jeu actuel et la tuile à placer. Les deux doivent être des tableaux 2D; la tuile 55x55 et le champ un multiple de cela. De plus, la matrice de champs doit être réglable. La fonction renvoie une liste à deux éléments avec le nouveau champ comme premier argument. Le deuxième élément estNIL
si la tuile ne peut pas être placée, ou sinon une liste contenant les coordonnées en haut à gauche et la rotation de la dernière tuile sur ce tableau et le score pour cette tuile. Ces informations peuvent être utilisées à des fins de visualisation.Notez que dans les appels ultérieurs, vous devez utiliser le nouveau champ renvoyé par
c
même si le deuxième élément de la liste l'estNIL
(le tableau d'origine peut avoir étéadjust-array
modifié et donc invalidé).Le code est maintenant un peu lent, l'optimisation du nombre d'octets entraînant des calculs redondants. L'exemple ci-dessous s'est terminé en environ trois minutes sur mon système.
Exemple d'exécution pour les 85 tuiles:
Capture d'écran de l'interface utilisateur Web:
la source
DarkBASIC Pro:
207819321744 octetsMISE À JOUR: juste plus d'efforts de golf
MISE À JOUR: Répond maintenant pleinement aux spécifications, y compris en préférant les choix non fermés.
J'ai choisi DarkBASIC parce que bien qu'il soit assez verbeux, il fournit un jeu de commandes extrêmement direct et simple pour manipuler les images.
J'ai téléchargé un EXE pour les personnes qui n'ont pas le compilateur DarkBASIC ( Windows ).
la source