Saya ingin mencoba bentuk kode golf baru di sini. Mirip dengan bonus, tidak semua bagian dari tantangan harus diselesaikan, tetapi setiap jawaban harus mengimplementasikan subset dengan ukuran tertentu (dan ada inti yang harus diterapkan oleh setiap jawaban). Jadi selain bermain golf, tantangan ini juga melibatkan pemilihan serangkaian fitur yang cocok bersama.
Aturan
Kingdom Builder adalah permainan papan, dimainkan di kisi hex (pointy-top). Papan terdiri dari empat kuadran (acak), yang masing-masing memiliki 10x10 sel heks (sehingga papan penuh akan menjadi 20x20). Untuk keperluan tantangan ini, setiap sel hex berisi air ( W
), gunung ( M
) kota ( T
), kastil ( C
) atau kosong ( .
). Jadi kuadran bisa terlihat seperti
. . W . . . . . . .
. M W W . . . . . .
. M . . W . . . T .
M M . W . . . . . .
. . M . W W . . . .
. . . . . W W W W W
. T . . . . . . . .
. . W . . C . . . .
. . W W . . . . M .
. . . . . . . M M .
Baris kedua akan selalu diimbangi ke kanan dari baris pertama. Pemain 1
untuk 4
dapat menempatkan hingga 40 permukiman masing-masing pada sel kosong (mengikuti beberapa aturan yang akan kita mengabaikan untuk tantangan ini). Papan yang mungkin ada di akhir permainan adalah sebagai berikut:
3 3 W . . . 4 . 4 . . 2 W . 4 . . 4 . 4
3 M W W . 1 1 . . 4 2 W . 3 C 4 4 . . 4
3 M 2 2 W 1 1 1 T 3 2 W 4 3 . 1 4 . 4 .
M M . W 2 2 . . . 2 2 W 3 . 1 1 1 . . .
. 4 M . W W 2 2 2 2 W W 3 . 1 4 . T . .
. . . . . W W W W W . 3 C 1 . . 2 2 2 2
. T 1 1 1 1 . . 2 . . 4 . . . 2 2 M M M
4 . W 4 . C 4 4 . . . . . . 2 M M M M M
. 4 W W . . . 4 M . . W . W . 2 2 2 M M
. . . . . . . M M . . W W . . . . 2 M .
. . . 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 . 1
M 3 3 . . . . . . . . 4 . T 2 . 2 4 1 .
M M . C . 4 . 4 . . . . . 1 2 4 2 1 1 .
M . . 1 . 4 . . . . M M 1 2 . . 2 1 . .
. . . W 1 1 4 1 1 . . . 1 2 . . 2 W W W
. . 1 1 W 1 T . 1 1 1 1 T . . 2 W . 4 .
. 1 1 W . 3 3 . . . . . . . . 2 W 4 C 3
C 1 3 3 3 . 3 . 4 . 4 . 4 . . 2 W 1 1 M
4 3 3 4 . M 4 3 . . . . . . . 2 W . . .
. . . 4 . M M 3 . . 4 4 . 4 . 2 W W . .
Kami akan memberi label kuadran suka
1 2
3 4
Tugas Anda adalah untuk mencetak papan seperti itu. Ada satu skor inti yang selalu digunakan, dan 8 skor opsional, 3 di antaranya dipilih untuk setiap game. † Berikut ini, saya akan menggambarkan semua 9 skor dan menggunakan pengaturan di atas sebagai contoh untuk berapa banyak poin yang akan didapat setiap pemain.
† Ada 10 skor dalam permainan yang sebenarnya, tetapi saya akan meninggalkan dua karena tidak ada yang mau bermain golf.
Skor inti. Seorang pemain mendapat 3 poin untuk setiap C
astle yang ada penyelesaiannya di sebelahnya. Skor contoh: 18, 0, 15, 12.
Skor opsional.
Seorang pemain mendapat 1 poin untuk setiap baris horizontal di mana mereka memiliki setidaknya satu penyelesaian.
Skor contoh: 14, 20, 12, 16.
Untuk masing-masing pemain, temukan baris horizontal tempat sebagian besar penyelesaian mereka (pilih salah satu jika ada seri). Seorang pemain mendapat 2 poin untuk setiap penyelesaian di baris itu.
Skor contoh: 14 (baris 16), 8 (baris 4, 5 atau 6), 28 (baris 11), 10 (baris 1).
Seorang pemain mendapat 1 poin untuk setiap penyelesaian yang dibangun di sebelah
W
ater.Skor contoh: 13, 21, 10, 5.
Seorang pemain mendapat 1 poin untuk setiap penyelesaian di sebelah
M
ountain.Skor contoh: 4, 12, 8, 4.
Hitung penyelesaian setiap pemain di setiap kuadran. Per kuadran, pemain dengan jumlah permukiman terbesar mendapat masing-masing 12 poin , pemain dengan jumlah permukiman terbesar kedua mendapat masing-masing 6 poin .
Skor contoh: 18 (6 + 0 + 6 + 6), 36 (12 + 12 + 0 + 12), 12 (0 + 0 + 12 + 0), 18 (12 + 6 + 0 + 0).
Untuk setiap pemain menentukan kuadran di mana mereka memiliki jumlah pemukiman paling sedikit. Seorang pemain mendapat 3 poin untuk setiap penyelesaian di kuadran itu.
Skor contoh: 18 (Kuadran 2), 0 (Kuadran 3), 15 (Kuadran 1 atau 2), 27 (Kuadran 3).
Seorang pemain mendapat 1 poin untuk setiap kelompok pemukiman yang terhubung.
Skor contoh: 7, 5, 6, 29.
Seorang pemain mendapat 1 poin untuk setiap 2 pemukiman di kelompok pemukiman terhubung terbesar pemain.
Skor contoh: 4, 10, 8, 2.
Tantangan
Seperti dalam permainan, Anda akan memilih 3 dari skor opsional, dan skor papan yang diberikan berdasarkan skor inti dan tiga skor tersebut. Kode Anda harus menghasilkan daftar 4 skor. Namun ada satu batasan pada pilihan: Saya telah mengelompokkan skor menjadi 3 kelompok, dan Anda harus menerapkan salah satu dari masing-masing kelompok:
- Terapkan salah satu dari 1 dan 2 .
- Terapkan salah satu dari 3, 4, 5 dan 6 .
- Terapkan salah satu dari 7 dan 8 .
Anda dapat menulis sebuah program atau fungsi, mengambil input melalui STDIN, argumen baris perintah, prompt atau parameter fungsi. Anda dapat mengembalikan hasilnya atau mencetaknya ke STDOUT.
Anda dapat memilih format daftar / string 1D atau 2D yang nyaman untuk input. Anda tidak boleh menggunakan grafik dengan informasi kedekatan penuh. Berikut ini adalah bacaan yang bagus di hex grid jika Anda membutuhkan inspirasi.
Output Anda juga mungkin dalam format string atau daftar yang mudah, tidak ambigu.
Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.
Asumsi Lebih Lanjut
Anda boleh berasumsi bahwa ...
- ... setiap pemain memiliki setidaknya 1 penyelesaian dan tidak ada lebih dari 40 penyelesaian dari setiap pemain.
- ... setiap kuadran berisi satu kota dan dua kastil, atau dua kota dan satu kastil.
- ... kota dan kastil cukup berjauhan, sehingga tidak ada pemukiman yang berdekatan dengan keduanya.
Uji Kasus
Masih menggunakan papan di atas, berikut adalah skor individu untuk semua pilihan kemungkinan mekanisme penilaian:
Chosen Scores Total Player Scores
1 3 7 52 46 43 62
1 3 8 49 51 45 35
1 4 7 43 37 41 61
1 4 8 40 42 43 34
1 5 7 57 61 45 75
1 5 8 54 66 47 48
1 6 7 57 25 48 84
1 6 8 54 30 50 57
2 3 7 52 34 59 56
2 3 8 49 39 61 29
2 4 7 43 25 57 55
2 4 8 40 30 59 28
2 5 7 57 49 61 69
2 5 8 54 54 63 42
2 6 7 57 13 64 78
2 6 8 54 18 66 51
sumber
Jawaban:
Python 2, 367 byte
Program ini menggunakan skor 1, 3, 7. Input adalah daftar daftar karakter yang mewakili setiap sel. Untuk menguji papan contoh dengan mudah, kita dapat melakukan:
Menangani hex grid
Karena kita berada di hex grid, kita harus berurusan dengan tetangga sedikit berbeda. Jika kita menggunakan kisi 2D tradisional sebagai representasi kita, maka
(1, 1)
kita memiliki:Pada pemeriksaan lebih dekat, kami menyadari bahwa offset tergantung pada paritas baris Anda. Contoh di atas adalah untuk baris ganjil, tetapi pada baris genap pun
Satu-satunya hal yang telah berubah adalah bahwa pasangan ke-1, ke-2, ke-5 dan ke-6 mengalami penurunan koordinat kedua sebesar 1.
Fungsi lambda
N
mengambil pasangan koordinat(row, col)
dan mengembalikan semua tetangga sel dalam grid. Pemahaman bagian dalam menghasilkan offset di atas dengan mengekstraksi mereka dari pengkodean basis 3 sederhana, menambah koordinat kedua jika barisnya ganjil dan menambahkan offset ke sel yang bersangkutan untuk diberikan kepada tetangga. Pemahaman luar kemudian menyaring, hanya menyisakan tetangga yang berada dalam batas-batas grid.Tidak disatukan
sumber
def F
fungsi yang terpisah dan bukan fungsi internal? Tidakk
dapat dihapus daridef F:
?F
adalah fungsi pengisian banjir dan perlu aksesJ
, jadi ada di bagian dalam untuk menghemat lewatJ
sebagai parameter (saya akan bereksperimen sedikit untuk melihat apakah saya bisa menyelesaikan penyalinan yang dalam). Anda benar tentangk
meskipun, terima kasih :) (kode baru terlihat sedikit funky namun, karena mengandalkan hubungan arus pendek)Answer Set Programming, 629 bytes
ASP milik keluarga bahasa pemrograman logika, di sini diinkarnasi oleh kerangka kerja Potassco , khususnya Clingo (grounder Gringo + solver Clasp). Karena keterbatasan paradigma, itu tidak dapat menerima papan yang diberikan secara langsung sebagai output, sehingga diperlukan preprocessing data (di sini dilakukan dengan python). Preprocessing ini tidak dihitung dalam skor total byte.
Ini golf kode pertama saya, dan tujuannya lebih untuk menunjukkan bahasa yang saya sukai yang belum pernah saya lihat sebelumnya di golf, daripada benar-benar memenangkan permainan. Selain itu, saya jauh dari seorang ahli dalam ASP, begitu banyak optimisasi kode yang pasti dapat dilakukan untuk hasil dalam lebih sedikit byte.
representasi pengetahuan
Ada kode python yang mengubah papan dalam atom:
Misalnya, atom b (untuk __b__oard) yang diberikan untuk baris pertama papan contoh adalah sebagai berikut:
Di mana b (0,0,3) adalah atom yang menggambarkan bahwa pemain 3 memiliki penyelesaian pada koordinat (0; 0).
Pemecahan ASP
Ada kode ASP, dengan banyak skor opsional diterapkan:
Program ini dapat diluncurkan dengan perintah:
Dan hanya akan menemukan satu solusi (ini merupakan bukti bahwa hanya ada satu cara untuk mendistribusikan poin):
Di mana s (7,3,6) mengatakan bahwa pemain 3 memperoleh 6 poin dengan skor opsional 7, dan s (t, 4,62) mengatakan bahwa pemain 4 mendapatkan total 62 poin (inti + 1 + 3 + 7).
Mudah diurai untuk memiliki meja mewah!
sumber