Petani Jack sangat miskin. Dia ingin menyalakan seluruh pertaniannya tetapi dengan biaya minimum. Sebuah lampu dapat menerangi selnya sendiri dan juga delapan tetangganya. Dia telah mengatur lampu di bidangnya, tetapi dia membutuhkan bantuan Anda untuk mengetahui apakah dia menyimpan lampu tambahan atau tidak.
Lampu tambahan: Lampu yang dilepas dari pertanian tidak akan membuat perbedaan dengan jumlah sel yang menyala. Selain itu, lampu yang akan Anda tunjuk tidak akan dilepas satu per satu, tetapi akan dilepas secara bersamaan.
Catatan: Satu-satunya tindakan yang dapat Anda lakukan adalah melepas beberapa lampu. Anda tidak dapat mengatur ulang atau memasukkan lampu. Target akhir Anda adalah untuk menghapus jumlah lampu maksimum sehingga setiap sel yang dinyalakan sebelumnya masih menyala.
Bantu Farmer Jack dalam menemukan jumlah maksimum lampu yang tidak berguna sehingga ia dapat menggunakannya di tempat lain.
Memasukkan
Anda akan diberikan dalam dimensi baris pertama dari bidang M dan N .Selanjutnya M garis ikuti mengandung N karakter masing-masing mewakili lapangan.
'1' mewakili sel tempat lampu disimpan.
'0' mewakili sel kosong.
Keluaran
Anda harus mengeluarkan bilangan bulat yang berisi jumlah lampu tidak berguna.
Input sampel:
3 3
100
010
001
Output sampel:
2
Pemenang:
Karena ini adalah kode golf, pemenang akan menjadi orang yang akan berhasil menyelesaikan tugas dalam jumlah karakter paling sedikit
Jawaban:
Mathematica 186 (serakah) dan 224 (semua kombinasi)
Solusi Serakah
Ini mematikan lampu berlebihan satu per satu. Jika cakupan cahaya tidak berkurang ketika lampu padam, lampu itu bisa dihilangkan. Pendekatan serakah sangat cepat dan dapat dengan mudah menangani matriks 15x15 dan jauh lebih besar (lihat di bawah). Ini mengembalikan solusi tunggal, tetapi tidak diketahui apakah itu optimal atau tidak. Kedua pendekatan, dalam versi golf, mengembalikan jumlah lampu yang tidak digunakan. Pendekatan un-golfed juga menampilkan grid, seperti di bawah ini.
Sebelum:
Setelah:
Solusi Optimal menggunakan semua kombinasi lampu (224 karakter)
Terima kasih kepada @ Clément.
Versi ungolfed menggunakan semua kombinasi lampu
fFungsi transformasi morfologis yang digunakan dalam
sameCoverageQ
perlakukan sebagai menyala (nilai = 1 bukannya nol) 3 x 3 persegi di mana setiap cahaya berada. Ketika cahaya berada di dekat tepi tambak, hanya kotak (kurang dari 9) dalam batas-batas pertanian dihitung. Tidak ada penghitungan yang berlebihan; kotak yang diterangi oleh lebih dari satu lampu cukup dinyalakan. Program mematikan setiap lampu dan memeriksa untuk melihat apakah keseluruhan cakupan pencahayaan di lahan berkurang. Jika tidak, lampu tersebut dihilangkan.nOnes[matrix]
menghitung jumlah sel yang ditandai. Ini digunakan untuk menghitung lampu dan juga untuk menghitung sel yang menyalasameCoverageQ[mat1, mat2]
menguji apakah sel-sel yang menyala di mat1 sama dengan jumlah sel-sel yang menyala di mat2.MorphologicalTransform [[mat] mengambil matriks cahaya dan mengembalikan matriks` sel yang mereka nyalakan.c[m1]
mengambil semua kombinasi lampu dari m1 dan mengujinya untuk cakupan. Di antara mereka yang memiliki jangkauan maksimum, ia memilih yang memiliki bola lampu paling sedikit. Masing-masing adalah solusi optimal.Contoh 1:
Pengaturan 6x6
Semua solusi optimal.
Versi golf menggunakan semua kombinasi lampu.
Versi ini menghitung jumlah lampu yang tidak digunakan. Itu tidak menampilkan grid.
c
mengembalikan jumlah lampu yang tidak digunakan.n[matrix]
menghitung jumlah sel yang ditandai. Ini digunakan untuk menghitung lampu dan juga untuk menghitung sel yang menyalas[mat1, mat2]
menguji apakah sel-sel yang menyala di mat1 sama dengan jumlah sel-sel yang menyala di mat2.t [[mat] mengambil matriks cahaya dan mengembalikan matriks` sel-sel yang mereka nyalakan.c[j]
mengambil semua kombinasi lampu dari j dan mengujinya untuk cakupan. Di antara mereka yang memiliki jangkauan maksimum, ia memilih yang memiliki bola lampu paling sedikit. Masing-masing adalah solusi optimal.Contoh 2
Dua lampu dapat disimpan dengan cakupan pencahayaan yang sama. c [m]
sumber
Python, 309 karakter
Bekerja menggunakan bitmask.
L
adalah daftar lampu, di mana setiap cahaya diwakili oleh bilangan bulat dengan (hingga) 9 bit yang diatur untuk pola cahayanya. Kemudian kami mencari subset dari daftar ini yang bitwise-nya atau sama dengan bitwise-atau seluruh daftar. Subset terpendek adalah pemenang.m
adalah topeng yang mencegah sampul bit saat bergeser.sumber
Java 6 - 509 byte
Saya membuat beberapa asumsi tentang batasan dan menyelesaikan masalah seperti yang dinyatakan saat ini.
Jalankan seperti ini:
java F <inputfile 2>/dev/null
sumber
java F <inputfile 2>nul
, jika itu gagal makajava F <inputfile
abaikan pengecualian. Juga tidak akan berjalan dengan java 7.c ++ - 477 byte
sumber
Ruby, 303
[ini diberi kode untuk menjawab versi pertanyaan sebelumnya; baca catatan di bawah]
Mengkonversi ke array Boolean dan kemudian membandingkan lingkungan untuk perubahan.
Batasan (?): Ukuran bidang pertanian maksimum adalah 1.000 x 1.000. Masalahnya menyatakan "Petani Jack sangat miskin" jadi saya berasumsi pertaniannya tidak lebih besar. ;-) Batasan dapat dihapus dengan menambahkan 2 karakter.
CATATAN: Sejak saya mulai mengkode ini, tampaknya persyaratan pertanyaan berubah. Klarifikasi berikut telah ditambahkan "lampu yang akan Anda tunjuk tidak akan dilepas satu per satu, tetapi akan dilepas secara bersamaan" . Ketidakjelasan pertanyaan awal memungkinkan saya untuk menyimpan beberapa kode dengan menguji setiap pemindahan lampu. Dengan demikian, solusi saya tidak akan berfungsi untuk banyak kasus uji di bawah persyaratan baru. Jika saya punya waktu, saya akan memperbaikinya. Saya mungkin tidak. Tolong jangan terbalikkan jawaban ini karena jawaban lain di sini mungkin sepenuhnya sesuai.
sumber
APL, 97 karakter / byte *
Mengasumsikan a
⎕IO←1
dan⎕ML←3
lingkungan APL.Versi tidak disatukan:
Saya setuju bahwa lebih banyak kasus uji akan lebih baik. Ini yang acak:
Memasukkan:
Output (lampu tidak berguna):
Tata letak dengan lampu minimal (tidak termasuk dalam versi golf):
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL dapat ditulis dalam charset byte tunggal (lama) yang memetakan simbol APL ke nilai 128 byte atas. Oleh karena itu, untuk tujuan penilaian, program karakter N yang hanya menggunakan karakter ASCII dan simbol APL dapat dianggap sebagai panjang N byte.
sumber
C ++ 5.806 Bytes
Ini belum dioptimalkan untuk ukuran. Tetapi karena ada beberapa kontestan saya akan membiarkannya untuk saat ini.
Header Petani:
CPP Petani:
Dan serangkaian tes untuk menunjukkan bahwa kode melakukan apa yang harus dilakukan:
sumber
Perl 3420 byte
Bukan solusi golf, tapi saya menemukan masalah ini menarik:
(I / O dikeluarkan sehingga saya bisa menunjukkan tes konkret)
sumber
Python - 305 byte
sumber