ひるあんどんブログ

色々なことに手を出してみるブログ

セルオートマトンでは、ムーア近傍は2次元の四角の格子での中心のマス目を取り囲む8つのマス目からなる。 この近傍はセルオートマトン理論のパイオニアであるエドワード F. ムーアの名前から取られた。多くのボードゲームは部屋のような四角の方形の碁盤目で遊ばれます。 いくつかのゲームでは近傍のマス目の状態について知ることがチップ(フィギュアやチェッカー等)の配置や戦略にとって重要となる。

あなたは方形のボードゲームの格子にチップがある状態をバイナリの行列で与えられ、1はマス目にチップがあり、0はなにもないマス目を表す。あなたは(0で始まる)行と列の番号の構造からなる、マス目における座標も与えられる。あなたはいくつのチップがこのマス目に近接しているか測定しなければいけない。すべてのマス目はその8つの近傍に影響する、垂直と水平と対角線のマスだ。

example

与えられた例(図を見ること)ではこれと同じ格子がある。

((1, 0, 0, 1, 0),
(0, 1, 0, 0, 0),
(0, 0, 1, 0, 1),
(1, 0, 0, 0, 0),
(0, 0, 1, 0, 0),)


最初の例では、座標(1, 2) で図を見るとこのマス目の周りには3つのチップがある。2つ目の例ではマス目の座標 (0, 0) であり、このセルにはチップがあるが、私たちは近傍のもののみ数える。従って結果は1である。

入力 3つの引数。(1/0)の整数からなる格子を表すタプルのタプル、マス目の列番号の整数、行番号の整数

出力 近傍のマス目にいくつのチップがあるかを整数で返す

count_neighbours(((1, 0, 0, 1, 0),

(0, 1, 0, 0, 0),

(0, 0, 1, 0, 1),

(1, 0, 0, 0, 0),

(0, 0, 1, 0, 0),), 1, 2) == 3

count_neighbours(((1, 0, 0, 1, 0),

(0, 1, 0, 0, 0),

(0, 0, 1, 0, 1),

(1, 0, 0, 0, 0),

(0, 0, 1, 0, 0),), 0, 0) == 1




どうやって使われるか 最初に述べたように、このアイデアボードゲームアルゴリズムを開発する時に有用だ。付け加えると、同じ原則がナビゲーションソフトや地図の測量を行うソフトに対しても有用だ。

事前条件
3 ≤ len(grid) ≤ 10
all(len(grid[0]) == len(row) for row in grid)

def count_neighbours(grid, row, col):
    count = 0
    NEIGHBORS =((-1, -1),(-1, 0),(-1, 1),(0, -1),(0, 1),(1, -1),(1, 0),(1,1))
    for diff in NEIGHBORS:
        n_row = row + diff[0]
        n_col = col + diff[1]
        if 0 <= n_row < len(grid) and 0 <= n_col < len(grid[n_row]):
            if grid[n_row][n_col]:
                count += 1
    return count


if __name__ == '__main__':
    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert count_neighbours(((1, 0, 0, 1, 0),
                             (0, 1, 0, 0, 0),
                             (0, 0, 1, 0, 1),
                             (1, 0, 0, 0, 0),
                             (0, 0, 1, 0, 0),), 1, 2) == 3, "1st example"
    assert count_neighbours(((1, 0, 0, 1, 0),
                             (0, 1, 0, 0, 0),
                             (0, 0, 1, 0, 1),
                             (1, 0, 0, 0, 0),
                             (0, 0, 1, 0, 0),), 0, 0) == 1, "2nd example"
    assert count_neighbours(((1, 1, 1),
                             (1, 1, 1),
                             (1, 1, 1),), 0, 2) == 3, "Dense corner"
    assert count_neighbours(((0, 0, 0),
                             (0, 1, 0),
                             (0, 0, 0),), 1, 1) == 0, "Single"


これは解き方がわからんくて、ヒントみた。(checkioではほとんど答えみたいなヒントがもらえます)
まず周囲8マスを表すタプルを定義する。

rowは行列の行(つまり、横のライン)

colは行列の列(つまり、縦のライン)

これいっつもごちゃごちゃになる…。良い覚え方があったlambdalisue.hatenablog.com





row,colそれぞれに対して調べて1があったらcountを加算する (pythonでは1はTrue)