< Zpět na seznam úloh

S3 Vedení tepla

var datasets = [
  {arg:[[4, 4, 0]], out:[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]},
  {arg:[[4, 4, 0], [9, 9, 100]], out:[[66.2, 58.9, 53.5, 50, 48.8, 50, 53.5, 58.9, 66.2, 73.5], [58.9, 54.5, 50, 46.5, 45.1, 46.5, 50, 54.5, 58.9, 61.6], [53.5, 50, 45.5, 41.1, 38.4, 41.1, 45.5, 50, 53.5, 54.9], [50, 46.5, 41.1, 33.8, 26.5, 33.8, 41.1, 46.5, 50, 51.2], [48.8, 45.1, 38.4, 26.5, 0, 26.5, 38.4, 45.1, 48.8, 50], [50, 46.5, 41.1, 33.8, 26.5, 33.8, 41.1, 46.5, 50, 51.2], [53.5, 50, 45.5, 41.1, 38.4, 41.1, 45.5, 50, 53.5, 54.9], [58.9, 54.5, 50, 46.5, 45.1, 46.5, 50, 54.5, 58.9, 61.6], [66.2, 58.9, 53.5, 50, 48.8, 50, 53.5, 58.9, 66.2, 73.5], [73.5, 61.6, 54.9, 51.2, 50, 51.2, 54.9, 61.6, 73.5, 100]]},
  {arg: [[0, 0, 0], [0, 5, 0], [5, 0, 100], [5, 5, 100]], out:[[0, 27.7, 43.4, 56.6, 72.3, 100, 72.3, 56.6, 43.4, 27.7], [25.3, 33.8, 44.5, 55.5, 66.2, 74.7, 66.2, 55.5, 44.5, 33.8], [33.5, 37.6, 45.5, 54.5, 62.4, 66.5, 62.4, 54.5, 45.5, 37.6], [33.5, 37.6, 45.5, 54.5, 62.4, 66.5, 62.4, 54.5, 45.5, 37.6], [25.3, 33.8, 44.5, 55.5, 66.2, 74.7, 66.2, 55.5, 44.5, 33.8], [0, 27.7, 43.4, 56.6, 72.3, 100, 72.3, 56.6, 43.4, 27.7], [25.3, 33.8, 44.5, 55.5, 66.2, 74.7, 66.2, 55.5, 44.5, 33.8], [33.5, 37.6, 45.5, 54.5, 62.4, 66.5, 62.4, 54.5, 45.5, 37.6], [33.5, 37.6, 45.5, 54.5, 62.4, 66.5, 62.4, 54.5, 45.5, 37.6], [25.3, 33.8, 44.5, 55.5, 66.2, 74.7, 66.2, 55.5, 44.5, 33.8]]},
  {arg: [[0, 0, 0], [0, 2, 0], [0, 4, 0], [0, 6, 0], [0, 8, 0], [5, 0, 100], [5, 2, 100], [5, 4, 100], [5, 6, 100], [5, 8, 100]], out: [[0, 22.7, 41.1, 58.9, 77.3, 100, 77.3, 58.9, 41.1, 22.7], [12.4, 24.8, 41.4, 58.6, 75.2, 87.6, 75.2, 58.6, 41.4, 24.8], [0, 22.7, 41.1, 58.9, 77.3, 100, 77.3, 58.9, 41.1, 22.7], [12.4, 24.8, 41.4, 58.6, 75.2, 87.6, 75.2, 58.6, 41.4, 24.8], [0, 22.7, 41.1, 58.9, 77.3, 100, 77.3, 58.9, 41.1, 22.7], [12.4, 24.8, 41.4, 58.6, 75.2, 87.6, 75.2, 58.6, 41.4, 24.8], [0, 22.7, 41.1, 58.9, 77.3, 100, 77.3, 58.9, 41.1, 22.7], [12.4, 24.8, 41.4, 58.6, 75.2, 87.6, 75.2, 58.6, 41.4, 24.8], [0, 22.7, 41.1, 58.9, 77.3, 100, 77.3, 58.9, 41.1, 22.7], [12.4, 24.8, 41.4, 58.6, 75.2, 87.6, 75.2, 58.6, 41.4, 24.8]]},
]
names = ["zdroje"]
var validator = (result, {out}) => {
  for (let i=0; i<out.length; i++) {
    for (let j=0; j<out[i].length; j++) {
      if (!(Math.abs(out[i][j] - result[i][j]) < 1)) {
        console.log(out[i][j], result[i][j])
        return false
      }
    }
  }
  return true;
}
var remapInput = `_main_inputs[0] = [list(p) for p in _main_inputs[0]]`
pyodidePackages = ["numpy"]

V laboratoři máme čtvercovou mřížku 10×10 a v ní někde umístěné ohřívače nebo ochlazovače. Představujeme si, že okolo mřížky nic není, takže se teplo šíří jen mezi sousedními buňkami mřížky. Ohřívače nebo ochlazovače mají napevno nastavenou teplotu, se kterou nic nehne. Program má určit teplotu v každé buňce mřížky potom, co se teplota ustálí.

Abychom dokázali popsat, co se děje, rozdělíme si čas do krátkých kroků. V každém kroku se každá buňka mřížky (ve které není zdroj tepla nebo chladu) ohřeje nebo ochladí na průměrnou teplotu svých čtyř sousedů. Program má provést dostatečný počet kroků, aby se teplota kterékoli buňky přestala měnit, a pak vrátit výsledek. Aby vám to vyšlo, udělejte kroků aspoň 1000.

Vstupem programu je seznam zdrojů tepla nebo chladu. Každý z nich je popsaný třemi čísly:

Výstupem programu je vždy seznam deseti seznamů deseti čísel, vypisující hodnotu každé buňky. Buňky vypisujeme počínaje buňkou (0, 0) po řádcích. Hodnoty mají být přesné na jednotky (nula desetinných míst).

Na okrajích je mřížka propojená dokola jako hrací plocha hry Snake. Můžeme si to představit tak, že pracujeme s ohromnou plochou, která se pravidelně opakuje po 10 políčkách. Ve skutečnosti je tohle ale to nejjednodušší, co s okraji světa můžeme udělat.

Grafika

Barevná mřížka na straně vstupu ukazuje správný výstup. Teplota 0 je vyjádřená tmavě modrou, 100 je žlutá, mezi tím jsou odstíny fialové a červené. Při najetí myší na některý čtvereček se vám teplota vypíše.

Barevná mřížka na straně výstupu ukazuje výstup vašeho programu.

Indexy

Python se na levém a horním okraji chová, jak potřebujeme: propojí je na konec pole. Konkrétně, bunky[-1][x] vezme buňku v posledním řádku a bunky[y][-1] vezme buňku ve sloupci nejvíc napravo. To je fajn.

Na opačných koncích nám ale indexování větší než 9 neodpustí. Konkrétně, bunky[10][x] vyhodí IndexError, stejně jako bunky[y][10].

Nabízí se fígl: jestli byste v programu psali cyklus for x in range(0, 10), můžete místo toho použít cyklus for x in range(-1, 9) a všechno vyjde samo hezky. Ušetříte si tím spoustu námahy.

Numpy

Jestli rádi používáte modul numpy, zvlášť vám tady přijde vhod funkce np.roll, která umí posunout celou plochu o políčko jedním směrem a okraje přitom propojuje dokola přesně, jako to potřebujeme.

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

def main(zdroje):
  bunky = [[0.0 for x in range(10)] for y in range(10)]

  for i in range(1000):
    for x, y, t in zdroje:
      bunky[y][x] = t
  
  return bunky