pengantar
Ada seorang pemungut pajak yang mengalami kesulitan mengelola pajak kerajaannya: catatan sejarah telah terbakar dalam api besar.
Dia ingin mencari tahu berapa banyak masa lalu yang mungkin ada dalam hal di mana uang saat ini diwarisi dari. Untungnya, kerajaannya sangat sederhana.
Kerajaan dapat dimodelkan dengan matriks boolean 2D, di mana l
mewakili seseorang yang telah mewarisi uang, dan O
mewakili seseorang yang belum. Sebagai contoh:
l O l l
O O O l
l O l O
O O O l
(Ini akan selalu menjadi persegi panjang)
Pada generasi berikutnya, kerajaan lebih kecil (Serigala kuat!).
Generasi berikutnya akan terlihat seperti ini, ditumpangkan pada generasi sebelumnya ( x
adalah pengganti bagi keturunan di generasi berikutnya)
l O l l
x x x
O O O l
x x x
l O l O
x x x
O O O l
Sebuah keturunan akan melihat nenek moyang yang secara langsung di sekitar mereka (Jadi atas meninggalkan x
akan melihat { l
, O
, O
, O
}, disebut lingkungan persegi panjang unaligned )
Jika hanya satu leluhur yang mewarisi uang, keturunan akan mewarisi uang dari mereka. Jika lebih dari satu leluhur memiliki uang warisan, mereka akan bertengkar dan keturunannya tidak akan mewarisi uang. Jika tidak ada yang mewarisi uang, keturunannya tidak akan mewarisi uang.
(Lebih dari satu keturunan dapat mewarisi dari satu leluhur)
Jadi, generasi berikutnya akan terlihat seperti:
l l O
l l O
l l O
Tantangan
Memasukkan
Keadaan saat ini dari generasi, sebagai array array dari dua nilai berbeda, di mana array dalam semua memiliki panjang yang sama.
Misalnya, untuk contoh di atas, bisa jadi:
[
[True, True, False],
[True, True, False],
[True, True, False]
]
Keluaran
Integer mewakili jumlah generasi unik sebelumnya di mana generasi berikutnya adalah input.
Anda dapat mengasumsikan bahwa jawabannya akan selalu kurang dari 2 ^ 30 - 1. (atau 1073741823).
Generasi sebelumnya akan disebut "preimage" dan tantangan ini adalah menghitung preimage .
Mencetak gol
Ini adalah tantangan kode tercepat , sehingga setiap pengiriman akan diuji di komputer saya, dan pengiriman yang membutuhkan waktu paling sedikit akan menjadi pemenang.
Contoh Input dan Output
(Di mana 1
keturunan yang mewarisi uang, dan 0
merupakan keturunan yang tidak mewarisi uang)
Memasukkan:
[[1, 0, 1],
[0, 1, 0],
[1, 0, 1]]
Keluaran:
4
Memasukkan:
[[1, 0, 1, 0, 0, 1, 1, 1],
[1, 0, 1, 0, 0, 0, 1, 0],
[1, 1, 1, 0, 0, 0, 1, 0],
[1, 0, 1, 0, 0, 0, 1, 0],
[1, 0, 1, 0, 0, 1, 1, 1]]
Keluaran:
254
Memasukkan:
[[1, 1, 0, 1, 0, 1, 0, 1, 1, 0],
[1, 1, 0, 0, 0, 0, 1, 1, 1, 0],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 1, 0, 0, 0, 0, 1, 1, 0, 0]]
Keluaran:
11567