Semua orang selalu ingin menerapkan Game of Conway's Life. Itu membosankan! Mari kita lakukan polisi dan perampok sebagai gantinya!
Anda akan memiliki dua tim: polisi dan perampok. Setiap tim memiliki 5 anggota dengan masing-masing 50 kesehatan. Program akan berulang terus menerus. Setiap iterasi, berikut ini akan terjadi:
Untuk setiap tim, cetak huruf pertama (
C
untuk polisi,R
untuk perampok), spasi, daftar HP anggota yang dipisahkan spasi, dan baris baru. Ini adalah status tim. Setelah keduanya selesai, cetak baris baru lainnya. Misalnya, inilah yang kelihatannya seperti babak pertama:C 50 50 50 50 50 R 50 50 50 50 50
Pilih angka acak dari 1 hingga 10 (termasuk 1 dan 10). Kami akan memanggil nomornya
N
. JikaN
bahkan, perampok kehilangan putaran ini; jika aneh, polisi kalah.Pilih anggota acak dari tim yang kalah yang HP-nya lebih besar dari 0 dan kurangi
N
HP. HP anggota tidak boleh muncul di bawah 0 pada status.Mulai ulang loop.
Permainan berakhir ketika semua anggota satu tim kehilangan semua HP mereka. Kemudian, yang berikut ini akan dicetak jika polisi menang:
C+
R-
dan jika perampok menang:
R+
C-
Ini adalah kode golf, sehingga jumlah karakter terpendek menang.
Berikut ini contoh implementasi dalam 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
!Jawaban:
CJam, 86 byte
Saya agak terlambat ke pesta, tapi saya membawa hadiah CJam! ... Hei tunggu, kemana kamu akan pergi?
Cobalah online.
Penjelasan
Ketika pertanyaan ditanyakan untuk meniru proses langsung, ini adalah jawaban yang relatif langsung. Mungkin satu pilihan menarik yang saya buat adalah menjaga kesehatan kedua tim yang disisipkan dalam daftar yang sama. Biaya ini 3 byte untuk dikonversi ke dua daftar terpisah, yang diperlukan untuk menampilkan kesehatan dan memeriksa apakah tim telah hilang. Tapi (saya pikir) ini dibuat oleh 2 byte yang disimpan dalam inisialisasi dan logika kerusakan-berurusan jauh lebih sederhana.
sumber
R - 201
sumber
rep(which(x>0),2)
bertentangan dengan adilwhich(x>0)
?sum(R*C)
dansum(R)*sum(C)
bukan hal yang sama. Misalnya, Anda tidak ingin keluar jika C = c (0,0,0,10,10) dan R = c (10, 10, 10, 0, 0). Dalam hal ini, saya menyimpan dengan menetapkanS=sum
. 3) Masalahnyasample
adalah bahwa jika argumen pertama adalah angka tunggal, misalnyasample(5, 1)
, maka itu akan sama dengan melakukansample(1:5, 1)
: alih-alih selalu kembali5
, itu akan mengembalikan nomor dari1
ke5
. Jadisample(rep(x, 2), 1)
trik saya untuk selalu memilih nomor kalanganx
bahkan dalam kasus ketikalength(x)
adalah1
.APL (Dyalog) (101)
Penjelasan:
S←2 5⍴50
: pada awalnya, aturS
ke matriks 5-by-2 dengan nilai masing-masing adalah 50. Baris atas matriks mewakili polisi, baris kedua mewakili perampok.J←∨/S>0
: untuk setiap baris matriks, simpanJ
apakah salah satu HP lebih besar dari nol.→6/⍨~∧/J
: jika tidak kedua tim memiliki anggota yang masih hidup, lompat ke baris 6. (akhir)⎕←3↑'CR',0⌈S
: untuk setiap nilai dalam matriks, hasilkan nilai maksimumnya dan 0, tambahkan 'C' ke baris pertama dan 'R' ke baris kedua, dan tambahkan baris ketiga (kosong).N←?10
: dapatkan nomor acak dalam interval [1,10] dan simpan diN
.L←1+~2⊤N
: setL
(tim yang kalah) untuk1
apakah nomor itu ganjil dan2
jika itu genap.M←(0<S[L
...;])/⍳5
: dapatkan indeks anggota yang masih hidup dari tim itu, dan simpan diM
M[?⍴M
...]
: pilih nilai acak dariM
S[L;M
...]-←N
: kurangiN
dari nilai anggota tim yang dipilih→2
: lompat ke baris 2 (ujian untuk anggota yang masih hidup)⎕←'CR',⍪'+-'⌽⍨J⍳0
: output status akhir, menempatkan+
di depan tim yang menang dan-
di depan tim yang kalah.Output sampel
sumber
Ruby, 184
sumber
Mathematica,
246241 byteMungkin bisa bermain golf lebih lanjut ...
sumber
PHP - 416 byte
Saya baru bermain golf dan meskipun tantangan ini akan cukup mudah untuk mencobanya. Jadi inilah yang saya pikirkan.
Dengan penjelasan:
sumber
!= 0
dan mengganti cek menjadi sama dengan nol dengan operator yang tidak (!array_sum($r)
).C,
390384371 byteGolf pertama saya, jika ada peningkatan yang mungkin, katakan saja kepada saya :)
versi golf:
versi yang agak tidak bercabang:
sunting: Saya menemukan cara untuk mempersingkat sedikit dan memperbaiki bug kecil
sumber
for(j=0;j<10;j++)
) dengan versi yang lebih pendek (for(j=10;--j;)
).Batch - 396 Bytes
Saya tidak tahu apakah ini secara teknis diperhitungkan - karena tidak benar-benar memilih anggota acak tim yang kesehatannya lebih besar dari 0 . Itu hanya memilih anggota acak, dan jika pengurangan kesehatan menghasilkan angka kurang dari 0, maka jumlahnya menjadi 0 ..
sumber
Javascript: 410
sumber
Oktaf,
182 177 158145 byte145:
Saya menyerah memeriksa apakah pemotretan karakter di atas nol - ini hanya akan signifikan jika kami dipaksa untuk menampilkan keadaan di setiap belokan - di sini kami hanya secara acak melewatkan satu nomor acak dari RNG, menjadikannya lebih acak.
Juga diganti
dengan lebih pendek
[note - ini mencetak 'C + R-' tanpa baris baru - ini diperbaiki dalam versi 145 byte]
158:
Degolfed:
Saya berubah
repmat(50,5,2)
menjadirepmat(5)
- jadi kami memiliki matriks 5x5 dan bukan 5x2 sekarang (3 kolom tambahan tidak memengaruhi algoritme). Saya juga menemukan cara untuk mengompresi output.177:
Degolfed:
Pada dasarnya, kami membuat matriks 5x2, di mana kolom pertama adalah polisi dan kolom kedua adalah perampok:
The
sum
berfungsi bila satu argumen diterapkan membuat sum dengan kolom, jadi awalnya:Ketika salah satu dari mereka mencapai nol,
prod(sum(t))
evaluasi ke nol melanggar loop. Lalu kita bisa memeriksa siapa yang menang memeriksa kolom yang jumlahnya nol.sumber