Bounties
1 ( diberikan )
Saya akan memberikan 50 rep untuk jawaban pertama yang valid
2 ( diberikan )
Saya akan memberikan 100 rep lagi untuk jawaban valid terpendek.
3 ( terbuka untuk pengiriman )
Saya akan memberikan 200 rep untuk yang pertama dengan jawaban valid pendek yang signifikan. Signifikan paling banyak 45% dari jawaban terpendek saat ini ( 564 byte x 0,45 = maks 254 byte ).
Permainan
Anda ingat permainan klasik " Nine Men's Morris " atau sekadar " Mill "? Ada variasi yang disebut Three Men's Morris yang sedikit mirip dengan tic-tac-toe yang bisa berubah.
Aturan
Ini adalah papan permainan kosong:
a b c
1 [ ]–[ ]–[ ]
| \ | / |
2 [ ]–[ ]–[ ]
| / | \ |
3 [ ]–[ ]–[ ]
[ ]
adalah bidang dan |–/\
mewakili rute antara bidang tersebut.
Permainan ini dimainkan oleh dua pemain 1
dan 2
yang masing-masing menempatkan 3 token di papan tulis. Ini sebenarnya sudah terjadi dan kita ada di dalam game. Permainan dimenangkan jika satu pemain dapat membentuk mill
baris vertikal atau horizontal dari 3 token pemain.
Token dapat dipindahkan di papan sepanjang garis penghubung, sesuai dengan aturan ini:
Untuk setiap posisi kosong yang berdekatan (yaitu dari posisi tepi ke tengah, atau dari pusat ke posisi tepi, atau dari posisi tepi ke posisi tepi yang berdekatan)
Seorang pemain harus bergerak kecuali tidak ada posisi kosong yang berdekatan, dalam hal ini lompatan dilewati.
Tantangan
Anda pemain 1
dan gerakan Anda berikutnya. Tulis program atau fungsi, yang menentukan apakah:
- Anda bisa memaksakan kemenangan dengan 2 gerakan atau kurang ( kemenangan yang pasti )
- Anda bisa menang dengan 2 gerakan atau kurang, jika lawan membuat kesalahan ( kemungkinan menang )
- Anda tidak dapat menang dengan 2 gerakan atau kurang, karena Anda akan membutuhkan lebih banyak gerakan atau karena gerakan paksa membuat lawan Anda menang ( mustahil untuk menang )
Persyaratan
- Meskipun Anda pasti menang ketika Anda membuat lawan Anda mati, program Anda harus selesai dalam waktu yang terbatas.
- Anda dapat menulis suatu program atau fungsi.
Memasukkan
Para pemain diwakili oleh 1
dan 2
. 0
mendefinisikan bidang gratis. Anda dapat mengambil input sebagai matriks atau array.
Pasti
A B C D
2 1 0 | 2 1 0 | 1 0 1 | 1 2 2
2 1 2 | 0 1 0 | 1 0 2 | 2 1 O
0 0 1 | 2 2 1 | 0 2 2 | O O 1
A: [2,1,0,2,1,2,0,0,1]
B: [2,1,0,0,1,0,2,2,1]
C: [1,0,1,1,0,2,0,2,2]
D: [1,2,2,2,1,0,0,0,1]
Bisa jadi
A B C
1 0 1 | 1 0 1 | 1 2 2
1 2 2 | 1 2 0 | 0 0 1
2 0 0 | 2 0 2 | 2 1 0
A: [1,0,1,1,2,2,2,0,0]
B: [1,0,1,1,2,0,2,0,2]
C: [1,2,2,0,0,1,2,1,0]
Mustahil
A B
1 0 0 | 1 2 0
1 2 2 | 2 1 0
2 0 1 | 1 2 0
A: [1,0,0,1,2,2,2,0,1]
B: [1,2,0,2,1,0,1,2,0]
Keluaran
Program Anda harus menampilkan / mengembalikan smiley:
- Kemenangan pasti:
:)
- Kemungkinan menang:
:|
- Tidak mungkin menang:
:(
Contohnya
Kemenangan pasti dalam dua gerakan:
[2][1][ ] 1. [2][1][ ]
[2][1][2] -> [2][1][2]
[ ][ ][1] [ ][1][ ]
[2][1][ ] 1. [2][1][ ] [ ][1][ ] 2. [ ][ ][1]
[ ][1][ ] -> [ ][ ][1] -> [2][ ][1] -> [2][ ][1]
[2][2][1] [2][2][1] [2][2][1] [2][2][1]
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][ ][2] -> [1][ ][2] -> [1][ ][2] -> [ ][ ][2]
[ ][2][2] [ ][2][2] [2][ ][2] [2][ ][2]
Kemungkinan menang dalam dua gerakan:
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][2][ ] -> [1][2][ ] -> [1][2][2] -> [ ][2][2]
[2][ ][2] [2][ ][2] [2][ ][ ] [2][ ][ ]
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][2][ ] -> [1][2][ ] -> [1][2][2] -> [ ][2][2]
[2][ ][2] [2][ ][2] [2][ ][ ] [2][ ][ ]
[1][2][2] 1. [ ][2][2] [2][ ][2] 2. [1][2][2]
[ ][ ][1] -> [1][ ][1] -> [1][ ][1] -> [1][1][1]
[2][1][ ] [2][1][ ] [2][1][ ] [2][ ][ ]
Tidak mungkin menang dalam dua gerakan:
[1][ ][ ]
[1][2][2]
[2][ ][1]
Bonus
Jika kemenangan pasti dimungkinkan dan program Anda mengeluarkan gerakan dari satu cara menuju sukses juga seperti a1:a2
(1 gerakan) atau a1:a2,a3:b2
(2 gerakan), Anda dapat menarik 30% dari jumlah byte Anda.
Ini adalah kode golf - jadi jawaban tersingkat dalam byte menang. Celah standar tidak diijinkan.
Terima kasih kepada Peter Taylor yang memperbaiki beberapa kekurangan dan memperbaiki kata-kata di Sandbox .
sumber
[1,0,0,2,1,0,2,2,1]
, pemain 2 tidak bisa bergerak - apakah ini kemenangan untuk pemain 1?Jawaban:
Haskell,
580564441 byteSejauh ini saya bisa bermain golf untuk saat ini. Tidak yakin apakah bahasa lain dapat mengalahkannya.
Panggil
m
daftar daftar seperti[[2,1,0],[2,1,2],[0,0,1]]
(Pasti A).Kode uji:
mapM_ m al
pengembalian:sumber
C # -
739663 byteProgram yang lengkap, membaca input dari argv, dan tampaknya berfungsi. Jalankan seperti
Jika metode input ini tidak dapat diterima, saya akan senang mengubahnya (tidak pernah suka menggunakan argv).
Saya enggan untuk memposting ini kemarin, karena saya belum bisa bermain golf banyak (tidak punya banyak waktu, dan saya mungkin keluar dari latihan), tetapi karena belum ada tanggapan, saya ' Akan mempostingnya, saya tentu tidak mengharapkan karunia, saya lebih suka itu pergi ke seseorang yang menaruh sedikit usaha lebih banyak ke mereka sebelum memposting!
Sunting: mengganti semua bools dengan ints, yang berarti saya bisa menggunakan Linq dengan lebih baik, dan berhasil menutup kedua loop foreach, memberikan penghematan besar. Saya sedikit kagum bahwa
h
penghitung bekerja ... ++ adalah utilitas yang sangat halus.Program ini sangat sederhana, hanya mengeksplorasi setiap set gerakan yang mungkin (menyimpan status board dalam string []). Itu mengulangi semua kemungkinan pergerakan kami (papan yang menghasilkannya), dan menghitung jumlah respons lawan kami yang dapat kami kalahkan dengan sukses (
G
) (yaitu yang kami menangkan, dan ia tidak menang). Itu juga menghitung jumlah kemungkinan tanggapan (h
). Jika kita bisa memenangkan apapun, maka itu mungkin, dan kita menambahkan 1 ke jumlah, jika kita bisa memenangkan semuanya, itu pasti, dan kami menambahkan 2 ke jumlah. Karena itu, beberapa maksimum adalah hasil terbaik kami, dan kami indeks ke string "(|))" untuk mengembalikan wajah yang sesuai. Perhatikan bahwa kita memerlukan tambahan ")" karena jumlahnya bisa 2 atau 3 jika itu pasti (mungkin saja kita tampaknya tidak dapat mengalahkan respons yang telah dimenangkan pada go pertama, jadi kemungkinan cek adalah sedikit menyesatkan).Program memeriksa kemenangan dengan menghasilkan string dari papan, yaitu baris dan kolom yang dipisahkan ruang, dan hanya mencari string 3 karakter pemain dalam string ini (mis. "201 201 021 220 002 111" adalah menang untuk kita)
Ini skrip pengujian saya:
Output yang mana
sumber
PowerShell
576550 byteSaya tidak akan mudah dihalangi - jika saya tidak bisa mendapatkan C # di bawah 631 byte, saya harus menggunakan bahasa yang berbeda sebagai gantinya! Saya berharap bahwa Leif Willerts akan menjatuhkan 5 byte dari jawabannya, karena saya telah memutuskan saya tidak terlalu menyukai PowerShell, mungkin saya hanya perlu melihatnya secara objektif dalam hal jumlah byte ...
Ini adalah skrip, Anda menjalankannya
. .\mill.ps1 "201102021"
. Salinan jawaban C # saya cukup bagus, hanya dalam bahasa yang tidak banyak saya alami. Saya belum berusaha terlalu keras untuk bermain golf ini, karena butuh waktu begitu lama untuk bisa bekerja pada contoh pertama, dan sudah cukup ringkas.Sunting: tidak bisa meninggalkan
[Math]::Floor
panggilan itu di sanaJika Anda deskripsi cara kerjanya ... jawaban C # adalah untuk Anda, tetapi mudah-mudahan komentar membuatnya cukup jelas. Titik koma mungkin tidak cocok dengan perintah single-line, saya belum yakin di mana mereka dibutuhkan dan tidak, dan tidak menyalinnya kembali ketika saya meletakkan semuanya pada satu baris.
Skrip uji (PowerShell):
Outputnya:
sumber
Python 3,
566557 byteSaya harus melihat apakah saya bisa menurunkannya lebih lanjut, atau jika saya bisa mendapatkan bonus 30%, tetapi setelah banyak menunda, inilah jawaban saya.
Tidak Terkumpul:
sumber