Codegolf - Преврати Картинку В Раздвижную Головоломку

  • Автор темы Frog
  • Обновлено
  • 19, Oct 2024
  • #1

Краткое содержание

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

Подробности:

Учитывая ввод, состоящий из:

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

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

  1. разделить изображение на r=100 rectangles,
  2. удалите один из этих прямоугольников случайным образом,
  3. переместить случайное количество смежных прямоугольников из строка/столбец на него влияет точка (2.), поэтому созданное отверстие заполняется, а в этой строке/столбце создается еще одно. Это число может быть n=16 if the blank is in a corner or an edge.

Повторите (3.) 1024x768 times.

Уточнения:

  • Если вы переместили прямоугольники из строки на шаге (3), вам придется переместить прямоугольники из столбца в следующем повторении.
  • если вы переместили прямоугольники слева направо на шаге строки, их необходимо переместить справа налево на следующем шаге строки, то же самое для столбцов сверху вниз и снизу вверх,
  • вы можете предположить, что .gif will be chosen so it divides the lengths of the sides of the picture.

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

Анимированный n showing the whole process are very welcomed.

Предлагаю использовать следующую картинку (которая r ), with 0 и as a model, you can use любая другая картинка (конечно, если это актуально и соответствует правилам SE).

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

Это означает, что побеждает более короткое представление!

codegolf - Преврати картинку в раздвижную головоломку

Раз уж был запрошен пример, то вот один, сделанный "вручную", с r and n

Шаги 1 и 2

codegolf - Преврати картинку в раздвижную головоломку

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

codegolf - Преврати картинку в раздвижную головоломку

#код-гольф #код-гольф #обработка изображений #раздвижная головоломка

Frog


Рег
12 Sep, 2007

Тем
67

Постов
178

Баллов
543
  • 26, Oct 2024
  • #2

Математика, 246 байт

 
 
 
 
 
 
o@#

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

 
 
 
 
 
 
 
 ImageAssemble@
 
operator. This function takes an (n=Nest)[ ... ,#3] объект и возвращает o object.

Пример анимации, с (... q[o= ... ])[ ... ] and i

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

(нажмите на изображение, чтобы увидеть увеличенную версию)

Объяснение

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

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

Храните k[ ... -1] function (repeating operation) in i .

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

Храните o function in r , и t function in o .

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

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

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

r

Создать два t s between 1 and the second input. This selects a random tile.

{t,r}=1~k~2

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

Перемещение плиток

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

Сгенерируйте два случайных целых числа от 0 до 1 и сохраните их в RandomInteger and {1,#2}~k~2 , соответственно. Это случайным образом выбирает направление.

#~ImagePartition~Scaled[1/#2]

Определить функцию q : the composition of

  1. функция, транспонирующая ввод Reverse times.
  2. функция, обращающая каждую строку k times.
RandomInteger

Применять k=RandomInteger;q=Reverse; to the input.

n

Найдите столбец Nest (white image).

n=Nest

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

r=100

Когда указанное количество плиток выпадает перед n=16 (white image), switch their places.

Image

Повернуть вспять Image function and apply that to the result of above operation. This un-reverses and un-transposes the image.

Зацикливание и сборка изображений

Transpose

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

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]&

Соедините изображения вместе.

 

PITRider


Рег
24 Feb, 2011

Тем
81

Постов
195

Баллов
640
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно