前書き
彼の王国の税金を管理することに問題を抱えている徴税人がいます:歴史的な記録は大火事で焼失しました。
彼は、現在のお金がどこから受け継がれたかという点で、過去の可能性がいくつあるかを知りたいと思っています。幸いなことに、彼の王国は非常に単純です。
王国は2Dブール行列によってモデル化できます。ここで、はl
お金を相続した人と、相続O
していない人を表します。例えば:
l O l l
O O O l
l O l O
O O O l
(常に長方形になります)
次の世代では、王国は小さくなります(狼は強いです!)。
次の世代はこのようになり、前の世代に重ね合わされます(x
次の世代の子孫のプレースホルダーです)
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
(左上がそう子孫は、それらの周りに直接ある先祖を見ていきx
{表示されl
、O
、O
、O
}と呼ばれる、アンアラインド矩形近傍)
祖先が1人だけお金を受け継いだ場合、子孫は彼らからお金を受け継ぎます。複数の祖先がお金を相続した場合、彼らはつまずき、子孫は結局お金を相続しないことになります。誰もお金を相続していない場合、子孫はお金を相続しません。
(複数の子孫が1つの祖先から継承できます)
したがって、次世代は次のようになります。
l l O
l l O
l l O
チャレンジ
入力
任意の2つの異なる値の配列の配列としての生成の現在の状態。内部配列はすべて同じ長さです。
たとえば、上記の例では、次のようになります。
[
[True, True, False],
[True, True, False],
[True, True, False]
]
出力
次の世代が入力である、前の一意の世代の数を表す整数。
答えは常に2 ^ 30-1(または1073741823)未満であると想定できます。
前世代は「プリイメージ」と呼ばれ、この課題はプリイメージを数えることでした。
得点
これは最速のコード課題なので、各提出物は私のコンピューターでテストされ、最も時間がかからない提出物が勝者となります。
入力と出力の例
(1
お金を受け継いだ子孫とお金を受け継い0
でいない子孫はどこですか)
入力:
[[1, 0, 1],
[0, 1, 0],
[1, 0, 1]]
出力:
4
入力:
[[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]]
出力:
254
入力:
[[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]]
出力:
11567