Пузакова Полина СФ SpiralString 6106
Aleksey SpiralString 7145
f1from collections import OrderedDictf1from collections import OrderedDict
n2import randomn
3import string
42
5class Spiral:3class Spiral:
64
n7    def __init__(self, s):n5    def __init__(self, input_data):
8        self.seq = OrderedDict()6        self.sequences = OrderedDict()
9        if isinstance(s, (str, list, tuple)):7        if type(input_data) in (str, list, tuple):
10            for char in s:8            for element in input_data:
11                if char not in self.seq:9                if element in self.sequences:
12                    self.seq[char] = 110                    self.sequences[element+= 1
13                else:11                else:
n14                    self.seq[char+= 1n12                    self.sequences[element] = 1
15        elif isinstance(s, OrderedDict):13        elif isinstance(input_data, OrderedDict):
16            self.seq = s.copy()14            self.sequences = input_data.copy()
17        else:15        else:
n18            materialized_str = ''.join((str(char) for char in s))n16            text_representation = ''.join((str(elem) for elem in input_d
 >ata))
19            for char in materialized_str:17            for element in text_representation:
20                if char not in self.seq:18                if element in self.sequences:
21                    self.seq[char] = 119                    self.sequences[element+= 1
22                else:20                else:
n23                    self.seq[char+= 1n21                    self.sequences[element] = 1
2422
n25    def _get_char_array(self):n23    def _generate_character_list(self):
26        char_arr = []24        result_chars = []
27        for char, count in self.seq.items():25        for characterquantity in self.sequences.items():
28            char_arr.extend([char] * count)26            result_chars.extend([character] * quantity)
29        return char_arr27        return result_chars
3028
n31    def _spiral_string(self):n29    def _create_spiral_layout(self):
32        char_arr = self._get_char_array()30        characters = self._generate_character_list()
33        total_chars = len(char_arr)31        total_length = len(characters)
34        if total_chars == 0:32        if total_length == 0:
35            return ''33            return ''
n36        size = 1n34        dimension = 1
37        while size * size < total_chars * 2:35        while dimension * dimension < total_length * 2:
38            size += 136            dimension += 1
39        size = max(size + 10, 50)37        dimension = max(dimension + 8, 45)
40        matrix = [[' ' for _ in range(size)] for _ in range(size)]38        grid = [[' ' for _ in range(dimension)] for _ in range(dimension
 >)]
41        x, y = (size // 2, size // 2)39        center_x, center_y = (dimension // 2, dimension // 2)
42        char_idx = 040        current_index = 0
43        if char_idx < total_chars:41        if current_index < total_length:
44            matrix[x][y] = char_arr[char_idx]42            grid[center_x][center_y] = characters[current_index]
45            char_idx += 143            current_index += 1
46        directions = [(0, 1), (-1, 0), (0, -1), (1, 0)]44        movement_patterns = [(0, 1), (-1, 0), (0, -1), (1, 0)]
47        dir_idx = 045        current_direction = 0
48        step_length = 146        current_step_size = 1
49        while char_idx < total_chars:47        while current_index < total_length:
50            dx, dy = directions[dir_idx]48            move_x, move_y = movement_patterns[current_direction]
51            for step in range(step_length):49            for step in range(current_step_size):
52                if char_idx >= total_chars:50                if current_index >= total_length:
53                    break51                    break
n54                x += dxn52                center_x += move_x
55                y += dy53                center_y += move_y
56                if 0 <= x < size and 0 <= y < size:54                if 0 <= center_x < dimension and 0 <= center_y < dimensi
 >on:
57                    matrix[x][y] = char_arr[char_idx]55                    grid[center_x][center_y] = characters[current_index]
58                char_idx += 156                current_index += 1
59            dir_idx = (dir_idx + 1) % 457            current_direction = (current_direction + 1) % 4
60            step_length += 158            current_step_size += 1
61        min_row, max_row = (size, -1)59        min_row, max_row = (dimension, -1)
62        min_col, max_col = (size, -1)60        min_col, max_col = (dimension, -1)
63        for i in range(size):61        for row in range(dimension):
64            for j in range(size):62            for col in range(dimension):
65                if matrix[i][j] != ' ':63                if grid[row][col] != ' ':
66                    min_row = min(min_row, i)64                    min_row = min(min_row, row)
67                    max_row = max(max_row, i)65                    max_row = max(max_row, row)
68                    min_col = min(min_col, j)66                    min_col = min(min_col, col)
69                    max_col = max(max_col, j)67                    max_col = max(max_col, col)
70        if min_row > max_row or min_col > max_col:68        if min_row > max_row or min_col > max_col:
n71            for i in range(size):n69            for row in range(dimension):
72                for j in range(size):70                for col in range(dimension):
73                    if matrix[i][j] != ' ':71                    if grid[row][col] != ' ':
74                        return matrix[i][j]72                        return grid[row][col]
75            return ''73            return ''
n76        result_lines = []n74        output_lines = []
77        for i in range(min_row, max_row + 1):75        for row in range(min_row, max_row + 1):
78            line = ''.join(matrix[i][min_col:max_col + 1])76            line_content = ''.join(grid[row][min_col:max_col + 1])
79            result_lines.append(line.rstrip())77            output_lines.append(line_content.rstrip())
80        return '\n'.join(result_lines)78        return '\n'.join(output_lines)
8179
82    def __str__(self):80    def __str__(self):
n83        return self._spiral_string()n81        return self._create_spiral_layout()
8482
85    def __add__(self, other):83    def __add__(self, other):
n86        result_dict = OrderedDict()n84        combined_sequences = OrderedDict()
87        for char, count in self.seq.items():85        for char, count in self.sequences.items():
88            result_dict[char] = count86            combined_sequences[char] = count
89        for char, count in other.seq.items():87        for char, count in other.sequences.items():
90            if char in result_dict:88            if char in combined_sequences:
91                result_dict[char] += count89                combined_sequences[char] += count
92            else:90            else:
n93                result_dict[char] = countn91                combined_sequences[char] = count
94        return Spiral(result_dict)92        return Spiral(combined_sequences)
9593
96    def __sub__(self, other):94    def __sub__(self, other):
n97        result_dict = OrderedDict()n95        result_sequences = OrderedDict()
98        for char, count in self.seq.items():96        for char, count in self.sequences.items():
99            if char in other.seq:97            if char in other.sequences:
100                new_count = count - other.seq[char]98                remaining = count - other.sequences[char]
101                if new_count > 0:99                if remaining > 0:
102                    result_dict[char] = new_count100                    result_sequences[char] = remaining
103            else:101            else:
n104                result_dict[char] = countn102                result_sequences[char] = count
105        return Spiral(result_dict)103        return Spiral(result_sequences)
106104
n107    def __mul__(self, n):n105    def __mul__(self, multiplier):
108        result_dict = OrderedDict()106        multiplied_sequences = OrderedDict()
109        for char, count in self.seq.items():107        for char, count in self.sequences.items():
110            result_dict[char] = count * n108            multiplied_sequences[char] = count * multiplier
111        return Spiral(result_dict)109        return Spiral(multiplied_sequences)
112110
113    def __iter__(self):111    def __iter__(self):
t114        for char, count in self.seq.items():t112        for characterquantity in self.sequences.items():
115            for _ in range(count):113            for _ in range(quantity):
116                yield char114                yield character
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op