Permainan papan
Dalam permainan papan, pemain " Carcassonne " menempatkan ubin dengan mencocokkan tepi mereka dan mendapatkan skor tertinggi dengan menciptakan area medan yang berdekatan. Berikut ini adalah (kira-kira) jenis dan jumlah ubin yang termasuk dalam game:
#01
x4
#02
x5
#03
x8
#04
x2
#05
x9
#06
x4
#07
x1
#08
x3
#09
x3
#10
x3
#11
x4
#12
x5
#13
x3
#14
x3
#15
x2
#16
x5
#17
x5
#18
x2
#19
x3
#20
x1
#21
x5
#22
x2
#23
x1
#24
x1
#25
x1
Tugas
Anda harus meletakkan ubin dengan mencocokkan tepinya, sambil mencoba mempertahankan area dataran berdekatan yang seluas mungkin.
Penempatan
- Ubin hanya dapat ditempatkan di salah satu (hingga 4) ruang kosong yang berdekatan dengan ubin yang ada (atau ubin) di area bermain.
- Ubin dapat diputar 90, 180 atau 270 derajat.
Pencocokan tepi
- Tepi ubin yang ditempatkan harus cocok dengan tepi menyentuh dari (hingga 4) ubin tetangga, yaitu menyentuh piksel adalah warna yang sama.
Medan yang berdekatan
- "Menutup area medan" mengacu pada menempatkan ubin sedemikian rupa sehingga area warna yang berdekatan tidak dapat dilanjutkan dengan penempatan ubin lebih lanjut.
- Jika penempatan alternatif dimungkinkan, itu harus dipilih daripada penempatan ubin apa pun yang akan menutup area medan.
- Jika Anda harus memilih di antara sejumlah penempatan penutupan, pilih salah satunya. Jika Anda harus memilih di antara sejumlah penempatan yang tidak ditutup, pilih salah satunya.
- Abaikan # ff00ff (piksel sudut) saat menghitung area yang berdekatan. Juga mengabaikan bangunan, yaitu area warna yang sudah tertutup sepenuhnya dalam ubin.
Memasukkan
Input adalah dua gambar:
Area bermain.
- Area bermain awal terdiri dari ubin
#11
(ubin tunggal). - Area bermain yang diperbesar yang dibuat sebagai output juga harus didukung sebagai input.
- Area bermain awal terdiri dari ubin
Ubin yang akan ditempatkan.
- Semua ubin contoh harus didukung sebagai input.
Tentukan tepi yang cocok / medan yang berdekatan menggunakan data gambar ini saja. Tidak ada hardcoding.
Keluaran
- Output adalah gambar yang menunjukkan area bermain yang dihasilkan setelah menempatkan ubin.
- Gambar harus kompatibel dengan program Anda sendiri, yaitu dapat digunakan sebagai input area bermain.
- Jika tidak mungkin menempatkan ubin, kembalikan kesalahan.
Anda bisa berasumsi itu
- Ubin selalu 55 px kali 55 px
- Ubin hanya akan menampilkan warna yang saat ini digunakan dalam ubin contoh.
Catatan
- Jawaban Anda harus menampilkan contoh output setelah setidaknya 2 berlalu (lebih didorong).
- Ini adalah rendering parsial dan tidak akurat dari gim papan asli, Anda tidak perlu menerapkan aturan atau taktik yang tidak disebutkan di sini.
Skor
- Skor Anda adalah jumlah byte kiriman Anda.
- Data gambar tidak termasuk dalam skor Anda.
- Skor terendah menang.
Bermain game penuh
Anda mungkin ingin menulis skrip yang menggunakan submissison Anda untuk memainkan permainan penuh, yang mungkin terdiri dari:
- Menempatkan ubin yang dipilih secara acak dari set lengkap 85.
- Mengembalikan ubin ke set jika tidak dapat ditempatkan.
- Ulangi sampai setiap ubin ditempatkan - atau sampai dua ubin berturut-turut tidak dapat ditempatkan.
Itu tidak akan dimasukkan dalam hitungan byte Anda, atau meningkatkan skor Anda, tetapi saya kemungkinan akan menawarkan hadiah untuk jawaban semacam ini.
Jawaban:
Perl 5 dengan PerlMagick:
875 789763Saya tidak menghitung garis dimulai dengan
sub w
, yang digunakan untuk mengurutkan posisi pada jarak ke pusat untuk lebih memilih solusi yang ringkas (sekarang berfungsi dengan baik). Dalam penutupan versi ini dihindari seperti yang diminta tetapi saya menemukan sebaliknya lebih menarik dan benar untuk permainan. Untuk mencapai itu ubah baris$s=$t if!grep...
ke$s=$t if grep...
.Penggunaan:
perl car.pl board.png tile.png
. Hasil disimpan dicar.png
. Status keluar adalah 1 jika ubin tidak dapat ditempatkan.Script untuk menjalankan game yang lengkap. Ini mengasumsikan kode di atas adalah dalam file
car.pl
dan ubin disimpan dalamtiles
direktori bernama01.png
ke25.png
.Ini berjalan cukup lambat sekarang. 8-12 menit di mesin saya. Dengan penutupan lebih disukai: Dengan penutupan dihindari (perhatikan tidak ada yang ditutup).
sumber
Common Lisp,
26502221199211861111 bytePerbarui: "Mudah" bermain golf sekarang dilakukan, keuntungan lebih lanjut akan membutuhkan perubahan yang lebih besar.Pembaruan 2: Dengan persaingan yang semakin ketat, versi baru tidak lagi menyukai posisi di dalam kotak lapangan bermain saat ini (yang akan menjadi 57 byte tambahan). Opsi ini, serta optimalisasi kecepatan sederhana, secara default diaktifkan di versi yang dapat diunduh bersama simulator, tetapi tidak dalam jawaban resmi di bawah ini.Pembaruan 3: Perubahan antarmuka kecil untuk perolehan jumlah byte utama.
Saya membuat UI Web sederhana juga. Paket lengkap (satu file LISP dan gambar ubin) dapat diunduh di sini . Untuk mencobanya, instal
hunchentoot
,zpng
danpng-read
dengan quiclisp, muatcarcassonne.lisp
, dan sambungkan kelocalhost:8080
. Kode telah diuji pada CCL / Windows dan SBCL / Linux. Perpustakaan yang disebutkan di atas hanya diperlukan untuk bagian UI / simulator; solusinya sendiri biasa ANSI Common Lisp.Semua umpan baris dan spasi awal hanya untuk kosmetik, untuk memastikan keterbacaan, dan tidak dihitung ke jumlah total.
Anda harus memanggil fungsi
c
dengan dua argumen: Bidang bermain saat ini, dan ubin untuk menempatkan. Keduanya harus berupa array 2D; ubin 55x55 dan bidang kelipatannya. Selain itu, array bidang harus dapat disesuaikan. Fungsi mengembalikan daftar dua elemen dengan bidang baru sebagai argumen pertama. Elemen kedua adalahNIL
jika ubin tidak dapat ditempatkan, atau daftar yang berisi koordinat kiri atas dan rotasi ubin terbaru pada array itu dan skor untuk ubin itu. Informasi ini dapat digunakan untuk keperluan visualisasi.Perhatikan bahwa dalam panggilan selanjutnya, Anda harus menggunakan bidang baru yang dikembalikan oleh
c
bahkan jika elemen daftar kedua adalahNIL
(array asli mungkin telahadjust-array
diedit dan dengan demikian tidak valid).Kode sekarang sedikit di sisi lambat, optimasi jumlah byte menghasilkan perhitungan yang berlebihan. Contoh di bawah ini selesai dalam waktu sekitar tiga menit pada sistem saya.
Contoh dijalankan untuk semua 85 ubin:
Tangkapan layar Web UI:
sumber
DarkBASIC Pro:
207819321744 bytesPEMBARUAN: Hanya upaya golf yang lebih banyak
UPDATE: Sekarang sepenuhnya memenuhi spesifikasi, termasuk lebih memilih pilihan yang tidak menutup.
Saya memilih DarkBASIC karena walaupun agak bertele-tele, itu memberikan perintah yang sangat mudah dan sederhana untuk memanipulasi gambar.
Saya mengunggah EXE untuk orang-orang yang tidak memiliki kompiler DarkBASIC ( Windows ).
sumber