Перевірте, чи можна вирішити 15 головоломок


9

П'ятнадцять головоломки властива в тому , що тільки половині можливих станів розташування можна розв'язати. Якщо ви перевернете 14 і 15 плиток, ви не можете пересунути блоки так, щоб вони були відвернуті назад.

Ваше завдання - створити програму, яка приймає список цілих чисел у обраному вами форматі (містить точно один примірник кожного з чисел від 0 до 15, причому 0 - порожній пробіл), що представляє стан розташування плиток у сітка 4x4 і виводить одне булеве значення, визначаючи, чи сітка вирішувана чи ні.

Виграє найкоротший код для будь-якої мови.


Добре запитання :)
Cruncher

Я збирався задати це питання, але з довільною стороною; але це додає дуже мало проблем.
Джонатан Аллан

Відповіді:


0

Желе , 9 байт

Œc>/€;TSḂ

Монадічна посилання, що приймає список цілих чисел у порядку рядків-мажорів, що чергуються між лівим-правим та правим-лівим, який поступається, 0якщо вирішимо, а 1якщо ні (для інвертування цього додавання ¬праворуч від коду).

Спробуйте в Інтернеті! (цей приклад - це дошка, де 12 просто потрібно вставити на місце)

Як?

Подібно до відповіді Джона Дворака, ми обчислюємо паритети та використовуємо змійоподібний порядок введення для спрощення паритету контрольної дошки, хоча замість того, щоб перевіряти рівність паритету, ми підсумовуємо підрахунок поза порядком з ненульовими показниками і перевіряємо, чи це непарне:

Œ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 символів

((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, =щоб скасувати очікуваний паритет.

Доказ коректності:

Після кожного переміщення нуль обмінюється позицією з деяким числом, гортаючи парність перестановки. Нуль також чергується між білими та чорними позиціями шахів, позначених непарними і парними позиціями в порядку введення. Таким чином, ця умова є необхідною. Цього достатньо і підрахунку аргументу: загальновідомо, що рівно половина позицій вирішується. Цей стан фільтрує рівно половину можливих позицій.


Коли ви говорите "нуль також чергується між непарними і парними позиціями": чи не змінюється він на +1, -1, +4 або -4? Я думаю, що перевірений візерунок дає потрібне вам забарвлення, але це можна було б описати точніше.
Пітер Тейлор

@PeterTaylor ви праві; вибачте. Чи вважає моє редагування дійсним виправлення?
Джон Дворак

Я думаю, що ваша редакція стосується зовсім окремої проблеми. Біт, який я цитував, є в останньому абзаці.
Пітер Тейлор

"Між непарними і парними позиціями" більше схоже на "між чорними та білими квадратами на шаховій дошці".
Джо З.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.