Todos siempre quieren implementar el Juego de la vida de Conway. ¡Eso es aburrido! ¡Hagamos policías y ladrones en su lugar!
Tendrás dos equipos: los policías y los ladrones. Cada equipo tiene 5 miembros con 50 de salud cada uno. El programa se repetirá continuamente. Cada iteración, ocurrirá lo siguiente:
Para cada equipo, imprime la primera carta (
C
para los policías,R
para los ladrones), un espacio, una lista separada por espacios de los HP de los miembros y una nueva línea. Este es el estado de los equipos. Después de que ambos estén listos, imprima otra nueva línea. Por ejemplo, esto es lo que podría parecer la primera ronda:C 50 50 50 50 50 R 50 50 50 50 50
Elija un número aleatorio del 1 al 10 (incluidos 1 y 10). Llamaremos al número
N
. SiN
es par, los ladrones pierden esta ronda; si es extraño, la policía pierde.Elija un miembro aleatorio del equipo perdedor cuyo HP sea mayor que 0 y deduzca
N
HP. El HP de los miembros nunca debería aparecer debajo de 0 en el estado.Reinicia el bucle.
El juego termina cuando todos los miembros de un equipo pierden todos sus HP. Luego, se imprimirá lo siguiente si la policía gana:
C+
R-
y si los ladrones ganan:
R+
C-
Este es el código de golf, por lo que gana el menor número de caracteres.
Aquí hay una implementación de muestra en 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
!Respuestas:
CJam, 86 bytes
Llego un poco tarde a la fiesta, ¡pero les traigo el regalo de CJam! ... Hey, espera, ¿a dónde vas?
Pruébalo en línea.
Explicación
Como las preguntas piden emular un proceso sencillo, esta es una respuesta relativamente sencilla. Quizás una elección interesante que hice fue mantener la salud de ambos equipos intercalados en la misma lista. Esto cuesta 3 bytes para convertirlo en dos listas separadas, lo cual es necesario tanto para mostrar la salud como para verificar si un equipo ha perdido. Pero (creo) esto se compensa con los 2 bytes guardados en la inicialización y una lógica mucho más simple de reparación de daños.
fuente
R - 201
fuente
rep(which(x>0),2)
opuesto a lo justowhich(x>0)
?sum(R*C)
ysum(R)*sum(C)
no son lo mismo. Por ejemplo, no querrá salir si C = c (0,0,0,10,10) y R = c (10, 10, 10, 0, 0). En ese caso, guardo asignandoS=sum
. 3) El problema consample
es que si el primer argumento es un número único, por ejemplosample(5, 1)
, será lo mismo que hacerlosample(1:5, 1)
: en lugar de devolver siempre5
, devolverá cualquier número de1
a5
. Asísample(rep(x, 2), 1)
es mi truco para elegir siempre un númerox
incluso en el caso cuandolength(x)
es1
.APL (Dyalog) (101)
Explicación:
S←2 5⍴50
: al principio, establezcaS
una matriz de 5 por 2 donde cada valor sea 50. La fila superior de la matriz representa a los policías, la segunda fila representa a los ladrones.J←∨/S>0
: para cada fila de la matriz, almaceneJ
si alguno de los HP es mayor que cero.→6/⍨~∧/J
: si no ambos equipos tienen miembros vivos, salte a la línea 6. (final)⎕←3↑'CR',0⌈S
: para cada valor en la matriz, genere el máximo y 0, anteponga una 'C' a la primera fila y una 'R' a la segunda, y agregue una tercera línea (vacía).N←?10
: obtenga un número aleatorio en el intervalo [1,10] y guárdeloN
.L←1+~2⊤N
: estableceL
(el equipo perdedor) en1
si el número era impar y2
si era par.M←(0<S[L
...;])/⍳5
: obtenga los índices de los miembros vivos de ese equipo y guárdelos enM
M[?⍴M
...]
: seleccione un valor aleatorio deM
S[L;M
...]-←N
: restarN
del valor del miembro del equipo seleccionado→2
: salte a la línea 2 (la prueba para miembros vivos)⎕←'CR',⍪'+-'⌽⍨J⍳0
: muestra el estado final, colocando el+
frente del equipo ganador y el-
frente del equipo perdedor.Salida de muestra
fuente
Rubí, 184
fuente
Mathematica,
246241 bytesProbablemente podría jugar más golf ...
fuente
PHP - 416 bytes
Soy nuevo en el golf y, aunque este desafío sería lo suficientemente fácil como para probarlo. Así que aquí está lo que se me ocurrió.
Con explicación:
fuente
!= 0
y reemplazar la verificación para que sea igual a cero con el operador no (!array_sum($r)
).C,
390384371 bytesMi primer golf, si hay posibles mejoras, solo dime :)
versión de golf:
versión un tanto sin golf:
editar: encontré una manera de acortarlo un poco y solucioné un pequeño error
fuente
for(j=0;j<10;j++)
) con una versión más corta (for(j=10;--j;)
).Lote: 396 bytes
No sé si esto técnicamente cuenta, ya que en realidad no selecciona a un miembro aleatorio del equipo cuya salud sea mayor que 0 . Simplemente selecciona un miembro aleatorio, y si la resta de salud genera un número menor que 0, el número se convierte en 0.
fuente
Javascript: 410
fuente
Octava,
182177158145bytes145:
Dejé de verificar si el disparo del personaje está por encima de cero, esto solo sería significativo si nos viéramos obligados a mostrar el estado en cada turno, aquí solo estamos saltando aleatoriamente un número aleatorio de RNG, haciéndolo más aleatorio.
Además, reemplazado
con más corto
[nota: está imprimiendo 'C + R-' sin la nueva línea; está arreglado en la versión de 145 bytes]
158:
Degolfed:
Cambié
repmat(50,5,2)
arepmat(5)
, por lo que ahora tenemos una matriz de 5x5 en lugar de 5x2 (las 3 columnas adicionales no afectan el algoritmo). También encontré una forma de comprimir la salida.177:
Degolfed:
Básicamente, creamos una matriz de 5x2, donde la primera columna son policías y la segunda columna son ladrones:
La
sum
función cuando se aplica un argumento hace una suma por columnas, por lo que inicialmente es:Cuando uno de ellos llega a cero, se
prod(sum(t))
evalúa a cero rompiendo el ciclo. Luego podemos examinar quién ganó comprobando qué columna suma cero.fuente