Intro
Anda sedang duduk di ruang dewan di ujung meja panjang. Anda melihat-lihat dan melihat Tim Cook, Dewan Direksi Apple, hantu Steve Jobs, dan Jack Donaghy. Apple telah menyebut pertemuan ini karena mereka telah menyadari betapa kerennya layar kunci Android, dan mereka ingin 1-UP mereka. Semua orang di ruangan itu menatapmu ketika Ghost Steve berteriak, "Tolong aku, Manusia CodeGolf! Kau satu-satunya harapanku!"
Masalah
Layar kunci Android adalah kotak 3 x 3 titik yang dapat dihubungkan dengan menggesekkan jari dari satu titik ke titik berikutnya, menciptakan jalur. Kata sandi dianggap sebagai jalur yang memungkinkan yang mencakup sejumlah titik, dan tidak termasuk sejumlah titik. (Pada ponsel yang sebenarnya, panjang jalur harus minimal 4 titik. Untuk tantangan ini, abaikan pembatasan itu.) Apple berencana untuk mengganti kisi 3 x 3 dengan kisi M x N, yaitu (M * N) / 9 kali lebih baik!
Aturan:
Misalnya, pada kisi 3x3 dengan titik-titik bernomor mulai 1 hingga 9:
1 2 3
4 5 6
7 8 9
Beberapa jalur yang valid adalah:
1
3
7,2,3
1,5,9,2
1,8,6,5,4
4,2,3,5,6,7,8,9
5,9,6,4
Dan beberapa jalur yang tidak valid adalah:
1,3
1,9,5
7,5,4,7
4,6
Input Anda akan terdiri dari tiga angka:
(M,N,d)
Di mana kisi-kisi adalah M x N, dan d adalah panjang jalur
1 <= M <= 16
1 <= N <= 16
1 <= d <= M * N
Program atau fungsi Anda akan diberi input sebagai string yang dipisah koma, dan itu harus mengembalikan jumlah kata sandi yang mungkin panjangnya. Sebagai contoh:
Input: 2,2,1
Output: 4
Input: 2,2,2
Output: 12
Input: 7,4,1
Output: 28
Aturan golf kode standar berlaku, kode terpendek menang!
//If I've made a mistake or the rules are unclear, please correct me!
sumber
256!
permutasi dari titik-titik pada kisi 16 x 16 yang mewakili pola buka kunci yang valid. Dalam praktiknya, program semacam itu tidak akan pernah berakhir.Jawaban:
Python - 170 byte
Saya menyadari bahwa tanda kurung di dalam
sum([...])
tidak sepenuhnya diperlukan, tetapi ada penalti kinerja yang besar untuk tidak memasukkannya.Output untuk semua 3x3:
Menghasilkan:
Untuk tujuan pengujian / konfirmasi, 6 nilai pertama untuk papan 4x5:
4x5 adalah kasus yang menarik untuk diverifikasi, karena memiliki lompatan pasak 2x2, 3x3, dan 2x4.
Penjelasan singkat
Secara umum, ini adalah pencarian lengkap, dengan pemangkasan kumulatif. Misalnya, karena
p(3, 3, 4)
1624,p(3, 3, 5)
hanya akan memeriksa 8120 kemungkinan, daripada memeriksa semua 15120 secara naif. Sebagian besar logika terkandung dalam kondisi:Dalam bahasa Inggris yang sederhana, ini dapat dipahami sebagai:
sumber
s
menetapkan satu set alih-alih daftar. Saya tidak melihat penalti kinerja besar menjatuhkan kurung; mengapa akan ada hukuman seperti itu?s
sebagai set. Pelajaran python saya untuk hari ini:{i}
dievaluasi sebagaiset([i])
. Saya akan mengharapkan kesalahan sintaksis. Menambahkan item ke set kemudian menjadis|{i}
, dan juga memungkinkani in s
untuk digantikan olehs&{i}
.