Райтап на задачу «Испорченное селфи»

skydaemon

Автор:

skydaemon

8 ноября 2026

6

08.11.2026
Испорченное селфи
Категория:

Misc

Задача «Испорченное селфи»

LastTeamLead

Автор:

LastTeamLead

Первая кровь:
InitZer0
Сложность:
medium
Дата публикации:
08.11.2025
Решений:
42
Рейтинг:
4.83/5
Ссылка:
Решать

Дано: мешанина пикселей и сервис, который её создал. По описанию ясно, что сервис просто переставляет пиксели местами и делает это с любым изображением, которое мы подаём ему на вход:

Испорченное селфи: Изображение перед перемешиванием
Испорченное селфи: Результат перемешивания пикселей

Основная трудность в решении этой таски — понять, какой пиксель в какое место устанавливает сервис, не имея его исходников. Главная задача — путём проб и ошибок прийти к правильной идее, которая была заложена автором. Начнём с простого эксперимента: создадим в GIMP и загрузим в сервис изображение ровно из 4 пикселей уникальных цветов:

Испорченное селфи: Изображение из четырёх уникальных пикселей в GIMP

И сравним с выводом миксера:

Испорченное селфи: Четыре пикселя после перемешивания

Значения цветов до перемешивания и после идентичны, а значит, если залить изображение разрешением, равным нашей перемешанной картинке, на выходе мы получим полную карту перестановок пикселей. Не забываем про главное условие — каждый пиксель в созданном изображении должен быть уникальным. Разрешение нашей картинки — 1024 × 1024. Важное ограничение — в RGB 16 777 216 цветов. 1024 × 1024 = 1 048 576 < 16 777 216 — проходим. Ручками или с помощью любимой LLM соберём скрипты на PIL сперва для генерации изображения-карты:

import numpy as np
from PIL import Image


photo_path = "selfie.png"
output_path = "probe.png"

with Image.open(photo_path) as image:
    width, height = image.size

ids = np.arange(width * height, dtype=np.uint32).reshape(height, width)

probe = np.stack([
    ids & 255,
    (ids >> 8) & 255,
    ids >> 16
], axis=-1).astype(np.uint8)

Image.fromarray(probe).save(output_path)

Загрузим результат в сервис и получим карту перестановок, а затем напишем скрипт для «размешивания» нашей картинки по карте:

import numpy as np
from PIL import Image

photo = np.array(Image.open("selfie.png").convert("RGB"))
probe = np.array(Image.open("probe_shuffled.png").convert("RGB"))
pixels = probe.reshape(-1, 3).astype(np.uint32)
ids = pixels[:, 0] | (pixels[:, 1] << 8) | (pixels[:, 2] << 16)
restored = np.empty_like(photo.reshape(-1, 3))
restored[ids] = photo.reshape(-1, 3)
Image.fromarray(restored.reshape(photo.shape)).save("result.png")

Запускаем солвер и сдаём флаг!

Испорченное селфи: Иллюстрация к завершению решения
Если вы нашли опечатку или ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter

Также по теме:

Райтап на задачу «Двери»

/Разборы задач

Райтап на задачу «Двери»

Авторский разбор задачи «Двери»: принцип Port Knocking, поиск слушателя в подсети и последовательное открытие трёх TCP-портов.
Прочитать

19

Райтап на задачу «Скоростные Пазлы #3»

/Разборы задач

Райтап на задачу «Скоростные Пазлы #3»

Собираем 256 фрагментов пазла с помощью OpenCV: находим кусочки в оригинале и восстанавливаем порядок по координатам.
Прочитать

10