Код Код головоломки слайдів!


12

Найбільш впізнавана розсувна головоломка - це п’ятнадцять головоломок . Він має 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 ) є переможцем. Автоматичний перемикач переходить до найвищої відповіді.

Пов'язане: Код, який керує грою життя на собі


Тож програма повинна працювати, коли є лише порожні місця і немає плиткових блоків (і навпаки)?
grc

@grc Так, на ваше перше запитання, і пам’ятайте, що він все ще потребує підказки для значення «спотикання», навіть якщо він повністю порожній або повний. Ніякі блоки не можуть бути однаковими. Я думаю, якби вони були, ви могли б претендувати на досить тривіальну відповідь. Тож я згадаю про це.
Захоплення Кальвіна

Чи можу я вказати ім'я вихідного вихідного файлу?
feersum

@feersum Як ви можете припустити, що це завжди f.txt? Так.
Захоплення Кальвіна

Не завжди кодові блоки будуть 1 рядком? Багатоблокові кодові блоки здаються мені справді складними, і 2D езонгвінг, ймовірно, не підтримує запис файлів.
Деф

Відповіді:


5

TECO , 153

Порожній блок:

0T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

Плитковий блок:

1T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

Програма, яка змінює себе на місці, повинна бути збережена у файлі з назвою x. Його можна запустити за допомогою команди tecoc mung x.. Крапка важлива; без цього TECO намагався знайти файл з назвою x.tec. Новий рядок повинен бути присутнім.

Обмеження для друку ASCII було неприємно для цього, оскільки мова використовує багато недрукованих символів. Більшість із них можна замінити двобайтовою послідовністю, що починається з карети, але "Втеча" (ASCII 27) є одним символом, який "неминучий", тому для його отримання мені довелося ввести його значення ASCII у рядок і виконайте це Таким чином, 4-байт EBx<Esc>вибухнув у @^Ux#EBx#27@:^UX##Mx.

Це можна значно зменшити, особливо розбивши програму на дві частини, зберігаючи їх як рядки та виконуючись лише за наявності обох.

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