ПУТИЛОВ ГЕОРГИЙ КОНСТАНТИНОВИЧ SpiralString 10003
Тюшев Максим, 321 SpiralString 9446
t1from collections import defaultdictt1from collections import defaultdict
22
3def define_field_size(s):3def define_field_size(s):
4    if not s:4    if not s:
5        return (0, 0, 0, 0, [])5        return (0, 0, 0, 0, [])
6    (count, c, size) = (0, 2, 0)6    (count, c, size) = (0, 2, 0)
7    (x, y) = (2, 1)7    (x, y) = (2, 1)
8    (cx, cy) = (0, 0)8    (cx, cy) = (0, 0)
9    a = []9    a = []
10    while size < len(s):10    while size < len(s):
11        if not count:11        if not count:
12            count += 112            count += 1
13            t1 = size13            t1 = size
14            size = 214            size = 2
15            a.append(range(t1, size))15            a.append(range(t1, size))
16        else:16        else:
17            count += 117            count += 1
18            t1 = size18            t1 = size
19            size += c19            size += c
20            a.append(range(t1, size))20            a.append(range(t1, size))
21            c += 121            c += 1
22            if count % 2 == 0:22            if count % 2 == 0:
23                y += 223                y += 2
24            else:24            else:
25                x += 225                x += 2
26            if (count - 2) % 4 == 0:26            if (count - 2) % 4 == 0:
27                cy += 227                cy += 2
28            elif (count - 2) % 4 == 1:28            elif (count - 2) % 4 == 1:
29                cx += 229                cx += 2
30    a[-1] = a[-1][:len(s)]30    a[-1] = a[-1][:len(s)]
31    return (x, y, cx, cy, a)31    return (x, y, cx, cy, a)
3232
33class Spiral:33class Spiral:
3434
35    def __init__(self, s):35    def __init__(self, s):
36        s = list(s)36        s = list(s)
37        tt = defaultdict(int)37        tt = defaultdict(int)
38        for i in s:38        for i in s:
39            tt[i] += 139            tt[i] += 1
40        ttt = ''40        ttt = ''
41        for (k, v) in tt.items():41        for (k, v) in tt.items():
42            ttt += k * v42            ttt += k * v
43        self.buff = ttt43        self.buff = ttt
44        (x, y, self.xc, self.yc, self.a) = define_field_size(self.buff)44        (x, y, self.xc, self.yc, self.a) = define_field_size(self.buff)
45        self.field = [[' ' for _ in range(x)] for _ in range(y)]45        self.field = [[' ' for _ in range(x)] for _ in range(y)]
4646
47    def draw1(self):47    def draw1(self):
48        direct = {0: (1, 0), 1: (0, -1), 2: (-1, 0), 3: (0, 1)}48        direct = {0: (1, 0), 1: (0, -1), 2: (-1, 0), 3: (0, 1)}
49        (xc, yc) = (self.xc, self.yc)49        (xc, yc) = (self.xc, self.yc)
50        (minx, maxx, miny, maxy) = (len(self.field[0]), 0, len(self.field), 0)50        (minx, maxx, miny, maxy) = (len(self.field[0]), 0, len(self.field), 0)
51        for (i, it) in enumerate(self.a):51        for (i, it) in enumerate(self.a):
52            for j in it:52            for j in it:
53                if j >= len(self.buff):53                if j >= len(self.buff):
54                    break54                    break
55                self.field[yc][xc] = self.buff[j]55                self.field[yc][xc] = self.buff[j]
56                minx = min(minx, xc)56                minx = min(minx, xc)
57                maxx = max(maxx, xc)57                maxx = max(maxx, xc)
58                miny = min(miny, yc)58                miny = min(miny, yc)
59                maxy = max(maxy, yc)59                maxy = max(maxy, yc)
60                xc += direct[i % 4][0]60                xc += direct[i % 4][0]
61                yc += direct[i % 4][1]61                yc += direct[i % 4][1]
62            xc -= direct[i % 4][0]62            xc -= direct[i % 4][0]
63            yc -= direct[i % 4][1]63            yc -= direct[i % 4][1]
64            xc += direct[(i + 1) % 4][0]64            xc += direct[(i + 1) % 4][0]
65            yc += direct[(i + 1) % 4][1]65            yc += direct[(i + 1) % 4][1]
66        for i in range(len(self.field)):66        for i in range(len(self.field)):
67            if i > maxy or i < miny:67            if i > maxy or i < miny:
68                for j in range(len(self.field[0])):68                for j in range(len(self.field[0])):
69                    self.field[i][j] = ''69                    self.field[i][j] = ''
70        for i in range(len(self.field[0])):70        for i in range(len(self.field[0])):
71            if i > maxx or i < minx:71            if i > maxx or i < minx:
72                for j in range(len(self.field)):72                for j in range(len(self.field)):
73                    self.field[j][i] = ''73                    self.field[j][i] = ''
7474
75    def __str__(self):75    def __str__(self):
76        self.draw1()76        self.draw1()
77        ans = ''77        ans = ''
78        for line in self.field:78        for line in self.field:
79            t = ''.join(line)79            t = ''.join(line)
80            if t:80            if t:
81                ans += ''.join(line).rstrip() + '\n'81                ans += ''.join(line).rstrip() + '\n'
82        return ans[:-1]82        return ans[:-1]
8383
84    def __add__(self, other):84    def __add__(self, other):
85        return Spiral(self.buff + other.buff)85        return Spiral(self.buff + other.buff)
8686
87    def __sub__(self, other):87    def __sub__(self, other):
88        d1 = defaultdict(int)88        d1 = defaultdict(int)
89        d2 = defaultdict(int)89        d2 = defaultdict(int)
90        for i in self.buff:90        for i in self.buff:
91            d1[i] += 191            d1[i] += 1
92        for j in other.buff:92        for j in other.buff:
93            d2[j] += 193            d2[j] += 1
94        for key in d1:94        for key in d1:
95            d1[key] -= d2[key]95            d1[key] -= d2[key]
96        tmp = ''96        tmp = ''
97        for (key, val) in d1.items():97        for (key, val) in d1.items():
98            if val > 0:98            if val > 0:
99                tmp += key * val99                tmp += key * val
100        return Spiral(tmp)100        return Spiral(tmp)
101101
102    def __mul__(self, other):102    def __mul__(self, other):
103        return Spiral(self.buff * other)103        return Spiral(self.buff * other)
104104
105    def __getitem__(self, item):105    def __getitem__(self, item):
106        return self.buff[item]106        return self.buff[item]
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op