Решатель пластинчатых замков из Gothic 1 Remake. По начальному состоянию и направленной матрице зависимостей программа находит кратчайшую последовательность команд для установки всех пластин в позицию 4.
- от 2 до 7 пластин, по 7 позиций у каждой;
- направленные синхронные и реверсивные зависимости;
- атомарная блокировка недопустимого хода;
- поиск кратчайшего решения по количеству команд;
- вывод в консоль или JSON-файл;
- отсутствие сторонних зависимостей.
- Node.js 20 или новее.
Устанавливать пакеты не требуется.
{
"state": [1, 7, 4, 2, 6],
"links": [
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]
}state— текущие позиции пластин от1до7;links[i][j] = 1— пластинаjдвижется вместе с выбранной пластинойi;links[i][j] = -1— пластинаjдвижется в противоположном направлении;links[i][j] = 0— зависимости нет;- диагональ матрицы всегда равна
0.
Влево увеличивает позицию на 1, вправо уменьшает её на 1. Цель — состояние [4, 4, ...].
node solve-lock.mjs examples/lock.example.jsonОтвет в консоли:
Найдено команд: 4
1. Пластина 1 - влево x3
2. Пластина 2 - вправо x3
3. Пластина 4 - влево x2
4. Пластина 5 - вправо x2
Для сохранения результата в JSON:
node solve-lock.mjs examples/lock.example.json --output solution.jsonПример solution.json:
{
"status": "solved",
"initialState": [1, 7, 4, 2, 6],
"targetState": [4, 4, 4, 4, 4],
"commands": [
{
"plate": 1,
"direction": "left",
"steps": 3
},
{
"plate": 2,
"direction": "right",
"steps": 3
},
{
"plate": 4,
"direction": "left",
"steps": 2
},
{
"plate": 5,
"direction": "right",
"steps": 2
}
],
"finalState": [4, 4, 4, 4, 4],
"metrics": {
"commands": 4,
"divisions": 10,
"plateSwitches": 3
}
}npm testПодробная спецификация и выполненный план реализации находятся в docs/superpowers.