< Zpět na seznam úloh

S2 Game of Life

var datasets = [
  {argv: [0, [[0,0,0], [1,1,1], [0,0,0]]], out: [[0,0,0], [1,1,1], [0,0,0]]},
  {argv: [1, [[0,0,0], [1,1,1], [0,0,0]]], out: [[0,1,0], [0,1,0], [0,1,0]]},
  {argv: [2, [[0,0,0], [1,1,1], [0,0,0]]], out: [[0,0,0], [1,1,1], [0,0,0]]},
  {argv: [3, [[0,0,0], [1,1,1], [0,0,0]]], out: [[0,1,0], [0,1,0], [0,1,0]]},
  {argv: [1, [[0,1,0,0,0], [0,0,1,0,0], [1,1,1,0,0], [0,0,0,0], [0,0,0,0]]], out: [[0, 0, 0, 0, 0], [1, 0, 1, 0, 0], [0, 1, 1, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]]},
  {argv: [2, [[0,1,0,0,0], [0,0,1,0,0], [1,1,1,0,0], [0,0,0,0], [0,0,0,0]]], out: [[0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [1, 0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 0, 0]]},
  {argv: [3, [[0,1,0,0,0], [0,0,1,0,0], [1,1,1,0,0], [0,0,0,0], [0,0,0,0]]], out: [[0, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0]]},
  {argv: [4, [[0,1,0,0,0], [0,0,1,0,0], [1,1,1,0,0], [0,0,0,0], [0,0,0,0]]], out: [[0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 1, 1, 1], [0, 0, 0, 0]]},
  {argv: [5, [[0,1,0,0,0], [0,0,1,0,0], [1,1,1,0,0], [0,0,0,0], [0,0,0,0]]], out: [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 1, 1], [0, 0, 1, 0]]},
]
names = ["kroky", "bunky"]
var validator = (result, {out}) => {
  let s = result.map(row => [...row])
  console.log(s)
  console.log(out)
  return JSON.stringify(s) === JSON.stringify(out)
}
var remapInput = `_main_inputs[1] = [list(p) for p in _main_inputs[1]]`
pyodidePackages = ["numpy"]

Na Petriho misce máme čtvercovou mřížku, ve které žijí buňky. V každém čtverečku mřížky může být jedna živá buňka, nebo žádná.

Buňka bude v příštím kole živá, pokud má správný počet živých sousedů. Za sousedy považujeme všech osm buněk, které v mřížce sousedí třeba i jen rohem. Buňky na okraji mřížky mají přirozeně menší počet sousedů.

Konkrétně, buňka bude v příštím kole živá, pokud:

Program dostává dva parametry:

Většina kódu už je hotová. Zbývá doplnit logiku, která určí stav každé buňky v příštím kroku.

def kopie(bunky):
  return [list(radek) for radek in bunky]

def pocet_sousedu(bunky, y, x):
  vysledek = 0
  for i in range(max(y-1, 0), min(y+2, len(bunky))):
    for j in range(max(x-1, 0), min(x+2, len(bunky[i]))):
      vysledek += bunky[i][j]
  return vysledek - bunky[y][x]

def main(kroky, bunky):
  for i in range(kroky):
    pristi = kopie(bunky)
    for y, radek in enumerate(bunky):
      for x, stav in enumerate(radek):
        pocet = pocet_sousedu(bunky, y, x)
        # tady je potřeba rozhodnout, jestli buňka bude žít
        pristi[y][x] = 1
    # na konci kroku, když máte spočítaný `příští` stav,
    # nezapomeňte ho přepsat do reality
  return bunky