J, 28 ký tự
((C.!.2=_1^i.&0)&.".&.stdin''
Thứ tự đầu vào là hàng chính với các hàng được đọc xen kẽ từ trái sang phải và phải sang trái trong một đường dẫn duy nhất trên bảng. Giả sử số 0 thuộc về góc trên bên trái.
Sử dụng trên Windows:
<nul set /p="0 1 2 3 7 6 5 4 8 9 10 11 15 14 13 12" | jconsole c:\...\15.jhs
Giải trình:
<nul set /p=
được sử dụng để ngăn chặn một dòng mới trong đầu vào, echo
tạo ra ".
không như thế. Tất nhiên, Unix hỗ trợ echo /n
.
v&.".&.stdin''
đọc "v under parse under stdin" có nghĩa là "đầu vào, sau đó phân tích cú pháp đầu vào, sau đó làm v, sau đó hoàn tác phân tích cú pháp (= định dạng), sau đó hoàn tác đầu vào (= đầu ra)". 1!:1]3
ngắn hơn một ký tự, nhưng nó không có nghịch đảo xác định.
C.!.2
có nghĩa là "tương đương hoán vị". Nó trả về một trong hai 1
(chẵn lẻ) hoặc _1
(chẵn lẻ). Đó là,_1^inversions
_1^i.&0
có nghĩa là "-1 với sức mạnh của chỉ số 0".
- do đó,
C.!.2=_1^i.&0
có nghĩa là "sự tương đương hoán vị có bằng với vị trí lỗ không?"
Điều này hoạt động đối với bảng 4 x 4, nhưng nếu vị trí kết thúc mong muốn là hàng chính từ trái sang phải, thì hoán vị cho vị trí đã giải có số lần đảo ngược lẻ và do đó là chẵn lẻ. Ngoài ra, tính chẵn lẻ được đảo ngược (đối với bất kỳ thứ tự đầu vào nào) khi vị trí lỗ mong muốn di chuyển từ trên trái sang dưới phải. Trong cả hai trường hợp, sửa lỗi là một ký tự: thêm -
sau =
để đảo ngược tính chẵn lẻ dự kiến.
Bằng chứng về sự đúng đắn:
Sau mỗi lần di chuyển, số 0 trao đổi một vị trí với một số số, lật ngang giá trị hoán vị. Số 0 cũng xen kẽ giữa các vị trí bàn cờ trắng và đen, được biểu thị bằng các vị trí lẻ và chẵn trong thứ tự đầu vào. Vì vậy, điều kiện này là cần thiết. Đối số đếm cũng đủ: kiến thức phổ biến là chính xác một nửa các vị trí có thể giải được. Điều kiện này lọc chính xác một nửa các vị trí có thể.