The lima belas teka-teki adalah aneh dalam bahwa hanya setengah negara-negara yang mungkin pengaturan yang dipecahkan. Jika Anda membalik 14 dan 15 ubin, tidak mungkin Anda bisa menggeser balok sehingga dibalik.
Tugas Anda adalah membuat program yang menerima daftar bilangan bulat dalam format pilihan Anda (berisi persis satu contoh dari setiap angka dari 0 hingga 15, dengan 0 sebagai ruang kosong) yang mewakili keadaan susunan ubin di kisi 4x4, dan menampilkan nilai boolean tunggal yang menentukan apakah kisi tersebut dapat dipecahkan atau tidak.
Kode terpendek untuk melakukan ini dalam bahasa apa pun menang.
Jawaban:
Jelly , 9 byte
Tautan monadik yang menerima daftar bilangan bulat yang membaca dalam urutan baris-utama bergantian antara kiri-kanan dan kanan-kiri yang menghasilkan
0
jika dipecahkan dan1
jika tidak (untuk membalikkan ini tambahkan¬
ke kanan kode).Cobalah online! (contoh ini adalah papan di mana 12 hanya perlu meluncur ke tempatnya)
Bagaimana?
Mirip dengan jawaban John Dvorak, kami menghitung paritas dan menggunakan urutan input seperti ular untuk menyederhanakan paritas checker-board, meskipun alih-alih memeriksa persamaan paritas, kami menjumlahkan jumlah out-of-order dengan indeks non-nol dan menguji apakah itu aneh:
sumber
J, 28 karakter
Urutan input adalah baris-utama dengan baris yang dibaca bergantian dari kiri ke kanan dan kanan ke kiri dalam satu jalur di seberang tabel. Diasumsikan nol milik sudut kiri atas.
Penggunaan di Windows:
Penjelasan:
<nul set /p=
digunakan untuk mencegah baris baru dalam input, yangecho
menghasilkan yang".
tidak suka. Tentu saja, Unix mendukungecho /n
.v&.".&.stdin''
membaca "v under parse di bawah stdin" berarti "input, lalu parsing input, lalu lakukan v, lalu unduh parse (= format), lalu undo input (= output)".1!:1]3
lebih pendek satu karakter, tetapi tidak memiliki invers yang ditentukan.C.!.2
berarti "paritas permutasi". Ia mengembalikan1
(bahkan paritas) atau_1
(paritas ganjil). Itu adalah,_1^inversions
_1^i.&0
berarti "-1 pangkat indeks 0".C.!.2=_1^i.&0
berarti "apakah paritas permutasi sama dengan paritas posisi lubang?"Ini berfungsi untuk papan 4x4, tetapi jika posisi ujung yang diinginkan adalah baris-utama kiri-ke-kanan, maka permutasi untuk posisi yang diselesaikan memiliki jumlah ganjil inversi, dan dengan demikian paritas ganjil. Juga, paritas dibalik (untuk urutan input apa pun) ketika posisi lubang yang diinginkan bergerak dari kiri atas ke kanan bawah. Dalam kedua kasus, perbaikannya adalah satu karakter: tambahkan
-
setelah=
untuk membalikkan paritas yang diharapkan.Bukti kebenaran:
Setelah setiap gerakan, nol bertukar posisi dengan beberapa angka, membalikkan paritas permutasi. Angka nol juga bergantian antara posisi kotak-kotak putih dan hitam, ditunjukkan oleh posisi ganjil dan genap dalam pemesanan input. Dengan demikian, kondisi ini perlu. Ini juga cukup dengan argumen penghitungan: sudah menjadi rahasia umum bahwa separuh dari posisi itu bisa dipecahkan. Kondisi ini menyaring tepat setengah dari posisi yang mungkin.
sumber