J, 28 символів
((C.!.2=_1^i.&0)&.".&.stdin''
Порядок введення є основним рядком з рядками, що читаються по черзі вліво-вправо і вправо-вліво по одному шляху через таблицю. Припустимо, що нуль належить верхньому лівому кутку.
Використання в Windows:
<nul set /p="0 1 2 3 7 6 5 4 8 9 10 11 15 14 13 12" | jconsole c:\...\15.jhs
Пояснення:
<nul set /p=
використовується для запобігання нового рядка на вході, який echo
створює те, ".
що не подобається. Звичайно, підтримує Unix echo /n
.
v&.".&.stdin''
читає "v під розбором під stdin", що означає "введення, потім розбирає вхід, потім робимо v, потім скасовуємо аналіз (= формат), потім скасовуємо вхід (= вихід)". 1!:1]3
на один символ коротший, але він не має певного зворотного.
C.!.2
означає "паритет перестановки". Він повертає або 1
(парний парність), або _1
(непарний паритет). Це є,_1^inversions
_1^i.&0
означає "-1 до потужності показника 0".
- таким чином,
C.!.2=_1^i.&0
означає "чи параметри перестановки дорівнюють паритету позиції отвору?"
Це працює для плати 4x4, але якщо бажане кінцеве положення є основним рядком зліва направо, то перестановка для вирішеної позиції має непарне число інверсій і, таким чином, непарний паритет. Також паритет змінюється зворотним (для будь-якого порядку введення), коли бажане положення отвору переміщується зліва вліво праворуч. В обох випадках виправлення є одним символом: add -
after, =
щоб скасувати очікуваний паритет.
Доказ коректності:
Після кожного переміщення нуль обмінюється позицією з деяким числом, гортаючи парність перестановки. Нуль також чергується між білими та чорними позиціями шахів, позначених непарними і парними позиціями в порядку введення. Таким чином, ця умова є необхідною. Цього достатньо і підрахунку аргументу: загальновідомо, що рівно половина позицій вирішується. Цей стан фільтрує рівно половину можливих позицій.