Сагдиев Айрат, 321 группа SpiralString 11375
s02220725 SpiralString 8526
t1from collections import Countert1from collections import Counter
22
3class Spiral:3class Spiral:
44
5    def __init__(self, string=''):5    def __init__(self, string=''):
6        self.cells = Counter(string)6        self.cells = Counter(string)
77
8    def __iter__(self):8    def __iter__(self):
9        return self.cells.elements()9        return self.cells.elements()
1010
11    def __add__(self, other):11    def __add__(self, other):
12        if not isinstance(other, Spiral):12        if not isinstance(other, Spiral):
13            return NotImplemented13            return NotImplemented
14        return type(self)(self.cells + other.cells)14        return type(self)(self.cells + other.cells)
1515
16    def __sub__(self, other):16    def __sub__(self, other):
17        if not isinstance(other, Spiral):17        if not isinstance(other, Spiral):
18            return NotImplemented18            return NotImplemented
19        return type(self)(self.cells - other.cells)19        return type(self)(self.cells - other.cells)
2020
21    def __mul__(self, n):21    def __mul__(self, n):
22        if not isinstance(n, int) or n < 0:22        if not isinstance(n, int) or n < 0:
23            return NotImplemented23            return NotImplemented
24        return type(self)(list(self) * n)24        return type(self)(list(self) * n)
25    __rmul__ = __mul__25    __rmul__ = __mul__
2626
27    def __len__(self):27    def __len__(self):
28        return sum(self.cells.values())28        return sum(self.cells.values())
2929
30    def _square(self):30    def _square(self):
31        dx, dy = ((0, 1, 0, -1), (1, 0, -1, 0))31        dx, dy = ((0, 1, 0, -1), (1, 0, -1, 0))
32        field = {}32        field = {}
33        x = y = n = k = j = 033        x = y = n = k = j = 0
34        mx = Mx = my = My = 034        mx = Mx = my = My = 0
35        for i, c in enumerate(self):35        for i, c in enumerate(self):
36            field[x, y] = c36            field[x, y] = c
37            mx, my = (min(mx, x), min(my, y))37            mx, my = (min(mx, x), min(my, y))
38            Mx, My = (max(Mx, x), max(My, y))38            Mx, My = (max(Mx, x), max(My, y))
39            if i >= n:39            if i >= n:
40                k += 140                k += 1
41                n += k41                n += k
42                j = (j + 1) % 442                j = (j + 1) % 4
43            x += dx[j]43            x += dx[j]
44            y += dy[j]44            y += dy[j]
45        return (field, (mx, Mx), (my, My))45        return (field, (mx, Mx), (my, My))
4646
47    def __str__(self):47    def __str__(self):
48        field, (mx, Mx), (my, My) = self._square()48        field, (mx, Mx), (my, My) = self._square()
49        return '\n'.join((''.join((field.get((x, y), ' ') for x in range49        return '\n'.join((''.join((field.get((x, y), ' ') for x in range
>(mx, Mx + 1))) for y in range(my, My + 1)))>(mx, Mx + 1))) for y in range(my, My + 1)))
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op