Kiểm tra xem 15 câu đố có thể giải được không


9

Các câu đố mười lăm là đặc biệt trong đó chỉ có một nửa số trạng thái có thể bố trí đang tan. Nếu bạn lật các ô 14 và 15, không có cách nào bạn có thể trượt các khối để chúng được lật lại.

Nhiệm vụ của bạn là xây dựng một chương trình chấp nhận danh sách các số nguyên theo định dạng bạn chọn (chứa chính xác một thể hiện của mỗi số từ 0 đến 15, với 0 là khoảng trắng) biểu thị trạng thái sắp xếp các ô trong một lưới 4 x 4 và đưa ra một giá trị boolean duy nhất xác định xem lưới có thể giải được hay không.

Mã ngắn nhất để làm điều này trong bất kỳ ngôn ngữ nào sẽ thắng.


Câu hỏi hay :)
Cruncher

Tôi sẽ hỏi câu hỏi này, nhưng với độ dài phụ tùy ý; nhưng điều đó thêm rất ít vào thử thách.
Jonathan Allan

Câu trả lời:


0

Thạch , 9 byte

Œc>/€;TSḂ

Liên kết đơn âm chấp nhận danh sách các số nguyên đọc theo thứ tự chính hàng xen kẽ giữa trái phải và trái phải, 0có thể giải quyết được nếu có thể giải quyết được và 1nếu không (để đảo ngược điều này thêm ¬vào bên phải mã).

Hãy thử trực tuyến! (ví dụ này là một bảng trong đó 12 chỉ cần trượt vào vị trí)

Làm sao?

Tương tự như câu trả lời của John Dvorak, chúng tôi tính toán các số chẵn lẻ và sử dụng thứ tự đầu vào giống như con rắn để đơn giản hóa tính chẵn lẻ của người kiểm tra, mặc dù thay vì kiểm tra tính bằng nhau của tính chẵn lẻ, chúng tôi tính tổng số không theo thứ tự với các chỉ số khác không và kiểm tra xem đó có phải là không lẻ:

Œc>/€;TSḂ - Link: list of integers
Œc        - unordered pairs
    €     - for each:
   /      -   reduce with:
  >       -     greater than?
      T   - truthy indices (i.e. [1..16] without 1-indexed index of 0)
     ;    - concatenate
       S  - sum
        Ḃ - is odd?

4

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, echotạ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]3ngắn hơn một ký tự, nhưng nó không có nghịch đảo xác định.
  • C.!.2có 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.&0có 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ể.


Khi bạn nói "số 0 cũng xen kẽ giữa các vị trí chẵn lẻ": nó không thay đổi theo +1, -1, +4 hay -4? Tôi nghĩ rằng một mẫu đã kiểm tra cung cấp màu bạn cần, nhưng nó có thể được mô tả chính xác hơn.
Peter Taylor

@PeterTaylor bạn nói đúng; lấy làm tiếc. Có chỉnh sửa của tôi được tính là một sửa chữa hợp lệ?
John Dvorak

Tôi nghĩ rằng chỉnh sửa của bạn giải quyết một vấn đề hoàn toàn riêng biệt. Các bit tôi trích dẫn là trong đoạn cuối cùng.
Peter Taylor

"Giữa các vị trí lẻ và chẵn" giống như "giữa các ô vuông đen và trắng trên bàn cờ".
Joe Z.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.