Образовательный интерес.
Есть 60 трл дверей и им соответствующих ключей. А правило изготовления - одно. На всю жизнь хватит.
Вот: Я пользователь. Я выбрал пароль A1+A1; A1*A1; A1-A2(abs); A1*A2 (а мог бы меньше или больше действий и ячейки самые разные) и сохранил его. Начал работу. Получил вызов:
1234
A 0123
B 4567
C 8901
D 2345
В уме я вычислил: 0+0=0; 0*0=0; 0-1=1; 0*1=0
И в поле ввода ввел полученный ключ: 0010 И получил доступ.
На следующий день прихожу, начинаю работать и получаю новый вызов:
1234
A 9876
B 5432
C 1098
D 7654
решаю: 9+9=18; 9*9=81; 9-8=1; 9*8=72
В окне ключа ввожу: 1881172 И получаю доступ.
Do you understand now?
Детали по разбиениям:0010
[0, 0, 10] → 236,992 комбинаций
[0, 0, 1, 0] → 48,278,656 комбинаций
Детали по разбиениям:1881172
[18, 8, 11, 72] → 82,944 комбинаций
[18, 81, 1, 72] → 20,352 комбинаций
[18, 81, 17, 2] → 18,816 комбинаций
[1, 8, 8, 11, 72] → 13,188,096 комбинаций → исключено, за пределами 1й итерации
[1, 8, 81, 1, 72] → 3,235,968 комбинаций → исключено, за пределами 1й итерации
[1, 8, 81, 17, 2] → 2,991,744 комбинаций → исключено, за пределами 1й итерации
[18, 8, 1, 1, 72] → 9,707,904 комбинаций → исключено, за пределами 1й итерации
[18, 8, 1, 17, 2] → 8,975,232 комбинаций → исключено, за пределами 1й итерации
[18, 8, 11, 7, 2] → 16,257,024 комбинаций → исключено, за пределами 1й итерации
[18, 81, 1, 7, 2] → 3,988,992 комбинаций → исключено, за пределами 1й итерации
[1, 8, 8, 1, 1, 72] → 1,543,556,736 комбинаций → исключено, за пределами 1й итерации
[1, 8, 8, 1, 17, 2] → 1,427,061,888 комбинаций → исключено, за пределами 1й итерации
[1, 8, 8, 11, 7, 2] → 2,584,866,816 комбинаций → исключено, за пределами 1й итерации
[1, 8, 81, 1, 7, 2] → 634,249,728 комбинаций → исключено, за пределами 1й итерации
[18, 8, 1, 1, 7, 2] → 1,902,749,184 комбинаций → исключено, за пределами 1й итерации
[1, 8, 8, 1, 1, 7, 2] → 302,537,120,256 комбинаций → исключено, за пределами 1й итерацииA1+A1 → A1*A1 → A1-A2 → A1*A2✅ Предварительная обработка завершена: 768 валидных операций.
Проверяем разбиение: [18, 8, 11, 72]
❌ Нет операций для (0, 8)
Проверяем разбиение: [18, 81, 1, 72]
✅ Все пары найдены. Проверяем комбинации...
✅ РЕШЕНИЕ НАЙДЕНО для разбиения [18, 81, 1, 72]
Операции: A1+A1 → A1*A1 → A1-A2 → A1*A2
mat1: [0, 0, 1, 0] → 0010
mat2: [18, 81, 1, 72] → 1881172
Process finished with exit code 0def find_operations_v2():
# Матрицы
mat1 = [
[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 0, 1],
[2, 3, 4, 5]
]
mat2 = [
[9, 8, 7, 6],
[5, 4, 3, 2],
[1, 0, 9, 8],
[7, 6, 5, 4]
]
# Единая функция для вычисления результата операции
def apply_op(a, b, op):
if op == 0:
return a + b
elif op == 1:
return abs(a - b)
else: # op == 2
return a * b
# Все возможные операции: (r1,c1,r2,c2,op) → результаты (res1, res2)
from collections import defaultdict
all_ops = [] # список всех валидных операций
result_map = defaultdict(list) # (res1, res2) → операции
for r1 in range(4):
for c1 in range(4):
for r2 in range(4):
for c2 in range(4):
for op in range(3):
res1 = apply_op(mat1[r1][c1], mat1[r2][c2], op)
res2 = apply_op(mat2[r1][c1], mat2[r2][c2], op)
if res1 > 81 or res2 > 81:
continue
all_ops.append((r1, c1, r2, c2, op))
result_map[(res1, res2)].append((r1, c1, r2, c2, op))
print(f"✅ Предварительная обработка завершена: {len(all_ops)} валидных операций.")
# Целевой результат для mat1
target1 = [0, 0, 1, 0]
# Возможные разбиения "1881172"
possible_splits = [
[18, 8, 11, 72],
[18, 81, 1, 72],
[18, 81, 17, 2]
]
labels = "ABCD"
# Перебираем все разбиения
for target2 in possible_splits:
print(f"\n Проверяем разбиение: {target2}")
steps = list(zip(target1, target2)) # [(0,18), (0,8), (1,11), (0,72)] и т.д.
candidates = []
valid = True
for t1, t2 in steps:
key = (t1, t2)
if key not in result_map:
print(f" ❌ Нет операций для ({t1}, {t2})")
valid = False
break
candidates.append(result_map[key])
if not valid:
continue
print(f" ✅ Все пары найдены. Проверяем комбинации...")
# Перебираем все 4-операционные последовательности
from itertools import product
count = 0
for ops_seq in product(*candidates):
count += 1
# Проверим результаты
res1_check = []
res2_check = []
for (r1, c1, r2, c2, op) in ops_seq:
res1_check.append(apply_op(mat1[r1][c1], mat1[r2][c2], op))
res2_check.append(apply_op(mat2[r1][c1], mat2[r2][c2], op))
if res1_check == target1 and res2_check == target2:
print(f"✅ РЕШЕНИЕ НАЙДЕНО для разбиения {target2}")
ops_str = []
for (r1, c1, r2, c2, op) in ops_seq:
cell1 = f"{labels[r1]}{c1+1}"
cell2 = f"{labels[r2]}{c2+1}"
op_char = "+" if op == 0 else "-" if op == 1 else "*"
ops_str.append(f"{cell1}{op_char}{cell2}")
print(" Операции:", " → ".join(ops_str))
print(" mat1:", res1_check, "→", ''.join(map(str, res1_check)))
print(" mat2:", res2_check, "→", ''.join(map(str, res2_check)))
return
print(f" ❌ Решений для этого разбиения не найдено.")
print("\n❌ Ни одно разбиение не дало решения.")
# Запуск
find_operations_v2()---1 2 3 4 1 2 3 4
-------------- ------------
A [2, 7, 0, 4] [1, 9, 4, 2]
B [0, 3, 6, 5] [5, 3, 0, 9]
C [0, 7, 8, 3] [4, 6, 2, 0]
D [4, 5, 1, 2] [1, 7, 8, 2]
-----------------------------
511427 1845
Легально-ли получать деньги за пиратские сервера вов и тп
UPDATE users SET balance = balance + 50 WHERE id = 1;SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT balance FROM users WHERE id = 1 FOR UPDATE;
-- вернёт актуальное значение после ожидания
UPDATE users SET balance = ...;
COMMIT;

Цель: снизить стоимость доставки минимум на 15–20%, не теряя в скорости и качестве.
sudo systemctl restart networking.service (или как там у Вас будет)sudo systemctl restart ssh (stop/start тоже пробуйте)sudo ufw disable (предприняв меры по ограждению его от интернета)tcpdump port 22 (на порт где висит ssh) что покажет ?Отвечу на все нужные вопросы.По мере Ваших ответов, мой будет дополнятся..
LDO для положительного напряжения более распространены, имеют лучше характеристики и ниже цену