Każdy zawsze chce wdrożyć grę życia Conwaya. To jest nudne! Zamiast tego zróbmy gliniarzy i złodziei!
Będziesz miał dwie drużyny: gliny i złodziei. Każda drużyna ma 5 członków o 50 zdrowiu. Program będzie się powtarzał w sposób ciągły. Po każdej iteracji wystąpią:
Dla każdej drużyny wydrukuj pierwszą literę (
C
dla gliniarzy,R
dla złodziei), spację, rozdzieloną spacjami listę HP członków i nową linię. To jest status zespołów. Po zakończeniu obu wydrukuj kolejny nowy wiersz. Na przykład, oto jak może to wyglądać w pierwszej rundzie:C 50 50 50 50 50 R 50 50 50 50 50
Wybierz losową liczbę od 1 do 10 (w tym zarówno 1, jak i 10). Zadzwonimy pod ten numer
N
. JeśliN
jest parzysty, złodzieje przegrywają tę rundę; jeśli dziwne, gliny przegrywają.Wybierz losowego członka przegranej drużyny, którego HP jest większe niż 0 i odejmij
N
HP. Punkty życia członków nigdy nie powinny pojawiać się poniżej statusu 0.Uruchom ponownie pętlę.
Gra kończy się, gdy wszyscy członkowie jednej drużyny stracą całe swoje HP. Następnie, jeśli policjanci wygrają, zostaną wydrukowane następujące informacje:
C+
R-
a jeśli złodzieje wygrają:
R+
C-
To jest golf golfowy, więc wygrywa najmniejsza liczba znaków.
Oto przykładowa implementacja w 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
!Odpowiedzi:
CJam, 86 bajtów
Jestem trochę spóźniony na imprezę, ale przynoszę prezent CJam! ... Hej czekaj, gdzie idziesz?
Wypróbuj online.
Wyjaśnienie
Ponieważ pytania wymagają naśladowania prostego procesu, jest to stosunkowo prosta odpowiedź. Być może jednym z interesujących wyborów było utrzymanie zdrowia obu drużyn na tej samej liście. To kosztuje 3 bajty do konwersji na dwie osobne listy, co jest potrzebne zarówno do wyświetlania stanu zdrowia, jak i sprawdzania, czy zespół przegrał. Ale (tak sądzę) nadrabiają to 2 bajty zapisane podczas inicjalizacji i znacznie prostsza logika zadawania obrażeń.
źródło
R - 201
źródło
rep(which(x>0),2)
przeciwieństwie do sprawiedliwegowhich(x>0)
?sum(R*C)
isum(R)*sum(C)
nie są tym samym. Na przykład nie chcesz wychodzić, jeśli C = c (0,0,0,10,10) i R = c (10, 10, 10, 0, 0). W takim przypadku oszczędzam, przypisującS=sum
. 3) Problemsample
polega na tym, że jeśli pierwszy argument jest pojedynczą liczbą, npsample(5, 1)
. Będzie to to samo, co działaniesample(1:5, 1)
: zamiast zawsze zwracać5
, zwróci dowolną liczbę od1
do5
. Takasample(rep(x, 2), 1)
jest moja sztuczka polegająca na tym, że zawsze wybieram liczbę,x
nawet w przypadku, gdylength(x)
jest1
.APL (Dyalog) (101)
Wyjaśnienie:
S←2 5⍴50
: na początku ustawS
na matrycę 5 na 2, gdzie każda wartość wynosi 50. Górny rząd matrycy reprezentuje gliniarzy, drugi rząd reprezentuje złodziei.J←∨/S>0
: dla każdego wiersza macierzy zapisz,J
czy którykolwiek z HP jest większy od zera.→6/⍨~∧/J
: jeśli nie obie drużyny mają żywych członków, przeskocz do linii 6. (koniec)⎕←3↑'CR',0⌈S
: dla każdej wartości w macierzy, wypisz jej maksimum i 0, wstaw „C” do pierwszego wiersza i „R” do drugiego i dodaj trzeci (pusty) wiersz.N←?10
: uzyskaj losową liczbę w przedziale [1,10] i zapisz jąN
.L←1+~2⊤N
: ustawL
(drużyna przegrywająca),1
czy liczba była nieparzysta i2
czy była parzysta.M←(0<S[L
...;])/⍳5
: pobierz indeksy żywych członków tego zespołu i zapisz jeM
M[?⍴M
...]
: wybierz losową wartość zM
S[L;M
...]-←N
: odejmijN
od wartości wybranego członka zespołu→2
: przeskocz do linii 2 (test dla żywych członków)⎕←'CR',⍪'+-'⌽⍨J⍳0
: generuje końcowy status, stawiając+
przed drużyną zwycięską i-
przed drużyną przegrywającą.Próbka wyjściowa
źródło
Ruby, 184
źródło
Mathematica,
246241 bajtówPrawdopodobnie można by dalej grać w golfa ...
źródło
PHP - 416 bajtów
Jestem nowym golfistą i choć to wyzwanie byłoby wystarczająco łatwe, aby je wypróbować. Oto co wymyśliłem.
Z wyjaśnieniem:
źródło
!= 0
i zastępując czek równy zeru operatorem not (!array_sum($r)
).C,
390384371 bajtówMój pierwszy golf, jeśli są jakieś możliwe ulepszenia, po prostu powiedz mi :)
wersja golfowa:
nieco nie golfowa wersja:
edytuj: Znalazłem sposób na jego skrócenie i naprawiłem mały błąd
źródło
for(j=0;j<10;j++)
) Krótszą wersją (for(j=10;--j;)
).Partia - 396 bajtów
Nie wiem, czy to się liczy technicznie - ponieważ tak naprawdę nie wybiera losowego członka zespołu, którego zdrowie jest większe niż 0 . Po prostu wybiera losowego członka, a jeśli odejmowanie zdrowia generuje liczbę mniejszą niż 0, wówczas liczba staje się 0.
źródło
JavaScript: 410
źródło
Oktawa,
182 177 158145 bajtów145:
Zrezygnowałem z sprawdzania, czy strzelanie do postaci jest powyżej zera - byłoby to znaczące tylko, gdybyśmy byli zmuszeni wyświetlać stan w każdej turze - tutaj po prostu losowo pomijamy jedną liczbę losową z RNG, co czyni ją bardziej losową.
Również zastąpiony
z krótszym
[uwaga - drukuje „C + R-” bez nowej linii - jest naprawiony w wersji 145-bajtowej]
158:
Degolfed:
Zmieniłem
repmat(50,5,2)
narepmat(5)
- więc mamy teraz macierz 5x5 zamiast 5x2 (dodatkowe 3 kolumny nie wpływają na algorytm). Znalazłem również sposób na skompresowanie wyjścia.177:
Degolfed:
Zasadniczo tworzymy macierz 5x2, w której pierwsza kolumna to gliniarze, a druga kolumna to rabusie:
sum
Funkcja gdy zastosowano jeden argument sprawia sumę kolumnami, dlatego początkowo:Gdy jeden z nich osiągnie zero,
prod(sum(t))
wartość do zera przerywa pętlę. Następnie możemy sprawdzić, kto wygrał, sprawdzając, którego kolumna sumuje się do zera.źródło