Ваша задача - создать программу, которая при заданном входном изображении создаст выходное изображение одинакового размера, в котором все пиксели упорядочены по шестнадцатеричному значению.
Ваша программа может:
- Сортировка пикселей слева направо, а затем вниз или сначала сортировка по столбцам, а затем вправо. В любом случае верхний левый пиксель самый маленький, а нижний правый самый большой.
- Используйте прозрачность, но это не обязательно.
- Сортировка по RGB, но вы можете использовать CMY или любой другой формат с как минимум 3 значениями. Вы можете выбрать, какие значения сортировать. (HSV может дать несколько хороших изображений)
- Используйте любой известный формат изображения, который может открыть большинство компьютеров.
Правила:
- Вывод должен быть записан на диск или передан в файл.
- Входные данные задаются в качестве аргумента командной строки, в форме относительного пути к изображению или передаются из командной строки.
- Это код гольф, поэтому выигрывает самый короткий код в байтах!
Ответы:
Pyth - 10 байт
Читает изображение, сворачивает растровое изображение, сортирует, а затем снова разбивает растровое изображение, а затем записывает.
Не работает онлайн по понятным причинам. Принимает ввод как относительный путь к файлу изображения и выводит в
o.png
.Выход из американской готики:
источник
JavaScript (ES6),
383377354 байтаДемоверсия запуска:
Показать фрагмент кода
Как работает этот код, это использовать
getImageData
для получения массива видаИ
map
это массиву видаТаким образом, значения R отображаются в массивы набора RGBA, а значения B, G и A превращаются в нулевые массивы минимального значения. Когда мы сортируем этот массив, все
[0,0,0,0]
массивы сортируются снизу, а массивы с действительными значениями обычно сортируются сверху:Мы просматриваем верхнюю четверть массива (чтобы потерять пустые значения, которые мы создали), сглаживаем его
[].concat.apply
и в итоге получаем массив первой формы, но на этот раз он отсортирован.Немного де-гольф с пробелами и комментариями:
Обратите внимание, что большинство браузеров могут не запускать этот код для больших изображений, потому что он передает огромное количество аргументов
[].concat
. Когда среда браузера не позволяет достаточно памяти для всех аргументов, альтернативный подход состоит в том, чтобы повторно отобразить значения RGBA из верхних четвертых массивов обратно в массив, для общего результата 361 байт :Мы просто заменить
[].concat(...{stuff}).slice(12*w*h)
с{stuff}.map((v,i,A)=>A[3*w*h+(i>>2)][i%4])
.)источник
concat.apply
звонок содержит слишком много аргументов,concat
и движок JS отклоняет его.D:
Благодарность! Я исправлю это и запомню две оценки. (И я рад, что смог помочь!)Mathematica
86 8372 байтаБлагодаря 14 байтам, сохраненным благодаря @Martin Buttner.
пример
Само изображение является входным. В качестве альтернативы можно использовать переменную, содержащую изображение.
источник
ImageData
иArrayReshape
может использовать инфиксную нотацию.Flatten
достаточно долго, чтобы сохранить пару байтов, назначив егоf
. А тебе на самом деле нужно"Byte"
? Разве по умолчанию не будет просто масштабировать значения каналов[0,1]
так, чтобы сортировка и восстановление изображений все равно работали?Javascript ES6, 334 байта
Ungolfed:
источник
appendChild
возвращает свой аргумент. Очень полезный! Вы вдохновили меня сократить мою запись с 377 до 354, но я не могу победить вашу :). (Когда я использую вашуappendChild
цепочку иwith
технику, я могу уменьшить ее до 347, но все равно до 13!) Отличная работа!C (с использованием SDL1.2),
333322315 байтСкорее всего, С не самый «острый нож на полке» для такого рода работ, я все равно хотел попробовать. Советы по улучшению моего ответа приветствуются. Программа получает имя файла входного изображения в качестве аргумента cli.
скомпилируйте и запустите:
gcc -I/usr/include/SDL snippet.c -lSDL -lSDL_image && ./a.out
Я обычно не играю в гольф в Си, но я только что ответил на этот вызов вчера, и я просто хотел продолжить играть с этой новой игрушкой :)
спасибо @ pseudonym117 за помощь в экономии 5 байт
источник
while
в конце наfor(;;SDL_Flip(s));
, и я считаю, что вы можете опуститьint
методC
и сохранить еще 4.JavaScript (ES6), 452
480484487511байтВау, это дольше, чем ожидалось:
Функция принимает URL-адрес в качестве входного
f('test.jpg');
и выводит результат вcanvas
-элемент, который добавляется кbody
.Обратите внимание, что источник должен находиться в том же домене, иначе сценарий остановится из-за проблемы безопасности.
Ограничения
Я протестировал его в Firefox 42 на OS X (10.10) на машине с 2,5 ГГц i7 и 16 ГБ оперативной памяти. Максимальный размер изображения, который я мог обработать без запроса Firefox о продолжении выполнения сценария, составлял 1600 x 1932 px .
Ungolfed
Выход
Для лучшего сравнения я также взял « Американскую готику » в качестве примера источника:
Правки
for (a in b)
вместоfor(;;)
. Благодаря ar34zdocument
в переменной.()
.()
создания объекта on и удаление еще одной пары избыточных()
. Спасибо апсиллерам .for
-loop, который получает цвета каждого пикселя.источник
for(k in t)
что позволит сэкономить еще несколько байтов :)()
вnew Image()
; используйте помеченные шаблонные строки в качестве строковых аргументов (createElement`canvas`
,getContext`2d`
), не используйте скобки для параметров функций с одной стрелкой (просто делайтеf=u=>{...}
; скобки используются только для многопараметрических функций или функций стрелок с нулевым параметром). Также у вас может быть один или два цикла с одним оператором,for
которые имеют скобки, которые не нужны.i.onload=$=>...
вместоi.onload=()=>...
)for(l in u)f.push(u[l]);
может статьfor(z of u)f.push(z);
:)
. -for(u of t)for(z of u)f.push(z)
чертовски коротко, но его можно сократить доt.map(u=>u.map(z=>f.push(z)))
. Во многих случаях использование.map
или.some
с функцией стрелки будет короче, чем использованиеfor
цикла. Если вы хотите пойти на самом деле с ума, вы можете сэкономить еще больше здесь сt.map(u=>f.push.apply(f,u));
которой говорит : «Для каждого массиваu
вt
, поставкиu
в виде списка аргументов сf.push
помощьюapply
(так какpush
может принимать неограниченное количество аргументов и толкает их все в порядке).Утилиты Bash + GNU, 80
Предполагается, что формат ввода / вывода находится в формате перечисления пикселей ImageMagick .txt. Входные данные передаются в виде имени файла, а выходные данные передаются в STDOUT.
Если вышеупомянутое не считается широко известным форматом изображения, то мы можем добавить необходимые преобразования:
Bash + GNU утилит + ImageMagick, 108
Вход и выход указываются в виде имен файлов. ImageMagick определяет, какие форматы файлов использовать переданные расширения файлов, поэтому мы можем использовать любые распространенные:
Получившийся файл o.png выглядит так:
источник
Python 2, 128 байт
При условии, что изображение является файлом с именем
a
без расширения, на выходе будет файл с именемb
без расширения.источник
a.putdata(sorted(b[f/c,f%d]for f in range(d*c)))
этого (я только что проснулся, поэтому я, возможно, перепутал переменные).Java, 316 байт
Размещает шестнадцатеричные значения цветов пикселей в массиве. Массив отсортирован, а цвета переназначены на пиксели изображения. Название полученного изображения
a.png
.источник
SmileBASIC,
3935 байтПредполагая, что изображение загружено на графическую страницу 512 * 512:
Разъяснение:
Это так просто!
К сожалению, мы должны использовать целые числа, которые добавляют 4 байта к размеру программы из-за суффиксов типов.источник
SYS/DEFSP.GRP
ставит aFF000000
в верхнем левом углу и a00101010
в нижнем правом, что является очевидной противоположностью вопроса. Использование поплавков помещает00000000
вверху слева иFFF8F8F8
внизу справа, что правильно. (Конечно, это рассматривает шестнадцатеричные цвета как неподписанный / более высокий канал больше, что, вероятно, правильно.)0xFF000000
он меньше, чем0x00101010
), но в любом случае, я не совсем уверен, почему я использовал здесь целые числа ... В то время я не понимал, как GLOAD использует значения без знака, когда вы использовали массив с плавающей точкой, и просто предположил, что он не работает.Java,
424417404 байтаНу, это не тот язык, на котором вы хотите играть в гольф ...
источник
C #, 497 байт
Первый пост, первый гольф. Очевидно, не самый лучший для игры в гольф
Не очень уважаю трубопровод. Принимает путь изображения в качестве входного и выводит его с буквой «о» перед именем.
Лучше работает с растровыми изображениями, результаты шансов с другими
источник
Haskell, 195 байт
Это использует
GD
библиотеку. Использованиеf <filename>
. Входной файл должен быть вpng
формате. Выходной файл называетсяo
.Как это работает: просто, то есть читать картинку, пройтись по всем координатам и получить пиксели, отсортировать пиксели, снова пройтись по координатам, но на этот раз установите пиксели в порядке их появления в отсортированном списке, запишите файл в диск.
источник