Wprowadzenie
Jest poborca podatkowy, który ma pewne problemy z zarządzaniem podatkami swojego królestwa: zapisy historyczne spłonęły w wielkim pożarze.
Chce dowiedzieć się, ile może istnieć przeszłości, jeśli chodzi o to, skąd odziedziczyły obecne pieniądze. Na szczęście jego królestwo jest bardzo proste.
Królestwo można modelować za pomocą macierzy boolowskiej 2D, w której l
reprezentuje ktoś, kto odziedziczył pieniądze, i O
reprezentuje kogoś, kto tego nie zrobił. Na przykład:
l O l l
O O O l
l O l O
O O O l
(Zawsze będzie to prostokąt)
W następnym pokoleniu królestwo jest mniejsze (wilki są silne!).
Następna generacja wyglądałaby tak, nałożona na poprzednią generację ( x
jest symbolem zastępczym dla potomka w następnej generacji)
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
Potomek będzie patrzeć na przodków, które są bezpośrednio wokół nich (So lewym górnym rogu x
będzie zobaczyć { l
, O
, O
, O
}, zwany aligné prostokątne sąsiedztwo )
Jeśli tylko jeden przodek odziedziczył pieniądze, potomek odziedziczy je od nich. Jeśli więcej niż jeden przodek odziedziczy pieniądze, będą się kłócić, a potomek nie odziedziczy pieniędzy. Jeśli nikt nie odziedziczył pieniędzy, potomek nie odziedziczy żadnych pieniędzy.
(Więcej niż jeden potomek może odziedziczyć po jednym przodku)
Tak więc następna generacja wyglądałaby następująco:
l l O
l l O
l l O
Wyzwanie
Wejście
Obecny stan generacji, jako tablica tablic o dowolnych dwóch odrębnych wartościach, przy czym tablice wewnętrzne mają tę samą długość.
Na przykład w powyższym przykładzie może to być:
[
[True, True, False],
[True, True, False],
[True, True, False]
]
Wynik
Liczba całkowita reprezentująca liczbę unikalnych poprzednich generacji, przy czym wejście nowej generacji jest wejściem.
Możesz założyć, że odpowiedź będzie zawsze mniejsza niż 2 ^ 30 - 1. (lub 1073741823).
Poprzednia generacja nazywa się „preimage”, a tym wyzwaniem byłoby policzyć preimage .
Punktacja
To jest najszybszy kod wyzwanie, więc każde zgłoszenie zostanie przetestowane na moim komputerze, a zgłoszenie, które zajmie najmniej czasu, będzie zwycięzcą.
Przykład wejścia i wyjścia
(Gdzie 1
jest potomek, który odziedziczył pieniądze i 0
jest potomkiem, który nie odziedziczył pieniędzy)
Wejście:
[[1, 0, 1],
[0, 1, 0],
[1, 0, 1]]
Wynik:
4
Wejście:
[[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]]
Wynik:
254
Wejście:
[[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]]
Wynik:
11567