Найбільш впізнавана розсувна головоломка - це п’ятнадцять головоломок . Він має 4 на 4 сітку, 15 плиток та одну порожню сітку. Плитка може переміщатися лише в порожній простір і завжди повинна відповідати сітці.
Давайте визначимо узагальнену розсувну головоломку як двовимірну ширину W з високою сіткою H ( W , H обох додатних цілих чисел), яка містить деяку кількість однакових немаркованих плиток (між 0 і W × H з них), прив’язаних до сітки, розташованої в будь-яким способом (без перекриття), з порожніми сітками простору заповнюють решту площі.
Наприклад, якщо W і H 3, а плитка є, T
а порожнє місце є E
однією з багатьох можливих композицій головоломки сайдингу
TTT
TET
EET
Для цих головоломок можливі 4 можливі рухи: підсунути все вгору , зсунути все вниз , підсунути все ліворуч або зсунути все правильно . "Штовхання" в деякому напрямку змушує всі плитки рухатися в цьому напрямку якомога далі, поки вони не потрапляють на іншу плитку або межу сітки. Іноді натискання не змінить компонування сітки,
Якщо приклад сітки просунути правильно, результат є
TTT
ETT
EET
Засунув зліва результат є
TTT
TTE
TEE
Збитий результат є
EET
TET
TTT
(зауважте, що обидві ліві T
рухалися)
Розгортання не змінює макет сітки в цьому випадку.
Зауважте, що оскільки плитки не відрізняються, ці головоломки не мають "розв'язаних" станів. Також зауважте, що головоломка може починатись у макеті, до якого неможливо повернутися після того, як було зроблено поштовх (наприклад, одна плитка посередині сітки 3 на 3).
Виклик
Використовуючи лише ASCII для друку, запишіть два прямокутні блоки коду, ширини M символів та висоту N символів (для будь-яких натуральних чисел M , N ). Один блок коду представлятиме плитку розсувної головоломки, інший блок коду представлятиме порожній простір сітки.
Впорядкувавши ці два кодові блоки в сітці W by H створить ковзну головоломку, представлену кодом, яку можна зберегти як текстовий файл та запустити як звичайну програму. Під час запуску такі програми повинні підказувати користувача через stdin на номер від 1 до 4; 1 вгору, 2 вниз, 3 вліво, 4 праворуч . Коли користувач вводить їх кількість та звернення вводить, програма обчислює, як перемістити його плитки вихідного коду в цьому напрямку та зберігає новий макет головоломки у файлі (або новий файл, або той самий файл), а потім припиняється.
Цей процес можна повторювати нескінченно довго, з використанням нового ковзного файлу головоломки, що створюється після кожного поштовху.
Приклад
Припустимо, мій блок коду плитки виглядає приблизно так
// my
// tile
і мій порожній код простору коду сітки виглядає приблизно так
//empty
//space
( M = 7, N = 2, це, звичайно, не фактичний код)
Будь-яке дійсне розташування головоломки цих двох блоків повинно створювати програму на мові, яку я використовую, і яку можна запустити, щоб користувач міг просуватися в якомусь напрямку.
Представлення коду прикладу сітки:
// my// my// my
// tile// tile// tile
// my//empty// my
// tile//space// tile
//empty//empty// my
//space//space// tile
Отже, запустивши це і натиснувши 2 (для вниз), тоді Enter запише це в інший файл (або той самий файл):
//empty//empty// my
//space//space// tile
// my//empty// my
// tile//space// tile
// my// my// my
// tile// tile// tile
Потім цей файл можна було запустити і зсунути так само точно.
Примітки
Будь-яке представлення коду ковзної головоломки W за допомогою H має бути запущеним та мати можливість належним чином засунути. Сюди входять усі розміри сітки від 1 до 1 до деякого розумного максимуму (2 16 на 2 16 або більше).
Програма може прочитати власний вихідний код. Не існує обмежень на основі хини. Коментарі будь-якого типу також чудові.
Програма повинна підказувати напрямок, в який потрібно просуватися, навіть якщо немає плиток, які потрібно підсунути, або плитки не можуть бути переміщені. Підказка - це просто місце для введення номера, повідомлення не потрібно.
Ви можете припустити, що введення завжди дійсне (1, 2, 3 або 4).
Прошивка кодових блоків пробілами чудово. Пам'ятайте, що вони можуть бути надруковані лише ASCII, це означає, що немає вкладок і нових рядків (крім нових рядків, що допомагають формувати кодові блоки).
Якщо ваша мова не підтримує stdin, використовуйте той спосіб введення, який видається найближчим.
Ви можете вимагати, щоб новий рядок знаходився в кінці файлів головоломки з кодом. (Або вимагати, щоб його там не було.)
Як ви називаєте нові файли, не важливо.
f.txt
або простоf
добре.Два блоки коду можуть бути не однаковими.
Оцінка балів
Мета полягає в тому, щоб зробити це з найменшим розміром коду (саме тому це позначено код-гольф). Подача з найменшою блоком коду ( M × N ) є переможцем. Автоматичний перемикач переходить до найвищої відповіді.
Пов'язане: Код, який керує грою життя на собі
f.txt
? Так.