﻿<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="/cjs/examples.screen.xsl" media="screen"?>
<examples chapter="Aplikace magických metod" directory="magic">

<!--
  <example>
    <text>
    </text>
    <hint>
    </hint>
    <solution src="magic/.py" lang="python" />
  </example>
-->


  <example>
    <text>
        Při řešení úlohy <a href="procvicovani.hry2.xml">Život</a> by se nám bývala docela hodila cyklická datová struktura. Zkuste proto navrhnout (a naimplementovat) variantu datového typu <em>seznam</em>, která se však bude chovat cyklicky, tzn. že bude zvládat mimo jiné následující operace:
        <pre>>>> from cyclic_list import CyclicList
>>> xs = CyclicList(range(10))
>>> xs
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> len(xs)
10

>>> xs[9]
9
>>> xs[10]
0

>>> xs[8:]
[8, 9]
>>> xs[18:]
[8, 9]

>>> xs[-10]
0
>>> xs[-11]
9

>>> xs[::3]
[0, 3, 6, 9]
>>> xs[::-3]
[9, 6, 3, 0]

>>> for x in xs: print(x)
...
0
1
2
3
4
5
6
7
8
9</pre>
        Krok ve výřezové notaci by se měl chovat stejně jako u normálního seznamu – při čísle vyšším než počet prvků se vrátí podle znaménka buď pouze první nebo poslední prvek. Jinak bychom se totiž asi museli ucyklit :-)
    </text>
    <hint>
        Implementace uvedeného chování může být překvapivě krátká – pouhých pár řádek kódu! Je ovšem třeba mít ten správný nápad. I bez správného nápadu se ale dá napsat, byť delší.
    </hint>
  </example>

  <example>
    <text>
        Doplňte implementaci z předchozího úkolu o testovací sadu, která bude obsahovat výše uvedené příklady (byť upravené) plus všechny další možnosti použití výřezové notace, a to jak pro indexy v běžném rozsahu, tak samozřejmě i pro indexy v rozsahu cyklickém.<br/>
        PS: Bonusem je „vykuchání“ originálních testů na seznamy z distribuce Python'u a rozchození implementace i pro ně.
    </text>
    <hint>
        Jde o to, že náš cyklický seznam by se měl ve všech ostatních případech – kromě dotazů na indexy – chovat jako běžný pythoní seznam. Pokud by se tak nechoval, museli bychom pro práci s ním napsat hromadu dalších obslužných metod (podle úlohy, ve které bychom ho použili), což jaksi postrádá kouzlo – to už pak můžeme rovnou použít normální seznam a dopsat speciální obsluhu cyklických okrajových podmínek…
    </hint>
  </example>


</examples>
