Сделайте картинку в скользящей головоломке

14

Резюме

Цель этой проблемы заключается в создании отмененным образом-версии 15-головоломки / скользящей головоломка также называется taquin на французском.

Детали:

Учитывая вход состоит из:

  • изображение,
  • целое число n,
  • другое целое число r,

Ваша программа, или функция, или что-либо еще, что подходит, должны выводить то же изображение ( то есть тот же размер и формат), что и входные данные, но подверглось следующему процессу:

  1. разделить изображение на прямоугольники,
  2. удалить один из этих прямоугольников, случайно,
  3. переместите случайное число смежных прямоугольников из строки / столбца, на который воздействует точка (2.), чтобы созданное отверстие было заполнено, и в этой строке / столбце было сгенерировано еще одно. Это число может быть, 0если пробел находится в углу или на краю.

Повторите (3.) rраз.

Разъяснения:

  • Если вы переместили прямоугольники со строки на шаге (3.), вы должны переместить прямоугольники со столбца в следующем повторении,
  • если вы переместили прямоугольники слева направо на шаге строки, они должны быть перемещены справа налево на следующем шаге строки, то же самое для столбцов сверху вниз и снизу вверх относительно столбцов,
  • Вы можете предположить, что nбудет выбрано таким образом, чтобы он разделял длины сторон изображения.

Последний пункт:

Анимированные .gifпоказы всего процесса очень приветствуются.

Я предлагаю использовать следующую картинку (которая есть 1024x768), n=16и r=100в качестве модели вы можете использовать любую другую картинку (если она, конечно, актуальна и соответствует правилам SE).

Обратите внимание, что применяются стандартные правила лазеек .

Это , поэтому выигрывает более короткая подача!

Любители собак, кошек и уток должны быть довольны!

Так как пример был запрошен, вот один, сделанный «вручную», с n=4иr=1

Шаги 1 и 2

введите описание изображения здесь

Шаг 3 : по линии, 2 прямоугольника слева

введите описание изображения здесь

Фредерик
источник
В этом примере предполагается, что прямоугольники не обязательно должны быть одинакового размера, не должны покрывать все изображение и должны содержать линии, нарисованные поверх исходного изображения. Не могли бы вы уточнить это, изменив спецификацию или пример?
Trichoplax
@trichoplax: пример был нарисован от руки краской и быстротой. Я буду переделывать это правильно.
Фредерик
@trichoplax: Должен признать, что я не совсем понял вашу точку зрения, но эта начальная строка не нужна для понимания проблемы, поэтому я думаю, что бесполезно ее удерживать.
Фредерик
move a random number of contiguous rectanglesэто может быть 0 прямоугольников? (было бы
трудно
@JungHwanMin: да, может. Хорошее замечание, спасибо!
Фредерик

Ответы:

10

Mathematica, 246 байт

ImageAssemble@(n=Nest)[k=RandomInteger;q=Reverse;({t,r}=1~k~2;q[o=n[q/@#&,#,r]&@*(n[#&,#,t]&)])[o@#/.{a___,b:_~RepeatedNull~k[Position[o@#,i][[1,2]]-1],i,c___}:>{a,i,b,c}]&,MapAt[(i=#~ImageAdd~1)&,#~ImagePartition~Scaled[1/#2],{1,#2}~k~2],#3]&

Анонимная функция. Содержит U + F3C7, соответствующий Transposeоператору Mathematica . Эта функция берет Imageобъект и возвращает Imageобъект.

Пример анимации, с n=16иr=100

После 5000 итераций:

введите описание изображения здесь(Нажмите на изображение для увеличения)

объяснение

инициализация

n=Nest

Сохраните Nestфункцию (повторяющуюся операцию) в n.

k=RandomInteger;q=Reverse;

Сохраните RandomIntegerфункцию в kи Reverseфункцию в q.

Разделение изображения

#~ImagePartition~Scaled[1/#2]

Разделите входное изображение на (второй вход) ^ 2 тайлов.

{1,#2}~k~2

Генерация двух RandomIntegerс между 1 и вторым входом. Это выбирает случайную плитку.

MapAt[(i=#~ImageAdd~1)&, ..., {1,#2}~k~2]

Сделайте эту плитку белой. Сохраните это в i.

Движущиеся плитки

{t,r}=1~k~2

Создайте два случайных целых числа от 0 до 1 и сохраните их в tи r, соответственно. Это случайным образом выбирает направление.

o=n[q/@#&,#,r]&@*(n[#&,#,t]&)

Определить функцию o: состав

  1. функция транспонирования времени ввода t.
  2. функция, переворачивающая каждую строку rраз.
о @ #

Применить oк входу.

Position[o@#,i][[1,2]]

Найдите столбец i(белое изображение).

k[ ... -1]

Вычтите одно и найдите случайное целое число от 0 до этого числа. Это случайным образом выбирает количество плиток для перемещения.

o@#/.{a___,b:_~RepeatedNull~ ... ,i,c___}:>{a,i,b,c}

Когда упомянутое количество плиток встречается перед i(белым изображением), поменяйте их местами.

(... q[o= ... ])[ ... ]

Отмените oфункцию и примените ее к результату вышеуказанной операции. Это не переворачивает и не транспонирует изображение.

Циклы и сборка изображений

(n=Nest)[ ... ,#3]

Повторите вышеуказанный процесс (третий ввод) раз.

ImageAssemble@

Положите изображения вместе.

Юнг Хван Мин
источник
1
Хороший ответ ! Спасибо за подробности!
Фредерик