Я побачив крутий gif кривої близнюка дракона, зробленого з квадрата, і задумався, що буде, якщо ми почнемо з іншого базового зображення. Тому я написав програму для цього.
Це так круто, що я подумав, що це було б цікаво зробити це як виклик.
Завдання
Ви візьмете квадратне зображення з довжиною ребра, потужністю 2 (більше 4).
Щоб зробити це зображення, слід почати з поділу зображення на 4 вертикальних смуги однакового розміру і зміщення сусідніх смуг на одну восьму розміру зображення в протилежні сторони (зміщені смуги повинні обернутись на іншу сторону). Потім слід повторювати цей процес щоразу, розбиваючи зображення на подвійне ділення та зміщуючи їх удвічі, ніж попередній раз. Кожну ітерацію ви повинні чергувати між вертикальним і горизонтальним зсувом. Ви повинні повторювати, доки зміна не вимагає зміщення на дробову кількість пікселів (це завжди буде 1/2), в який момент ви закінчите.
При зсуві вертикально нечетних пронумерованих смуг зліва (з нульовим індексом) слід зміщуватись вниз, навіть зсуваючись вгору. При зсуві горизонтальних непарних пронумерованих смуг зверху слід зміщувати ліворуч, а навіть нумеровані смуги повинні зміщуватися праворуч.
Вам потрібно лише вивести / відобразити кінцевий результат перетворення, а не всі проміжні кроки, як у gif.
Це код-гольф, тому мета - мінімізувати довжину вихідного коду, виміряну в байтах.
Працювали на прикладі
Я буду працювати над gif-котом, показаним вгорі сторінки за кадром.
Ось початкове зображення:
Це зображення становить 512 на 512 пікселів. Ми розділимо його на 4 діапазони, щоб почати і змістити кожну смугу на 1/8 розміру зображення (64 пікселя) по вертикалі.
Зараз ми поділимо його на два рази більше діапазонів (8 діапазонів) і змістимо його наполовину, ніж минулого разу (32 пікселі). Цього разу ми зсунемо горизонтально.
Зараз ми знову перемістимо вертикально на цей раз, розділивши на 16 смуг і змістивши кожну смугу на 16 пікселів.
32 діапазони, 8 пікселів, горизонтальний зсув
64 діапазони, 4 пікселі, вертикальний зсув.
128 діапазонів, 2 пікселі, горизонтальний зсув.
256 діапазонів, 1 піксель, вертикальний зсув.
Оскільки наступна зміна вимагатиме від нас переміщення кожної смуги на половину пікселя, ми зупинимось на цьому і виведемо результат.
Тестові справи
У мене є робочий сценарій, який може зробити ці зображення, тому я подумав, що дозволю вам вибрати образи для тестових випадків. Тож, якщо у вас є квадратне зображення, що має потужність у 2 ширини, яке ви хотіли б побачити, як воно дратується. Не соромтеся надіслати це мені, і я зроблю його для тесту.
Також слід перевірити звичайне біле або суцільне чорне зображення, щоб ви могли визначити, зникають чи ні пікселі чи ні.
**Start** by shifting one 8th of the size of the image
тоді repeat ... each time splitting the image into twice as many divisions and shifting half as far as the previous time
перший раз буде 1/8, другий 1/16. третя 1/32, поки кількість пікселів не буде дробовою. Я не бачу нічого незрозумілого в цьому.