В коде разбираться лень. Оставлю тут, может натолкнет вас на мысль об AI ассистентах:
Ваш код достаточно сложный и содержит множество повторяющихся операций, что делает его трудным для чтения и поддержки. Давайте оптимизируем его, чтобы улучшить читаемость, производительность и уменьшить дублирование.
---
### Основные шаги для оптимизации:
1. **Устранение дублирования кода**:
- В вашем коде много похожих операций для `_2в`, `_2г`, `_3в`, `_3г`, `_4в`, `_4г`. Мы можем вынести их в функцию.
2. **Использование функций для повторяющихся операций**:
- Например, проверка условий для каждой ячейки и обновление массива `cop` могут быть вынесены в отдельные функции.
3. **Оптимизация циклов**:
- Убираем лишние вычисления внутри циклов.
4. **Улучшение работы с памятью**:
- Используем более эффективные структуры данных (например, множества вместо списков там, где это возможно).
5. **Упрощение логики**:
- Некоторые условия можно объединить или переписать более компактно.
---
### Оптимизированный код:
```python
import numpy as np
from itertools import product
def generate_indices(x):
"""
Генерация индексов для всех возможных кораблей.
"""
def generate_ships(zz, size, orientation, row_range, col_range, slice_func):
return [
([i] + [(i[0] + dr, i[1] + dc) for dr, dc in slice_func(size)], orientation, size)
for i in zz
if row_range[0] <= i[0] <= row_range[1] and col_range[0] <= i[1] <= col_range[1]
and np.max(x[i[0] - 1:i[0] + size + 1, i[1] - 1:i[1] + (size if orientation == "в" else 2)]) <= 1
and np.max(x[i[0]:i[0] + size, i[1]]) == 0
]
zz = list(map(tuple, np.argwhere(x == 0).tolist()))
# Определяем срезы для разных типов кораблей
vertical_slice = lambda size: [(r, c) for r in range(-1, size + 1) for c in (-1, 0, 1)]
horizontal_slice = lambda size: [(r, c) for r in (-1, 0, 1) for c in range(-1, size + 1)]
_2в = generate_ships(zz, 2, "в", (1, 9), (1, 10), vertical_slice)
_2г = generate_ships(zz, 2, "г", (1, 10), (1, 9), horizontal_slice)
_3в = generate_ships(zz, 3, "в", (1, 8), (1, 10), vertical_slice)
_3г = generate_ships(zz, 3, "г", (1, 10), (1, 8), horizontal_slice)
_4в = generate_ships(zz, 4, "в", (1, 7), (1, 10), vertical_slice)
_4г = generate_ships(zz, 4, "г", (1, 10), (1, 7), horizontal_slice)
list1 = [([i] + [(i[0] + dr, i[1] + dc) for dr, dc in [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]], "", 1)
for i in zz if i[0] >= 1 and i[1] >= 1 and np.max(x[i[0] - 1:i[0] + 2, i[1] - 1:i[1] + 2]) <= 1]
return list1, _2в + _2г, _3в + _3г, _4в + _4г
def product_with_skip(*iterables):
"""
Генерация комбинаций с пропуском недопустимых.
"""
for prod in product(*iterables):
occupied = set()
valid = True
for z in prod:
if any(pos in occupied for pos in z[0]):
valid = False
break
occupied.update(z[0])
if valid:
yield prod
def process_combinations(list3, list2, x, output_file):
"""
Обработка комбинаций и запись допустимых в файл.
"""
seen = set()
count = 0
with open(output_file, "w") as f:
for comb in product_with_skip(list3, list2):
cop = np.copy(x)
valid = True
for z in comb:
size = z[2]
orientation = z[1]
start_row, start_col = z[0][0]
if orientation == "в":
rows, cols = slice(start_row, start_row + size), start_col
else:
rows, cols = start_row, slice(start_col, start_col + size)
if np.max(cop[rows, cols]) > 0:
valid = False
break
cop[rows, cols] = 2
if valid:
board_state = str(cop[1:, 1:].tolist())
if board_state not in seen:
seen.add(board_state)
f.write(board_state + "\n")
count += 1
return count
# Пример использования
x = np.zeros((12, 12), dtype=int) # Ваш массив
list1, list2, list3, list4 = generate_indices(x)
output_file = "D:\\SSDTEMP\\download\\Python_work\\морской бой\\out.txt"
count = process_combinations(list3, list2, x, output_file)
print(f"Обработано комбинаций: {count}")
```
---
### Что изменилось:
1. **Функция `generate_indices`**:
- Генерирует все возможные корабли (`_2в`, `_2г`, `_3в`, `_3г`, `_4в`, `_4г`) с использованием общей логики.
- Устраняет дублирование кода.
2. **Функция `product_with_skip`**:
- Проверяет, чтобы корабли не пересекались.
3. **Функция `process_combinations`**:
- Обрабатывает комбинации кораблей, проверяет их на допустимость и записывает в файл уникальные состояния доски.
4. **Улучшение читаемости**:
- Код стал более модульным и понятным.
5. **Производительность**:
- Устранены лишние вычисления внутри циклов.
---
Этот код должен работать быстрее и быть проще для понимания. Если у вас есть дополнительные вопросы или требования, дайте знать!
Единорог Безрогов, ну смотря что у вас за бытовая цель. К примеру, перепаять стики на джойстике xbox/ps5 будет не супер просто и спалить дорожку можно на раз, если паяльник будет 400+ градусов. Вот буквально вчера перепаял оба стика. А вот спаять пару аккумуляторов (например, 18650) + прокинуть провод -- тут можно любым паяльником. Но опять же, тут сильно играет опыт. Опытный человек и нагретым гвоздем паять может.
pavlik 322, я не смотрел, если честно. Я его нагуглил. Даже не помню уже с какого сайта взял ссылку. А так, был у меня давно синий паяльник, лет 8 назад. Мучения, а не пайка. Вот с него я на JCD и перешел и уже с ним проблем особых не возникало.
Александр, хотел сказать, что керамический паяльник jcd 908s, который и вы упоминали, тоже отличный вариант. Я им паял лет 6, наверное. Решил себя порадовать новым, а jcd отдал папе.
А fnirsi hs-02 он заряжается, потом паяется или постоянно должен быть подключен к блоку питания (дополнительно ещё покупать на 65W) ?
Нет, он работает от блока 100w. Блок покупать дополнительно или взять, например, блок от ноута. У меня блоки уже были, поэтому я даже об этом не задумывался
это может быть проблема не паяльника, а олова. возьмите 0.8м ПОС-61. На озоне будет стоить 550-600 рублей за 100г.
Только не забудьте хорошо почистить жало (сода + моющее средство + губка), а после мокнуть в канифоль и залудить. Ни в коем случае не пытаться чистить жало напильником или другим металическим предметом )
Место в s3 стоит копейки. Дешевле хранить дубли, чем защищаться и растить CPU/GPU на серверах для сопоставления. В зависимости от бизнеса, можно чистить бакеты по каким-то характеристикам. К примеру, нет обращений к изображению.
Максим Федоров, macbook pro (m1 pro/16gb/512). С докером есть проблемы на больших проектах 4м+ строк кода (не считая vendor/*). Приходится костылить docker-sync, чтобы не ждать синхронизации по 5-10 сек. С костылем docker-sync синк занимает ~100-300ms.