Memberikan tantangan yang melibatkan referensi Star Trek tepat setelah 4 Mei mungkin disukai, tapi begini saja.
Anda, Luke, Anakin, Palpatine, Yoda dan Han Solo terlibat dalam turnamen gila Rock, Paper, Scissor, Lizard, Spock.
Tangkapannya di sini adalah Anda hanya diizinkan menggunakan urutan gerakan yang tetap. Jika pesanan Anda adalah "R", Maka Anda harus menggunakan Rock, sampai Anda kalah atau menang melawan semua orang. Jika pesanan Anda RRV, maka Anda harus menggunakan 2 Batu diikuti oleh Spock dan terus mengulangi sampai Anda menang atau kalah.
Luke, Anakin, Palpatine, Yoda dan Han Solo telah mengirimkan pesanan mereka masing-masing dan Anda sebagai peretas ahli dapat memesan setiap pesanan mereka!
Dengan pengetahuan ini, Anda harus merancang pemesanan Anda untuk turnamen. Karena semua orang ingin menang, Anda ingin membuat pemesanan sehingga Anda memenangkan turnamen dengan mengalahkan semua orang. Tetapi ini mungkin tidak mungkin dilakukan dalam semua keadaan.
Jika ada kemungkinan pesanan yang menang, cetaklah itu. Jika tidak ada cara yang memungkinkan bagi Anda untuk menang, cetak -1 (atau 0 atau Salah atau "tidak mungkin")
Input : daftar 5 pesanan
Output : satu urutan atau -1
Input Sampel 1
R
P
S
L
V
Output Sampel 1
-1
Penjelasan 1
Tidak peduli apa yang Anda mainkan di langkah pertama Anda, akan ada setidaknya satu orang yang mengalahkan Anda, oleh karena itu tidak mungkin bagi Anda untuk menang.
Input Sampel 2
RPS
RPP
R
SRR
L
Keluaran Sampel 2
RPSP
Penjelasan 2
Setelah Anda memainkan Rock di gerakan pertama Anda, Anda akhirnya mengalahkan "L" dan "SRR" dan mengikat sisanya. Ini karena Kadal dan Gunting kalah dari Rock. Ketika Anda memainkan Paper berikutnya, Anda akan mengalahkan "R" dan mengikat 2 yang tersisa. Ini karena Rock kalah dari Paper. Ketika Anda memainkan Gunting berikutnya, Anda akan menang melawan "RPP" saat Scissor mengalahkan Paper.
Akhirnya, Anda akan mengalahkan "RPS" dengan Kertas Anda sebagai Kertas mengalahkan Rock.
Berikut adalah daftar notasi (Anda dapat menggunakan 5 literal apa pun, tetapi harap cantumkan dalam jawaban Anda):
R : Rock
P : Paper
S : Scissor
L : Lizard
V : Spock
Berikut adalah daftar semua hasil yang mungkin:
winner('S', 'P') -> 'S'
winner('S', 'R') -> 'R'
winner('S', 'V') -> 'V'
winner('S', 'L') -> 'S'
winner('S', 'S') -> Tie
winner('P', 'R') -> 'P'
winner('P', 'V') -> 'P'
winner('P', 'L') -> 'L'
winner('P', 'S') -> 'S'
winner('P', 'P') -> Tie
winner('R', 'V') -> 'V'
winner('R', 'L') -> 'R'
winner('R', 'S') -> 'R'
winner('R', 'P') -> 'P'
winner('R', 'R') -> Tie
winner('L', 'R') -> 'R'
winner('L', 'V') -> 'L'
winner('L', 'S') -> 'S'
winner('L', 'P') -> 'L'
winner('L', 'L') -> Tie
winner('V', 'R') -> 'V'
winner('V', 'L') -> 'L'
winner('V', 'S') -> 'V'
winner('V', 'P') -> 'P'
winner('V', 'V') -> Tie
Ini kode-golf , byte paling sedikit menang.
PS: Beri tahu saya kalau perlu lebih banyak test case.
Jawaban:
Jelly , 29 byte
Tautan monadik yang menerima daftar daftar bilangan bulat (masing-masing merupakan strategi lawan) yang menghasilkan daftar daftar bilangan bulat - yang masing-masing adalah strategi kemenangan (jadi daftar kosong jika tidak ada yang mungkin).
(Tambahkan saja
Ḣ
hanya menghasilkan daftar strategi tunggal atau0
jika tidak mungkin.)Cobalah online! (format footer untuk selalu menampilkan daftar)
Atau coba versi surat dipetakan (di mana strategi diambil dan ditampilkan pada baris mereka sendiri menggunakan
RPSVL
notasi).Bagaimana?
Angka-angka dipilih sedemikian rupa sehingga setiap yang merupakan angka ganjil lebih besar dari kemenangan modulo lima lainnya (yaitu mereka diberi nomor sekitar tepi pentagon tertulis dari lemparan).
Kode memainkan setiap strategi dari setiap strategi (termasuk diri mereka sendiri) untuk dua kali lebih banyak lemparan dari strategi terpanjang untuk memastikan menemukan setiap pecundang menjaga mereka yang tidak dikalahkan. Daftar strategi yang dihasilkan akan berisi strategi tunggal jika ada pemenang langsung; tidak ada strategi jika tidak ada pemenang; atau beberapa strategi jika ada pemain gambar. Setelah ini, serangkaian gerakan yang menang ditambahkan ke masing-masing strategi ini.
sumber
ZLḤ
denganLÄ
.Ɗ
dalam kode Anda, itu bahkan tidak melakukan apa yang Anda pikir - itu mencetak masing-masing seperti itu panjangnya sendiri kemudian mendapatkan jumlah kumulatif dari hasil tersebut, jadi juga akan membandingkan nilai yang salah juga. Coba ini misalnya - dibutuhkan[[1,2,3,4,5],[6,7],[8]]
, cetakan masing-masing dengan panjang seluruh daftar (3) untuk mendapatkan[[1,2,3],[6,7,6],[8,8,8]]
kemudian melakukan akumulasi untuk mendapatkan[[1,1+2,1+2+3],[6,6+7,6+7+8],[8,8+8,8+8+8]]
=[[1,3,6],[6,13,19],[8,16,24]]
.JavaScript (ES6),
122 115112 byteMengambil input sebagai larik string digit, dengan:
Cobalah online!
Bagaimana?
Ini adalah pencarian pertama yang luas: pertama-tama kita mencoba semua gerakan pada langkah yang diberikan untuk melihat apakah kita bisa memenangkan permainan. Jika kami tidak bisa menang sekarang, kami mencoba menambahkan langkah lain ke setiap langkah yang tidak kalah.
di mana
and
danxor
merupakan operator bitwise.Berkomentar
sumber
test(['P','P','S','P','P'])
Jawabannya harus "SR" atau "SV".R ,
213190 byte-23 byte terima kasih kepada Giuseppe.
Cobalah online!
Jika ada solusi, itu menghasilkan satu. Jika tidak ada solusi, ini menghasilkan deretan
NA
. Jika format output ini tidak dapat diterima, saya dapat mengubahnya dengan biaya beberapa byte.Gerakan dikodekan sebagai 1 = R, 2 = S, 3 = P, 4 = L, 5 = V, sehingga matriks hasil adalah
(0 = tidak ada pemenang; 1 = pemain 1 menang; 2 = pemain 2 menang)
Batas atas pada panjang solusi jika ada adalah di
n=sum(lengths(L))
manaL
daftar gerakan lawan. Kode menciptakan semua strategi panjang yang mungkinn
(disimpan dalam matriksv
), mencoba semuanya, dan menampilkan semua strategi yang menang.Perhatikan bahwa nilai ini
n
membuat kode sangat lambat pada TIO, jadi saya telah melakukan hardcod pada TIOn=4
yang cukup untuk kasus uji.Untuk test case pertama, outputnya adalah
sesuai dengan solusi RLSL.
Untuk test case kedua, outputnya adalah
artinya tidak ada solusi.
Penjelasan dari versi sebelumnya (akan diperbarui ketika saya bisa):
Hal
which
ini diperlukan untuk menghilangkan NAS yang terjadi ketika kedua pemain bermain imbang selamanya.Saya tidak yakin ini adalah strategi yang paling efisien. Bahkan jika itu, saya yakin kode untuk
m
bisa bermain golf cukup sedikit.sumber
lengths()
alias selalu kembali4
?v
...lengths
n=4
Emacs Lisp, 730 byte
Saya tidak menemukan juru bahasa online Emacs Lisp :( Jika Anda telah menginstal Emacs, Anda dapat menyalin kode ke
.el
file, menyalin beberapa jalur pengujian di bawah inidan jalankan
$ emacs --script filename.el
.Bagaimana itu bekerja
Program saya melakukan pencarian mendalam terlebih dahulu dengan kadang-kadang mencari tahu bahwa tidak mungkin untuk memenangkan dan mengakhiri cabang yang aktif.
Anda dapat melihat penjelasan lengkap dalam versi kode yang tidak dipendekkan:
sumber