Todo mundo sempre quer implementar o Jogo da Vida de Conway. Isto é chato! Vamos fazer policiais e ladrões!
Você terá duas equipes: os policiais e os ladrões. Cada equipe tem 5 membros com 50 pontos de vida cada. O programa fará um loop contínuo. A cada iteração, ocorrerá o seguinte:
Para cada equipe, imprima a primeira carta (
C
para os policiais,R
para os assaltantes), um espaço, uma lista separada por espaços do HP dos membros e uma nova linha. Este é o status das equipes. Depois que os dois estiverem prontos, imprima outra nova linha. Por exemplo, eis a aparência da primeira rodada:C 50 50 50 50 50 R 50 50 50 50 50
Escolha um número aleatório de 1 a 10 (incluindo 1 e 10). Vamos ligar para o número
N
. SeN
for par, os ladrões perdem esta rodada; se estranho, a polícia perde.Escolha um membro aleatório da equipe perdida cujo HP seja maior que 0 e deduza o
N
HP. O HP dos membros nunca deve aparecer abaixo de 0 no status.Reinicie o loop.
O jogo termina quando todos os membros de uma equipe perdem todo o HP. Em seguida, o seguinte será impresso se os policiais vencerem:
C+
R-
e se os ladrões vencerem:
R+
C-
Isso é código de golfe, então o menor número de caracteres vence.
Aqui está uma implementação de exemplo no 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
!Respostas:
CJam, 86 bytes
Estou um pouco atrasado para a festa, mas trago o presente de CJam! ... Ei, espere, onde você está indo?
Experimente online.
Explicação
Como as perguntas pedem para imitar um processo direto, essa é uma resposta relativamente direta. Talvez uma escolha interessante que fiz foi manter a saúde de ambas as equipes intercaladas na mesma lista. Isso custa 3 bytes para converter em duas listas separadas, necessárias para a saúde exibir e verificar se uma equipe perdeu. Mas (eu acho) isso é compensado pelos 2 bytes salvos na inicialização e pela lógica muito mais simples de lidar com danos.
fonte
R - 201
fonte
rep(which(x>0),2)
oposto de apenaswhich(x>0)
?sum(R*C)
esum(R)*sum(C)
não são a mesma coisa. Por exemplo, você não gostaria de sair se C = c (0,0,0,10,10) e R = c (10, 10, 10, 0, 0). Nesse caso, eu salvo atribuindoS=sum
. 3) O problemasample
é que, se o primeiro argumento for um único número, por exemplosample(5, 1)
, será o mesmo que fazersample(1:5, 1)
: em vez de sempre retornar5
, ele retornará qualquer número de1
para5
. Assimsample(rep(x, 2), 1)
é o meu truque para sempre escolher um número,x
mesmo no caso em quelength(x)
é1
.APL (Dyalog) (101)
Explicação:
S←2 5⍴50
: no início, definaS
uma matriz de 5 por 2, em que cada valor é 50. A linha superior da matriz representa os policiais, a segunda linha representa os ladrões.J←∨/S>0
: para cada linha da matriz, armazeneJ
se algum dos HPs é maior que zero.→6/⍨~∧/J
: se as duas equipes não tiverem membros vivos, pule para a linha 6. (final)⎕←3↑'CR',0⌈S
: para cada valor na matriz, imprima o máximo e 0, coloque um 'C' na primeira linha e um 'R' na segunda e adicione uma terceira linha (vazia).N←?10
: obtenha um número aleatório no intervalo [1,10] e armazene-oN
.L←1+~2⊤N
: definaL
(o time perdedor) como1
se o número era ímpar e2
se era par.M←(0<S[L
...;])/⍳5
: obtenha os índices dos membros vivos dessa equipe e armazene-os emM
M[?⍴M
...]
: selecione um valor aleatório deM
S[L;M
...]-←N
: subtrairN
do valor do membro da equipe selecionado→2
: pule para a linha 2 (o teste para membros vivos)⎕←'CR',⍪'+-'⌽⍨J⍳0
: gera o status final, colocando+
na frente da equipe vencedora e-
na frente da equipe perdida.Saída de amostra
fonte
Ruby, 184
fonte
Mathematica,
246241 bytesProvavelmente poderia ser jogado ainda mais ...
fonte
PHP - 416 bytes
Sou novo no golfe e, embora esse desafio seja fácil o suficiente para testá-lo. Então aqui está o que eu criei.
Com explicação:
fonte
!= 0
e substituindo a verificação por ser igual a zero pelo operador not (!array_sum($r)
).C,
390384371 bytesMeu primeiro golfe, se houver alguma melhoria possível, é só me dizer :)
versão golfed:
versão um pouco não destruída:
edit: Encontrei uma maneira de encurtar um pouco e corrigi um pequeno bug
fonte
for(j=0;j<10;j++)
) por uma versão mais curta (for(j=10;--j;)
).Lote - 396 bytes
Não sei se isso conta tecnicamente - pois, na verdade, ele não seleciona um membro aleatório da equipe cuja saúde é maior que 0 . Apenas seleciona um membro aleatório e, se a subtração de integridade gerar um número menor que 0, o número se tornará 0.
fonte
Javascript: 410
fonte
Oitava,
182177158151bytes145:
Eu desisti de checar se o tiro do personagem está acima de zero - isso só seria significativo se fôssemos forçados a exibir o estado em cada turno - aqui estamos pulando aleatoriamente um número aleatório do RNG, tornando-o mais aleatório.
Além disso, substituiu
com mais curto
[note - está imprimindo 'C + R-' sem a nova linha - está corrigido na versão de 145 bytes]
158:
Degolfado:
Eu mudei
repmat(50,5,2)
pararepmat(5)
- então temos matriz 5x5 em vez de 5x2 agora (as 3 colunas adicionais não afetam o algoritmo). Eu também encontrei uma maneira de comprimir a saída.177:
Degolfado:
Basicamente, criamos uma matriz 5x2, em que a primeira coluna é policial e a segunda coluna é ladrão:
A
sum
função quando um argumento aplicado faz uma soma por colunas, portanto é inicialmente:Quando um deles chega a zero, o valor é
prod(sum(t))
zero, interrompendo o loop. Depois, podemos examinar quem ganhou a verificação de cuja coluna é igual a zero.fonte