introduction
Connect Four est un jeu où vous essayez d'en obtenir quatre de suite: horizontalement, verticalement ou en diagonale. Dans ce code de golf, nous allons essayer de trouver qui a gagné, avec un plateau de jeu. Il y aura toujours un gagnant et un seul gagnant.
Tâche
Étant donné un tableau Connect Four, déterminez qui est le gagnant: X
ou Y
. Il y aura toujours un gagnant et un seul gagnant. La taille du plateau sera toujours de 6 par 7 comme la façon dont le plateau de jeu est dans l'image.
Étant donné un tableau, le tableau suivant, dans ce cas, X
est rouge et Y
bleu:
Votre contribution serait:
OOOOOOO
OOOOOOO
OOOOOOO
OOOOXOO
OOOXXOO
OOXYYYY
Vous pouvez séparer les lignes du jeu par un caractère de nouvelle ligne (comme ci-dessus), pas de caractère de division, diviser les lignes en un tableau ou une liste, ou vous pouvez saisir une matrice de caractères.
Sortie correcte pour cet exemple:
Y
Y en a quatre de suite; donc, Y est le gagnant. Donc, nous sortons Y.
Cas de test
Contribution:
OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO
OOYYOOO
OYXXXXO
Production:
X
Contribution:
OOOOOOO
OOOOOOO
OOOOOOO
XXXXOOO
YXYYOOO
YXYYXYX
Production:
X
Contribution:
YXYYXOO
XYXXYOO
XXXYYOO
YYYXXOO
XXYYYYO
XXYYXXO
Production:
Y
Contribution:
OOOOOOO
OOOOOOO
OYOOOOO
OOYOOOO
OOOYOOO
OOOOYOO
Production:
Y
Contribution:
OOOOOOO
OOOOOOO
OYOOOOX
OOYOOOX
OOOXOOX
OXOXYOX
Production:
X
Notation
Le moins d'octets gagne!
Réponses:
Gelée , 19 octets
Essayez-le en ligne!
Le cœur de cette réponse est copié de ma réponse à cette question très similaire .
Explication
Assez simple: nous prenons toutes les lignes, colonnes, diagonales et antidiagonales (comme dans le validateur n-reines), puis prenons toutes les sous-chaînes de longueur 4 de celles-ci, puis les trions de telle sorte que la ligne gagnante de 4 trie la fin. (Nous avons besoin du bris d'égalité au cas où il y en aurait un
OOOO
en plus duXXXX
ouYYYY
.) Prenez le dernier élément du dernier élément, et ce seraX
ouY
selon les besoins.la source
Rétine,
5148 octetsMerci à Martin Ender pour avoir économisé 3 octets
Essayez-le en ligne!
Prend l'entrée comme une liste de lignes séparées par des virgules
la source
(.{7}X){3}|XXX
à(.{7}X|X)\4\4
: tio.run/nexus/retina#fc4xCsMwDAXQPfcI2GC6NDS5QaeipcP/…\4
- vous voulez répéter l'effet de la.{7}
, et non la chaîne correspondante. (Et les groupes d'équilibrage seraient probablement beaucoup trop longs.)Javascript (ES6), 54
55Modifier 1 octet enregistré grâce à @Arnauld
Je vérifie simplement si X est le gagnant, car il y aura toujours un gagnant et un seul gagnant
L'entrée est une chaîne avec n'importe quel séparateur, comme dans la réponse de @ Arnauld
la source
Gelée ,
2522 octetsPrend une liste de chaînes (ou une liste de listes de caractères) formées de
X
,Y
etO
(fonctionnerait également avec des remplacements tels que l'espace a un ordinal inférieur à celui des deux compteurs).Essayez-le en ligne! ou exécutez une version augmentée qui prend une chaîne multiligne.
Comment?
la source
JavaScript (ES6),
777669 octets7 octets enregistrés grâce à Neil
Prend l'entrée comme une chaîne séparée par quelque chose , où quelque chose est essentiellement n'importe quel caractère.
Cas de test
Afficher l'extrait de code
la source
b.match()
? Devrait économiser sur l'RegExp
appel.match()
faisais une conversion implicite versRegExp
. Merci!Python 2 , 143 octets
Prend une liste de chaînes ou une liste de liste de caractères. Codé en dur pour 6 lignes par 7 colonnes, comme le garantit la spécification.
Essayez-le en ligne!
la source
PHP, 71 octets
Version en ligne
la source
Python 2 ,
201143129128107 octetsJ'ai décidé d'ajouter horizontal, vertical et diagonal ensemble dans une liste, puis d'ajouter un incrément, puis de rechercher X pour les fois. Et puisqu'il y aura toujours un gagnant, je peux supposer que Y a gagné si X ne le fait pas. Ce code prend une matrice de toutes les différentes pièces et lieux vides.
Essayez-le en ligne!
Crédits
la source
i:] for
,i, r
,r] for
et1 for
.*(len(m)-1)
pourrait être*~-len(m)
. Comment ça fonctionne.] for
et1 for
sont toujours là.K (ngn / k) ,
5855 octetsEssayez-le en ligne!
{
}
fonction avec argumentx
+!6 7
toutes les paires possibles de 0..5 et 0..6{
}'
pour chacun d'eux4#1-+!3 3
sont 4 des 8 directions ortho-diagonales:(1 1;1 0;1 -1;0 1)
3+[
]\&4
commencez par une liste de quatre zéros (&4
) et faites 3 étapes dans chacune des directionsx+/:/:
partir de chaque position possible et faire les pas dans chaque direction possible,/
enchaîner. à ce stade, nous avons une matrice de 4 listes de paires de coordonnées, certaines s'étendant au-delà du plateaux ./:/:
rechercher les cellules correspondantes dex
88<
lesquels sont"Y"
-s? (88 est le code ascii de"X"
)&/'
quelles 4 listes se composent uniquement de"Y"
-s? (et-réduire-chacun)|/
en existe-t-il au moins un? (ou-réduire)"XY"@
si faux retour"X"
, si vrai retour"Y"
la source
Zsh ,
207 ...159 octetsHistorique des versions: 4 itérations pour ~ 25 octets la première semaine; puis 3 itérations supplémentaires pour ~ 25 octets 6 mois plus tard.
( premier ) ( deuxième ) ( troisième ) ( quatrième ) ( cinquième ) ( sixième )Essayez-le en ligne!Dans le pied de page, j'imprime à la fois la carte d'entrée et le tableau que nous construisons à partir de stderr. Faites défiler vers le bas pour déboguer pour les voir. Le tableau que nous construisons est beaucoup plus long maintenant, car il existe un
t
produit cartésien avec une carte d'entrée à chaque appel. (Hé, cela a raccourci le code de quelques octets.)Il y a beaucoup de choses à couvrir ici, j'ai donc déplacé les commentaires (sixième édition) dans un résumé annoté .
(tl; dr: concaténer les transpositions du tableau d'origine, mais assurez-vous de les garder séparées)
la source