Tout le monde veut toujours implémenter Game of Life de Conway. C'est ennuyant! Faisons plutôt des flics et des voleurs!
Vous aurez deux équipes: les flics et les voleurs. Chaque équipe compte 5 membres avec 50 points de vie chacun. Le programme sera bouclé en continu. À chaque itération, les événements suivants se produisent:
Pour chaque équipe, imprimez la première lettre (
C
pour les flics,R
pour les voleurs), un espace, une liste des HP des membres séparés par un espace et une nouvelle ligne. Ceci est le statut des équipes. Une fois les deux terminés, imprimez une autre nouvelle ligne. Par exemple, voici à quoi cela pourrait ressembler au premier tour:C 50 50 50 50 50 R 50 50 50 50 50
Choisissez un nombre aléatoire de 1 à 10 (y compris 1 et 10). Nous appellerons le numéro
N
. SiN
c'est égal, les voleurs perdent ce tour; si c'est étrange, les flics perdent.Choisissez un membre aléatoire de l'équipe perdante dont les HP sont supérieurs à 0 et déduisez les
N
HP. Les HP des membres ne devraient jamais apparaître en dessous de 0 sur le statut.Redémarrez la boucle.
Le jeu se termine lorsque tous les membres d'une équipe perdent tous leurs PV. Ensuite, ce qui suit sera imprimé si les flics gagnent:
C+
R-
et si les voleurs gagnent:
R+
C-
C'est le golf de code, donc le plus petit nombre de personnages gagne.
Voici un exemple d'implémentation dans Python 2:
import random
cops = [50]*5
robbers = [50]*5
while any(cops) and any(robbers):
# print the status
print 'C', ' '.join(map(str, cops))
print 'R', ' '.join(map(str, robbers))
print
# pick N
N = random.randint(1, 10)
# pick the losing team (robbers if N is even, else cops)
losers = robbers if N % 2 == 0 else cops
# pick a member whose HP is greater than 0
losing_member = random.choice([i for i in range(len(losers)) if losers[i]])
losers[losing_member] -= N
# make sure the HP doesn't visibly drop below 0
if losers[losing_member] < 0: losers[losing_member] = 0
if any(cops):
# robbers lost
print 'C+'
print 'R-'
elif any(robbers):
# cops lost
print 'C-'
print 'R+'
game-of-life
.cops-and-robbers
!Réponses:
CJam, 86 octets
Je suis un peu en retard à la fête, mais j'apporte le cadeau de CJam! ... Hé, attends, où vas-tu?
Essayez-le en ligne.
Explication
Comme la question demande d'imiter un processus simple, c'est une réponse relativement simple. Peut-être qu'un choix intéressant que j'ai fait a été de maintenir la santé des deux équipes entrelacées dans la même liste. Cela coûte 3 octets pour se convertir en deux listes distinctes, ce qui est nécessaire à la fois pour afficher la santé et vérifier si une équipe a perdu. Mais (je pense) cela est compensé par les 2 octets enregistrés dans l'initialisation et la logique de traitement des dommages beaucoup plus simple.
la source
R - 201
la source
rep(which(x>0),2)
par opposition à justewhich(x>0)
?sum(R*C)
et cesum(R)*sum(C)
n'est pas la même chose. Par exemple, vous ne voudriez pas quitter si C = c (0,0,0,10,10) et R = c (10, 10, 10, 0, 0). Dans ce cas, je sauvegarde en affectantS=sum
. 3) Le problème avecsample
est que si le premier argument est un seul nombre, par exemplesample(5, 1)
, alors ce sera la même chose que fairesample(1:5, 1)
: au lieu de toujours retourner5
, il retournera n'importe quel nombre de1
à5
. Il ensample(rep(x, 2), 1)
est de même de mon astuce pour toujours choisir un nombre parmix
même dans le cas où l'length(x)
est1
.APL (Dyalog) (101)
Explication:
S←2 5⍴50
: au début, définiS
sur une matrice 5 par 2 où chaque valeur est 50. La ligne supérieure de la matrice représente les flics, la deuxième ligne représente les voleurs.J←∨/S>0
: pour chaque ligne de la matrice, indiquezJ
si l'un des HP est supérieur à zéro.→6/⍨~∧/J
: si les deux équipes n'ont pas de membres vivants, passez à la ligne 6. (fin)⎕←3↑'CR',0⌈S
: pour chaque valeur de la matrice, sortez-en le maximum et 0, ajoutez un «C» à la première ligne et un «R» à la seconde, et ajoutez une troisième ligne (vide).N←?10
: obtenir un nombre aléatoire dans l'intervalle [1,10] et le stockerN
.L←1+~2⊤N
: définissezL
(l'équipe perdante)1
si le nombre était impair et2
s'il était pair.M←(0<S[L
...;])/⍳5
: récupérez les indices des membres vivants de cette équipe et stockez-les dansM
M[?⍴M
...]
: sélectionnez une valeur aléatoire dansM
S[L;M
...]-←N
: soustraireN
de la valeur du membre de l'équipe sélectionné→2
: passez à la ligne 2 (le test pour les membres vivants)⎕←'CR',⍪'+-'⌽⍨J⍳0
: affiche le statut final en plaçant le+
devant de l'équipe gagnante et le-
devant de l'équipe perdante.Exemple de sortie
la source
Rubis, 184
la source
Mathematica,
246241 octetsPourrait probablement être joué au golf plus loin ...
la source
PHP - 416 octets
Je suis nouveau au golf et bien que ce défi soit assez facile à essayer. Voici donc ce que j'ai trouvé.
Avec explication:
la source
!= 0
et en remplaçant le chèque pour être égal à zéro par l'opérateur not (!array_sum($r)
).C,
390384371 octetsMon premier golf, s'il y a des améliorations possibles, dites-le moi :)
version golfée:
version quelque peu non golfée:
edit: j'ai trouvé un moyen de le raccourcir un peu et j'ai corrigé un petit bug
la source
for(j=0;j<10;j++)
) par une version plus courte (for(j=10;--j;)
).Lot - 396 octets
Je ne sais pas si cela compte techniquement - car il ne sélectionne pas réellement un membre aléatoire de l'équipe dont la santé est supérieure à 0 . Il sélectionne simplement un membre aléatoire, et si la soustraction de santé génère un nombre inférieur à 0, alors le nombre devient 0 ..
la source
Javascript: 410
la source
Octave,
182177158145octets145:
J'ai renoncé à vérifier si le tournage du personnage est supérieur à zéro - cela ne serait significatif que si nous étions obligés d'afficher l'état à chaque tour - ici, nous sautons simplement un nombre aléatoire de RNG, ce qui le rend plus aléatoire.
Aussi, remplacé
avec plus court
[note - il imprime 'C + R-' sans la nouvelle ligne - il est corrigé dans la version 145 octets]
158:
Dégolfé:
J'ai changé
repmat(50,5,2)
pourrepmat(5)
- nous avons donc une matrice 5x5 au lieu de 5x2 maintenant (les 3 colonnes supplémentaires n'affectent pas l'algorithme). J'ai également trouvé un moyen de compresser la sortie.177:
Dégolfé:
Fondamentalement, nous créons une matrice 5x2, où la première colonne sont des flics et la deuxième colonne sont des voleurs:
La
sum
fonction lorsqu'un argument appliqué fait une somme par colonnes, c'est donc initialement:Lorsque l'un d'eux atteint zéro, l'
prod(sum(t))
évalue à zéro en rompant la boucle. Ensuite, nous pouvons examiner qui a gagné en vérifiant dont la colonne est égale à zéro.la source