Di sebuah pesta, saya diperkenalkan dengan game LCR. Sekarang ini bukan permainan yang hebat karena tidak ada keterampilan tetapi hanya kesempatan acak. Tapi itu membuat saya berpikir, saya bisa kode ini, dan saya membuat program cepat di R untuk model permainan.
Aturan permainan dimodifikasi dari Wikipedia agar sesuai dengan cara kami bermain:
Setiap pemain menerima setidaknya 3 chip. Para pemain secara bergiliran memutar tiga dadu enam sisi, yang masing-masing ditandai dengan "L", "C", "R" di satu sisi, dan satu titik di ketiga sisi yang tersisa. Untuk setiap "L" atau "R" yang dilemparkan, pemain harus mengoper masing-masing satu chip ke pemain ke kiri atau kanan. A "C" menunjukkan sebuah chip ke tengah (pot). Titik tidak memiliki efek.
Jika seorang pemain memiliki kurang dari tiga chip yang tersisa, mereka masih dalam permainan tetapi jumlah chip mereka adalah jumlah dadu yang mereka roll pada giliran mereka, daripada menggulirkan ketiga. Ketika seorang pemain memiliki nol chip, mereka memberikan dadu pada giliran mereka, tetapi dapat menerima chip dari orang lain dan mengambil giliran berikutnya sesuai. Pemenangnya adalah pemain terakhir yang menempatkan chip ke tengah.
Kontes: tulis sebuah program dalam bahasa pilihan Anda yang mengambil input untuk jumlah pemain dan jumlah chip awal dan mensimulasikan permainan LCR, menunjukkan keadaan permainan setelah setiap pemain bergulir.
Sebagai contoh, sebuah game mungkin menjadi output sebagai:
[[[3,3,3,3],0],[[1,4,3,4],0],[[1,4,3,4],0],[[1,4,1,4],2],[[1,4,1,2],4],
[[0,4,1,3],4],[[0,3,2,3],4],[[0,3,0,3],6],[[0,3,1,1],7],[[0,3,1,1],7],
[[2,0,1,1],8],[[2,0,0,1],9],[[2,0,0,0],10],[[0,1,0,0],11],
[[1,0,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[0,0,0,0],12]]
ht: Jonathan Allan
Outputnya tidak harus terlihat persis seperti ini, tetapi harus mudah untuk membedakan roll dadu, berapa banyak chip yang dimiliki masing-masing pemain, dan berapa banyak chip yang dimiliki center untuk setiap belokan.
Ini kode golf sehingga kode terpendek menang.
[[[3,3,3,3],0],[[1,4,3,4],0],[[1,4,3,4],0],[[1,4,1,4],2],[[1,4,1,2],4],[[0,4,1,3],4],[[0,3,2,3],4],[[0,3,0,3],6],[[0,3,1,1],7],[[0,3,1,1],7],[[2,0,1,1],8],[[2,0,0,1],9],[[2,0,0,0],10],[[0,1,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[0,0,0,0],12]]
- apakah itu masalahnya?Jawaban:
Emacs Lisp , 279 byte
Gunakan fungsi ini sebagai
(f 4 3)
.Versi lebih mudah dibaca:
Contoh keluaran:
sumber
Java 8,
281277275274253 byteVersi yang menampilkan keadaan yang sama ketika pemutar belok memiliki 0 chip tersisa:
Mulai dengan pemain ketiga dalam array.
Cobalah online.
Versi yang melewatkan pemain dengan sisa 0 chip (274 byte):
Mulai dari pemain pertama dalam array.
Cobalah online.
-7 byte terima kasih kepada @ OlivierGrégoire .
Penjelasan (dari versi kedua):
sumber
s=0;for(int C:c)s+=C;
(21 byte) dapat digantikan olehs=A.stream(c).sum();
(20 byte)c[i%p]-=r<3?1:0
→c[i%p]-=1-r/3
. Ini akan menghemat 2 byte.A
darijava.util.Arrays
. : D Dan dengan meletakkannya di loop untuk menghemat titik koma itu -2 byte. Dan1-r/3
memang benar ( lihat di sini ). Terima kasih.s=c[u=(i+r-1+p)%p]+=1-r&1-r/4
(menghemat 2 byte, dibandingkan dengans=c[u=(i+r%2*2-1+p)%p]+=r<2?1:0
)Python 2 ,
159148 byteCobalah online!
Mencetak semua chip pemain setelah setiap roll
sumber
n*c - sum(players)
. Jika saya perlu menuliskannya secara eksplisit, saya akanJelly , 39 byte
+2 untuk memperbaiki perilaku pengulangan (
¡
harus didahului oleh nilad jadi«3Ḣ$
->⁸FḢ«3
)Jika kita dapat mendefinisikan daftar output yang akan diputar untuk memiliki chip milik pemain yang bertindak sebelumnya di sebelah kiri kita dapat menyingkirkan yang paling kanan 6 byte untuk 33 byte (namun, menurut saya, agak canggung untuk membaca itu).
Link diadik yang menerima chip per pemain di sebelah kiri dan jumlah pemain di sebelah kanan yang menghasilkan daftar jumlah pemain chip pada awal permainan dan setelah setiap belokan (termasuk belokan di mana 0 chip memaksa lulus) .
Cobalah online!
Bagaimana?
Setiap pemain pada gilirannya, hingga tiga kali, tergantung pada jumlah chip mereka, membalik koin. Ketika seorang pemain membalik kepala mereka tidak melakukan apa-apa tetapi jika mereka membalikkan ekor mereka kemudian melempar dadu tiga sisi kehilangan chip ke L, C atau R. (Perhatikan bahwa 0 membalik ketika pemain memiliki 0 chip setara dengan passing.)
Ini diulang sampai jumlah chip pemain 0.
Implementasi memutar pemain yang ditinggalkan oleh satu tempat setiap belokan dan kemudian memutar status yang dihasilkan kembali ke semua disejajarkan seolah-olah tidak.
sumber
Ø.X¤?
,, bersarang di dalam instruksi repeat-up-to-3-times⁸«3Ḣ¤¡
,.C #, 356? +13? Bytes
Membutuhkan
using System;
total +13 byte untuk kode yang ditunjukkan di bawah ini, jika saya harus menghitungnya. Kalau tidak, cukup plonk di kelas dan panggilan apa punL(players, starting chips);
.Contoh hasil untuk gim 2,2:
Versi yang kurang golf:
sumber
C # (Visual C # Interactive Compiler) ,
201199 byteCobalah online!
sumber
Arang , 61 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Bergantian antara mengeluarkan dadu dan chip yang tersisa (baik jumlah awal chip maupun jumlah chip di tengah tidak termasuk dalam output). Penjelasan:
Mulai dengan pemain pertama.
Ulangi sampai tidak ada chip yang tersisa.
Gulung hingga tiga dadu untuk pemain saat ini. Dadu ini diberi label 0-5, di mana 0-2 mewakili titik, 3 dilewati ke kiri, 4 di tengah, 5 di kanan.
Tambahkan jumlah chip pemain di sebelah kanan melewati kiri dan jumlah chip pemain di sebelah kiri melewati kanan, tetapi kurangi jumlah chip pemain itu sendiri melewati.
Maju ke pemain berikutnya.
Keluarkan jumlah baru chip yang dipegang oleh para pemain.
Sebenarnya lebih mudah bagi semua orang untuk melempar dadu secara bersamaan, yang dapat dilakukan dalam 50 byte, termasuk mencetak dadu serta chip yang tersisa:
Cobalah online! Tautan adalah untuk mengucapkan versi kode.
sumber
05AB1E (legacy) ,
58504952 byteVersi yang menampilkan keadaan yang sama ketika pemutar belok memiliki 0 chip tersisa (
504952 byte ):Cobalah online.
Versi yang melewatkan pemain dengan sisa 0 chip (
585760 byte ):Cobalah online.
Keduanya +3 byte dengan menggunakan versi lawas, karena versi 05AB1E baru memiliki bug yang aneh. Ini harus bekerja dengan
Ws\
(push minimum tanpa popping; swap; buang daftar) diganti denganß
(daftar pop dan push minimum) dan0›
(periksa apakah lebih besar dari 0) diganti dengand
(periksa apakah non-negatif / lebih besar dari atau sama dengan 0) di versi baru, tetapi karena suatu alasan urutan daftar diubah setelah trailing¼
! .. : S (dan versi baru juga sangat lambat dan waktu habis setelah 60 detik sebelum menyelesaikan hasilnya ..>.>)Input pertama adalah jumlah pemain, input kedua jumlah chip per pemain.
Penjelasan (dari versi kedua):
sumber
[2, 3, 3, 3]
diikuti oleh[2, 2, 2, 6]
..: S Saya akan melihat apakah saya dapat menemukan penyebabnya dan memperbaikinya. Jika tidak, saya selalu dapat menghapusnya dan hanya menggunakan warisan, karena itu tetap menghasilkan lebih banyak lagi .. Versi baru ini cukup lambat dengan loop yang rumit untuk beberapa alasan ..>.>counter_variable
.. Saya mencoba mereproduksi masalah dalam contoh yang lebih sederhana, tetapi saya tidak dapat melakukannya. Ini ada hubungannya dengan pernyataan dan peta bersarang di dalam infinite loop, tapi ini benar-benar aneh .. Bagaimanapun, saya telah menghapus versi itu dan sekarang hanya versi lawas (dan lebih cepat) yang tersisa, yang berfungsi seperti yang dimaksudkan.