Jeder möchte immer Conways Spiel des Lebens implementieren. Das ist langweilig! Lassen Sie uns stattdessen Polizisten und Räuber machen!
Sie haben zwei Teams: die Bullen und die Räuber. Jedes Team hat 5 Mitglieder mit jeweils 50 Gesundheit. Das Programm wird kontinuierlich wiederholt. Bei jeder Iteration wird Folgendes ausgeführt:
Drucken Sie für jedes Team den ersten Buchstaben (
C
für die Polizei,R
für die Räuber), ein Leerzeichen, eine durch Leerzeichen getrennte Liste der HP der Mitglieder und eine neue Zeile. Dies ist der Status der Teams. Nachdem beide erledigt sind, drucken Sie eine weitere Zeile. So könnte es beispielsweise in der ersten Runde aussehen:C 50 50 50 50 50 R 50 50 50 50 50
Wählen Sie eine Zufallszahl von 1 bis 10 (einschließlich 1 und 10). Wir rufen die Nummer an
N
. WennN
es gerade ist, verlieren die Räuber diese Runde; Wenn es seltsam ist, verlieren die Bullen.Wählen Sie ein zufälliges Mitglied des verlierenden Teams aus, dessen HP größer als 0 sind, und ziehen Sie die
N
HP ab. Die HP der Mitglieder sollten im Status niemals unter 0 fallen.Starten Sie die Schleife neu.
Das Spiel endet, wenn alle Mitglieder eines Teams alle HP verlieren. Dann wird Folgendes gedruckt, wenn die Polizei gewinnt:
C+
R-
und wenn die Räuber gewinnen:
R+
C-
Dies ist Code Golf, also gewinnt die kürzeste Anzahl von Charakteren.
Hier ist eine Beispielimplementierung in 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
!Antworten:
CJam, 86 Bytes
Ich bin etwas spät zur Party, aber ich bringe das Geschenk von CJam! ... Hey warte, wohin gehst du?
Probieren Sie es online aus.
Erläuterung
Da die Fragen einen einfachen Prozess nachahmen sollen, ist dies eine relativ einfache Antwort. Vielleicht war eine interessante Entscheidung, die ich getroffen habe, die Gesundheit beider Teams in derselben Liste zu verankern. Die Konvertierung in zwei separate Listen kostet 3 Byte. Dies wird sowohl für die Anzeige des Zustands als auch für die Überprüfung, ob ein Team verloren hat, benötigt. Aber (ich denke) dies wird durch die 2 Bytes ausgeglichen, die bei der Initialisierung eingespart wurden, und durch eine viel einfachere Logik, die Schaden verursacht.
quelle
R - 201
quelle
rep(which(x>0),2)
im Gegensatz zu nurwhich(x>0)
?sum(R*C)
undsum(R)*sum(C)
sind nicht dasselbe. Zum Beispiel möchten Sie nicht beenden, wenn C = c (0,0,0,10,10) und R = c (10, 10, 10, 0, 0). In diesem Fall speichere ich durch ZuweisenS=sum
. 3) Das Problem dabeisample
ist, dass wenn das erste Argument eine einzelne Zahl ist, z. B.sample(5, 1)
dasselbe wie folgtsample(1:5, 1)
: Anstatt immer zurückzukehren5
, wird eine beliebige Zahl von1
bis zurückgegeben5
. Sosample(rep(x, 2), 1)
ist mein Trick, immer eine Zahl unter zu wählen,x
selbst wenn es solength(x)
ist1
.APL (Dyalog) (101)
Erläuterung:
S←2 5⍴50
: Stellen Sie zu BeginnS
eine 5-mal-2-Matrix ein, in der jeder Wert 50 beträgt. Die oberste Zeile der Matrix repräsentiert die Bullen, die zweite Reihe die Räuber.J←∨/S>0
: Speichern Sie für jede Zeile der Matrix,J
ob eine der HP größer als Null ist.→6/⍨~∧/J
: Wenn nicht beide Teams lebende Mitglieder haben, springe zu Zeile 6. (Ende)⎕←3↑'CR',0⌈S
: Geben Sie für jeden Wert in der Matrix das Maximum und 0 aus, stellen Sie der ersten Zeile ein 'C' und der zweiten ein 'R' voran und fügen Sie eine dritte (leere) Zeile hinzu.N←?10
: Holen Sie sich eine Zufallszahl im Intervall [1,10] und speichern Sie sie inN
.L←1+~2⊤N
: setzeL
(das verlierende Team) auf,1
ob die Zahl ungerade und2
ob sie gerade war.M←(0<S[L
...;])/⍳5
: Holen Sie sich die Indizes der lebenden Mitglieder dieses Teams und speichern Sie sie inM
M[?⍴M
...]
: Wählen Sie einen zufälligen Wert ausM
S[L;M
...]-←N
:N
vom Wert des ausgewählten Teammitglieds abziehen→2
: Springe zu Zeile 2 (der Test für lebende Mitglieder)⎕←'CR',⍪'+-'⌽⍨J⍳0
: Geben Sie den endgültigen Status aus und stellen Sie ihn+
vor das Gewinnerteam und-
vor das Verliererteam.Beispielausgabe
quelle
Ruby, 184
quelle
Mathematica,
246241 BytesKönnte wahrscheinlich weiter Golf gespielt werden ...
quelle
PHP - 416 Bytes
Ich bin neu im Golfen und obwohl diese Herausforderung einfach genug wäre, um sie auszuprobieren. Also hier ist, was ich mir ausgedacht habe.
Mit Erklärung:
quelle
!= 0
indem Sie die Prüfung auf Null durch den Operator not (!array_sum($r)
) entfernen und ersetzen .C
390384371 BytesMein erster Golf, wenn es irgendwelche möglichen Verbesserungen gibt, sag es mir einfach :)
Golfversion:
etwas ungolfed Version:
edit: Ich habe einen Weg gefunden, es ein wenig zu verkürzen und einen kleinen Fehler behoben
quelle
for(j=0;j<10;j++)
) durch eine kürzere Version (for(j=10;--j;)
) ersetzen .Stapel - 396 Bytes
Ich weiß nicht, ob dies technisch zählt - da es kein zufälliges Mitglied des Teams auswählt , dessen Gesundheit größer als 0 ist . Es wird nur ein zufälliges Mitglied ausgewählt. Wenn die Gesundheitssubtraktion eine Zahl kleiner als 0 generiert, wird die Zahl zu 0 ..
quelle
Javascript: 410
quelle
Oktave,
182 177 158145 Bytes145:
Ich habe es aufgegeben zu überprüfen, ob die Charakteraufnahme über Null liegt - dies wäre nur dann von Bedeutung, wenn wir gezwungen wären, den Status in jeder Runde anzuzeigen - hier überspringen wir nur zufällig eine Zufallszahl aus RNG, um sie zufälliger zu machen.
Auch ersetzt
mit kürzeren
[Hinweis - es wird 'C + R-' ohne den Zeilenumbruch gedruckt - es ist in der 145-Byte-Version behoben]
158:
Degolfed:
Ich habe
repmat(50,5,2)
zurepmat(5)
- also haben wir jetzt eine 5x5-Matrix anstelle von 5x2 (die zusätzlichen 3 Spalten haben keinen Einfluss auf den Algorithmus). Ich habe auch einen Weg gefunden, die Ausgabe zu komprimieren.177:
Degolfed:
Grundsätzlich erstellen wir eine 5x2-Matrix, in der die erste Spalte Polizisten und die zweite Spalte Räuber sind:
Die
sum
Funktion, wenn ein Argument angewendet wird, ergibt eine Summe aus Spalten.Wenn einer von ihnen Null erreicht, ergibt der
prod(sum(t))
Wert Null, wodurch die Schleife unterbrochen wird. Dann können wir untersuchen, wer gewonnen hat und wessen Spalte auf Null summiert.quelle