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

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 создаст скользящую головоломку, представленную кодом, которую можно сохранить в виде текстового файла и запустить как обычную программу. При запуске программы такого типа должны запрашивать у пользователя через стандартный ввод числа от 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 by H должно быть работоспособным и иметь возможность правильно толкать себя. Это включает в себя все размеры сетки от 1 до 1 до некоторого разумного максимума (2 16 на 2 16 или более).

  • Программа может читать свой собственный исходный код. Нет никаких ограничений на основе квине. Комментарии любого рода тоже подойдут.

  • Программа должна запросить направление для перемещения, даже если нет элементов для перемещения или нет элементов для перемещения. Подсказка - это просто место для ввода числа, сообщение не требуется.

  • Вы можете предположить, что ввод всегда действителен (1, 2, 3 или 4).

  • Заполнение блоков кода пробелами это хорошо. Помните, что они могут быть только для печати ASCII, это означает отсутствие вкладок и новых строк (кроме новых строк, которые помогают формировать блоки кода).

  • Если ваш язык не поддерживает стандартный ввод, используйте любой метод ввода, который вам кажется наиболее близким.

  • Вы можете потребовать, чтобы символ новой строки был в конце ваших файлов головоломки. (Или требовать, чтобы его там не было.)

  • Как вы называете новые файлы, не важно. f.txtили просто fв порядке.

  • Два кодовых блока могут не совпадать.

счет

Цель состоит в том, чтобы сделать это с наименьшим размером кода (именно поэтому это помечено как code-golf). Представление с наименьшей площадью кодового блока ( M × N ) является победителем. Тай-брейк идет на самый высокий голос.

Связанный: Код, который управляет Игрой Жизни на себе

Кальвин Хобби
источник
Таким образом, программа должна работать, когда есть только пустые места и нет блоков плитки (и наоборот)?
GRC
@grc Да на ваш первый вопрос, и помните, что он все еще должен запрашивать значение толчка, даже если оно полностью пустое или полное. Нет, блоки не могут быть идентичными. Я полагаю, что если бы они были у вас, можно было бы получить довольно тривиальный ответ. Я упомяну это.
Увлечения Кэлвина
Могу ли я указать имя исходного исходного файла?
feersum
@feersum Как вы можете предположить, что это всегда f.txt? Да.
Увлечения Кэлвина
Разве кодовые блоки не всегда будут 1 строкой? Многострочные кодовые блоки кажутся мне действительно сложными, и двуязычные языки, вероятно, не поддерживают запись файлов.
Def

Ответы:

5

ТЕКО , 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 для печати было немного болезненным для этого, так как язык использует много непечатаемых символов. Большинство из них можно заменить двухбайтовой последовательностью, начинающейся с каретки, но «Escape» (ASCII 27) - это тот символ, который «неизбежен», поэтому для его получения мне пришлось поместить его значение ASCII в строку и исполни это. Таким образом, 4-байт EBx<Esc>взорвался @^Ux#EBx#27@:^UX##Mx.

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

feersum
источник