Terinspirasi oleh /puzzling/24334/to-catch-a-thief
Anda diberi kotak n
dengan n
( n
itu sendiri adalah input opsional) yang diisi dengan 0
s dan 1
s (atau karakter lain pilihan Anda). Anda bertujuan untuk membuat setiap sel sama (baik 0
atau 1
). Anda dapat melakukan serangkaian gerakan seperti yang didefinisikan di bawah ini (perhatikan perbedaannya dengan tautan SE yang membingungkan):
- Pilih sel.
- Setiap sel di baris dan kolom yang sama (kecuali sel itu sendiri) diubah menjadi kebalikannya.
0
ke1
dan1
ke0
.
Keluarkan jumlah minimum gerakan yang diperlukan untuk menyelesaikan tugas. Jika tidak dapat dipecahkan, output apa pun kecuali integer non-negatif. Kode terpendek menang.
Contoh data
1 0 0
0 0 0
0 0 0
-1
1 1 1
1 1 1
1 1 1
0
1 0 1
0 1 0
1 0 1
1
1 1 1 1
0 0 0 0
0 0 0 0
1 1 1 1
2
0 1 0 1
1 0 1 0
1 0 1 0
0 1 0 1
2
code-golf
grid
puzzle-solver
path-finding
ghosts_in_the_code
sumber
sumber
1000
(disusun ulang sebagai persegi, tidak peduli bagaimana).Jawaban:
Matlab 171 byte
Input harus berupa matriks 2d, jadi Anda akan menyebutnya seperti
c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(titik koma memulai baris baru). Fungsi ini hanya bruteforces semua gerakan yang mungkin, jadi kami mendapatkan runtime dariO(2^(n^2))
.Bagaimana itu dilakukan
Ini dilakukan dengan memilih semua cara yang mungkin untuk mengisi matriks lain dengan ukuran yang sama dengan yang satu dan nol, ini pada dasarnya menghitung dalam biner yang mana setiap entri matriks mewakili kekuatan tertentu 2.
Kemudian kami melakukan gerakan pada sel-sel yang 1, ini dilakukan dengan jumlah (mod 2) dari dua lilitan dua dimensi dengan vektor yang berukuran 1xn dan nx1.
Akhirnya kami memutuskan apakah gerakan itu benar-benar menghasilkan hasil yang diinginkan, dengan menghitung simpangan baku atas semua entri. Standar deviasi hanya nol jika semua entri sama. Dan setiap kali kami benar-benar menemukan hasil yang diinginkan, kami membandingkannya dengan jumlah gerakan solusi sebelumnya. Fungsi akan kembali
inf
jika masalah yang diberikan tidak dapat dipecahkan.Matematika?
Sebenarnya perlu dicatat bahwa semua gerakan itu bersama-sama menghasilkan kelompok abelian! Jika ada yang benar-benar berhasil mengkalsifikasi kelompok-kelompok itu, beri tahu saya.
Versi golf:
Versi lengkap (dengan output dari gerakan aktual.)
sumber
Perl 5, 498 byte
Ini menerima 'n' dan hasil yang diinginkan, dan mengeluarkan hitungan, atau 'X' jika tidak ada.
Sebagai contoh:
memberi
2
. Ini hanya akan berfungsi ketika n ^ 2 <= 64, jadin <= 8
. Meskipun cukup lambat bahkan dengan n serendah 5. Ini membangun array ^ 3 bit, dan mengurutkan array 2 ^ (n ^ 2) sebelumnya, karena mengapa tidak ?Saya telah menyia-nyiakan beberapa umpan baris di sini untuk dibaca :
sumber