Aleksey SpiralString 7145
Пузакова Полина СФ SpiralString 6106
f1from collections import OrderedDictf1from collections import OrderedDict
nn2import random
3import string
24
3class Spiral:5class Spiral:
46
n5    def __init__(self, input_data):n7    def __init__(self, s):
6        self.sequences = OrderedDict()8        self.seq = OrderedDict()
7        if type(input_data) in (str, list, tuple):9        if isinstance(s, (str, list, tuple)):
8            for element in input_data:10            for char in s:
9                if element in self.sequences:11                if char not in self.seq:
10                    self.sequences[element+= 112                    self.seq[char] = 1
11                else:13                else:
n12                    self.sequences[element] = 1n14                    self.seq[char+= 1
13        elif isinstance(input_data, OrderedDict):15        elif isinstance(s, OrderedDict):
14            self.sequences = input_data.copy()16            self.seq = s.copy()
15        else:17        else:
n16            text_representation = ''.join((str(elem) for elem in input_dn18            materialized_str = ''.join((str(char) for char in s))
>ata)) 
17            for element in text_representation:19            for char in materialized_str:
18                if element in self.sequences:20                if char not in self.seq:
19                    self.sequences[element+= 121                    self.seq[char] = 1
20                else:22                else:
n21                    self.sequences[element] = 1n23                    self.seq[char+= 1
2224
n23    def _generate_character_list(self):n25    def _get_char_array(self):
24        result_chars = []26        char_arr = []
25        for character, quantity in self.sequences.items():27        for charcount in self.seq.items():
26            result_chars.extend([character] * quantity)28            char_arr.extend([char] * count)
27        return result_chars29        return char_arr
2830
n29    def _create_spiral_layout(self):n31    def _spiral_string(self):
30        characters = self._generate_character_list()32        char_arr = self._get_char_array()
31        total_length = len(characters)33        total_chars = len(char_arr)
32        if total_length == 0:34        if total_chars == 0:
33            return ''35            return ''
n34        dimension = 1n36        size = 1
35        while dimension * dimension < total_length * 2:37        while size * size < total_chars * 2:
36            dimension += 138            size += 1
37        dimension = max(dimension + 8, 45)39        size = max(size + 10, 50)
38        grid = [[' ' for _ in range(dimension)] for _ in range(dimension40        matrix = [[' ' for _ in range(size)] for _ in range(size)]
>)] 
39        center_x, center_y = (dimension // 2, dimension // 2)41        x, y = (size // 2, size // 2)
40        current_index = 042        char_idx = 0
41        if current_index < total_length:43        if char_idx < total_chars:
42            grid[center_x][center_y] = characters[current_index]44            matrix[x][y] = char_arr[char_idx]
43            current_index += 145            char_idx += 1
44        movement_patterns = [(0, 1), (-1, 0), (0, -1), (1, 0)]46        directions = [(0, 1), (-1, 0), (0, -1), (1, 0)]
45        current_direction = 047        dir_idx = 0
46        current_step_size = 148        step_length = 1
47        while current_index < total_length:49        while char_idx < total_chars:
48            move_x, move_y = movement_patterns[current_direction]50            dx, dy = directions[dir_idx]
49            for step in range(current_step_size):51            for step in range(step_length):
50                if current_index >= total_length:52                if char_idx >= total_chars:
51                    break53                    break
n52                center_x += move_xn54                x += dx
53                center_y += move_y55                y += dy
54                if 0 <= center_x < dimension and 0 <= center_y < dimensi56                if 0 <= x < size and 0 <= y < size:
>on: 
55                    grid[center_x][center_y] = characters[current_index]57                    matrix[x][y] = char_arr[char_idx]
56                current_index += 158                char_idx += 1
57            current_direction = (current_direction + 1) % 459            dir_idx = (dir_idx + 1) % 4
58            current_step_size += 160            step_length += 1
59        min_row, max_row = (dimension, -1)61        min_row, max_row = (size, -1)
60        min_col, max_col = (dimension, -1)62        min_col, max_col = (size, -1)
61        for row in range(dimension):63        for i in range(size):
62            for col in range(dimension):64            for j in range(size):
63                if grid[row][col] != ' ':65                if matrix[i][j] != ' ':
64                    min_row = min(min_row, row)66                    min_row = min(min_row, i)
65                    max_row = max(max_row, row)67                    max_row = max(max_row, i)
66                    min_col = min(min_col, col)68                    min_col = min(min_col, j)
67                    max_col = max(max_col, col)69                    max_col = max(max_col, j)
68        if min_row > max_row or min_col > max_col:70        if min_row > max_row or min_col > max_col:
n69            for row in range(dimension):n71            for i in range(size):
70                for col in range(dimension):72                for j in range(size):
71                    if grid[row][col] != ' ':73                    if matrix[i][j] != ' ':
72                        return grid[row][col]74                        return matrix[i][j]
73            return ''75            return ''
n74        output_lines = []n76        result_lines = []
75        for row in range(min_row, max_row + 1):77        for i in range(min_row, max_row + 1):
76            line_content = ''.join(grid[row][min_col:max_col + 1])78            line = ''.join(matrix[i][min_col:max_col + 1])
77            output_lines.append(line_content.rstrip())79            result_lines.append(line.rstrip())
78        return '\n'.join(output_lines)80        return '\n'.join(result_lines)
7981
80    def __str__(self):82    def __str__(self):
n81        return self._create_spiral_layout()n83        return self._spiral_string()
8284
83    def __add__(self, other):85    def __add__(self, other):
n84        combined_sequences = OrderedDict()n86        result_dict = OrderedDict()
85        for char, count in self.sequences.items():87        for char, count in self.seq.items():
86            combined_sequences[char] = count88            result_dict[char] = count
87        for char, count in other.sequences.items():89        for char, count in other.seq.items():
88            if char in combined_sequences:90            if char in result_dict:
89                combined_sequences[char] += count91                result_dict[char] += count
90            else:92            else:
n91                combined_sequences[char] = countn93                result_dict[char] = count
92        return Spiral(combined_sequences)94        return Spiral(result_dict)
9395
94    def __sub__(self, other):96    def __sub__(self, other):
n95        result_sequences = OrderedDict()n97        result_dict = OrderedDict()
96        for char, count in self.sequences.items():98        for char, count in self.seq.items():
97            if char in other.sequences:99            if char in other.seq:
98                remaining = count - other.sequences[char]100                new_count = count - other.seq[char]
99                if remaining > 0:101                if new_count > 0:
100                    result_sequences[char] = remaining102                    result_dict[char] = new_count
101            else:103            else:
n102                result_sequences[char] = countn104                result_dict[char] = count
103        return Spiral(result_sequences)105        return Spiral(result_dict)
104106
n105    def __mul__(self, multiplier):n107    def __mul__(self, n):
106        multiplied_sequences = OrderedDict()108        result_dict = OrderedDict()
107        for char, count in self.sequences.items():109        for char, count in self.seq.items():
108            multiplied_sequences[char] = count * multiplier110            result_dict[char] = count * n
109        return Spiral(multiplied_sequences)111        return Spiral(result_dict)
110112
111    def __iter__(self):113    def __iter__(self):
t112        for character, quantity in self.sequences.items():t114        for charcount in self.seq.items():
113            for _ in range(quantity):115            for _ in range(count):
114                yield character116                yield char
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op