Ada beberapa pertanyaan tentang game ini , bahkan kontes king-of-the-hill di sini . Tapi saya pikir semua tantangan dan kontes itu membutuhkan cara untuk secara otomatis menentukan pemenang pertandingan. Begitu:
Tantangan
Diberikan dua input dalam kisaran yang ["rock", "paper", "scissors", "lizard", "spock"]
mewakili pilihan untuk pemain 1 dan pemain 2, tentukan pemenang pertandingan.
Aturan
[Winner] [action] [loser]
-----------------------------
scissors cut paper
paper covers rock
rock crushes lizard
lizard poisons spock
spock smashes scissors
scissors decapitates lizard
lizard eats paper
paper disproves spock
spock vaporizes rock
rock crushes scissors
Batasan
- Input akan berupa sepasang string dalam rentang yang diberikan (tidak ada string lain yang dapat digunakan). Anda bisa menggunakan array chars jika Anda mau, asalkan mereka mewakili salah satu nilai yang disebutkan.
- Anda dapat memilih untuk menggunakan huruf kecil, huruf besar (
"ROCK"
) atau unta ("Rock"
) untuk string input, selama case yang dipilih sama untuk semua input. - Output akan menjadi trio nilai yang menentukan pemenang, yang bisa berupa apa saja yang Anda inginkan asalkan jawabannya konsisten. Contoh:
1
jika input pertama menang,2
jika input kedua menang,0
jika ada seri. Atau mungkinA
jika input pertama menang,B
jika input kedua menang,<empty string>
jika ada seri.
Tujuan
Ini adalah kode-golf , jadi semoga program / metode / fungsi / lambda terpendek untuk setiap bahasa menang!
Tes
[Input 1] [Input 2] [Output: 1/2/0]
-----------------------------------
rock paper 2
rock scissors 1
lizard spock 1
spock rock 1
spock paper 2
rock rock 0
cake
triknya).Jawaban:
Python 3 ,
685048 byteEDIT: Terima kasih atas 3 trik dari Neil, dan 2 dari Mr. Xcoder
Setiap string input memiliki karakter keempat yang berbeda, jadi saya menggunakannya untuk membedakannya. Jika Anda mengatur elemen-elemen dalam siklus (gunting, kertas, batu, kadal, spock), maka setiap elemen mengalahkan elemen secara langsung setelah itu dan elemen 3 bintik di sebelah kanan, secara siklis. Jadi kami mengurangi posisi input dalam siklus. Jika angka itu adalah 0, itu adalah seri. Jika 1 atau 3, itu adalah kemenangan untuk pemain pertama. Dalam solusi asli saya, perbedaan siklus akan diindeks ke string "210100" untuk membedakan hasil permainan. Neil entah bagaimana menemukan ini dapat dicapai tanpa pengindeksan dengan menambahkan 7 dan mengambil modulus oleh 3. Edit: Awalnya saya menggunakan karakter kedua untuk mengidentifikasi string, tetapi jika Anda menggunakan keempat dan membalikkan siklus, Anda mendapatkan kue. Dan kita semua bisa menggunakan lebih banyak kue.
Cobalah online!
Versi yang lebih lama:
Cobalah online!
Versi asli:
Cobalah online!
sumber
.index
ke.find
)p
,"chaoi"
cukup)JavaScript (ES6), 56 byte
Mengambil input dalam sintaks currying
(a)(b)
. Kembali0
jika A menang,1
jika B menang, ataufalse
untuk seri.Demo
Tampilkan cuplikan kode
Bagaimana?
Kami mendefinisikan fungsi hash H () sebagai:
Ini memberi:
Diberikan dua input a dan b , kami mempertimbangkan pernyataan berikut:
Dari (1) dan (2), kami menyimpulkan apakah hasil dari a> b harus dibalik untuk mendapatkan pemenang yang benar dan kami menyimpan bendera ini di bit ke-N dari bitmask pencarian.
Karenanya bit:
Membaca ini dari bawah ke atas dan mengabaikan angka nol di depan, angka ini menghasilkan 1001100110 , atau 614 dalam desimal.
sumber
05AB1E , 16 byte
Cobalah online! atau sebagai Test Suite
Penjelasan
Menggunakan
cake
-trick yang sangat bagus dari user507295sumber
Ruby , 36 byte
Kembali
0
jika pemain pertama menang,1
jika pemain kedua menang, dan2
untuk hasil seri.Berdasarkan jawaban user507295 tetapi menggunakan rumus matematika untuk melakukan hash.
a.sum
adalah jumlah dari semua kode ASCII dari stringa
, mod1<<16
dan dimaksudkan sebagai checksum yang belum sempurna. Hash ditemukan menggunakan kode berikut:Ini menghasilkan dua nilai
j
yang memberikan hash yang cocok untuk huruf kecil, yaitu 88 dan 80, yang keduanya memberikan urutan menurun[3,2,1,0,4]
(atau[4,3,2,1,0]
jika spock berputar ke awal.)Seperti dijelaskan dalam jawaban lain, hash yang memberikan perbedaan modulo 5 konstan untuk elemen berurutan dalam urutan di atas diperlukan untuk membuat
(h[a]-h[b])%5
rumus bekerja. Setiap elemen mengalahkan elemen 1 atau 3 tempat ke kanan dan kehilangan ke elemen 2 atau 4 tempat ke kanan.Cobalah online!
sumber
JavaScript (ES6),
63545349 bytePort of my golf untuk jawaban @ WhatToDo. Catatan: snippet menerjemahkan hasil numerik menjadi sesuatu yang sedikit kurang dapat dibaca. Sunting: Disimpan 1 byte berkat @Arnauld. Disimpan 4 byte berkat @ovs.
sumber
C, 53bytes
Saya telah memperlakukan masalah ini sebagai mesin keadaan, di mana ada 25 negara sebagaimana didefinisikan oleh dua, lima masukan negara.
Dengan mendefinisikan hasil state dalam array bit. Saya mencari hasilnya di dalam dengan menggunakan spidol unik dalam input.
Seperti dicatat dalam solusi lain, karakter 2, 3 dan 4 adalah unik di antara input yang mungkin. Saya telah memusatkan penggunaan pada karakter 2 dan 3 yang saya gunakan untuk memilih bit yang sesuai dalam array jawaban saya.
Dalam Character 2, bit 1 hingga 4 dengan jelas mengidentifikasi input. Dengan menutupi bit-bit ini dan menggeser secara tepat [itulah "* y & 47 >> 1"], input dapat dicatat sebagai 0, 1, 4, 7 atau 8. Oleh karena itu string jawaban saya memiliki 9 karakter. (bit menarik yang dipisahkan)
Dalam karakter 3, bit 0, 1 dan 2 mengidentifikasi input dengan jelas. Dengan Masking bit-bit ini (menggeser tidak diperlukan) [itulah "* x & 7"], input dapat dicatat sebagai 0, 1, 2, 3 atau 7. (bit menarik yang dipisahkan)
String jawaban kemudian dapat dihitung dengan hanya mengisi bit untuk karakter yang sesuai.
Jadi, atur bit di char di mana Y menang
Maka logikanya sederhana: jika karakter kedua sama maka gambarlah, jika tidak, dapatkan karakter ascii berdasarkan karakter kedua y dan geser bit dengan karakter ketiga x dan tambahkan satu. Ini membuat jawaban 0 untuk seri, 1 untuk x menang dan 2 untuk y menang.
sumber
Clojure,
130118 byte-12 byte dengan menyingkirkan penggunaan aneh saya
comp
.Saya pikir saya pintar, tetapi ini berakhir naif dibandingkan dengan beberapa jawaban lain, dan lebih lama.
Mengambil 2 huruf pertama dari setiap string bergerak, mendapatkan kode char, dan menjumlahkannya. Itu kemudian mengurangi jumlah untuk mendapatkan
d
. Jikad
0, ini adalah dasi (0), jika dalam himpunan#{5 -16 12 -14 13 1 4 -18 2 11}
, p1 menang (1), atau p2 menang (2).Untuk mendapatkan "angka ajaib" yang menentukan apakah P1 menang, saya berlari
Yang menghasilkan daftar
d
nilai untuk setiap skenario yang mungkin:Lalu saya membandingkan grafik kemenangan dengan output ini. Untungnya tidak ada "tabrakan" selain 0.
sumber