Если изображение стоит 1000 слов, сколько картинок вы можете вписать в 140 символов?
Примечание: Это люди! Крайний срок подачи жалобы здесь, и после некоторого жесткого обсуждения я решил, что запись Boojum едва ли вышла из Сэма Хосевара > . Я отправлю более подробные заметки, как только у меня будет возможность написать их. Разумеется, каждый должен свободно продолжать предлагать решения и улучшать решения для людей, на которых они могут голосовать. Спасибо всем, кто подал заявку; Мне понравилось все. Мне было очень весело работать, и я надеюсь, что это будет забавно как для абитуриентов, так и для зрителей.
Я встретил этот интересный пост о попытке сжимать изображения в комментарии Twitter и много людей в этом потоке (и thread on Reddit) предлагали разные способы, которыми вы могли бы это сделать. Итак, я полагаю, что это создаст хороший кодовый вызов; пусть люди вкладывают свои деньги туда, где есть их рот, и показывают, как их идеи о кодировании могут привести к более подробным сведениям в ограниченном пространстве, которое у вас есть.
Я призываю вас придумать систему общего назначения для кодирования изображений в 140-символьные сообщения Twitter и снова декодировать их в изображение. Вы можете использовать символы Unicode, поэтому вы получаете более 8 бит на символ. Однако, даже учитывая символы Unicode, вам нужно будет сжать изображения в очень маленькое пространство; это, безусловно, будет сжатием с потерями, и поэтому должны быть субъективные суждения о том, насколько хорош каждый результат.
Вот результат, который оригинал автора, Quasimondo, получен из его кодировки (изображение лицензируется под Лицензия Creative Commons Attribution-Noncommercial):
Можете ли вы сделать лучше?
Правила
- Ваша программа должна иметь два режима: кодирование и декодирование.
- Когда кодировка:
- Ваша программа должна принимать в качестве графического изображения в любом разумном растровом графическом формате по вашему выбору. Мы скажем, что любой растровый формат, поддерживаемый ImageMagick, считается разумным.
- Ваша программа должна вывести сообщение, которое может быть представлено в 140 или менее кодов Unicode; 140 кодовых точек в диапазоне
U+0000
-U+10FFFF
, исключая несимволы (U+FFFE
,U+FFFF
,U+
nFFFE
,U+
nFFFF
, где n равно1
-10
шестнадцатеричный, а диапазонU+FDD0
-U+FDEF
) и суррогатные коды (U+D800
-U+DFFF
). Он может выводиться в любой разумной кодировке по вашему выбору; любая кодировка, поддерживаемая GNUiconv
, будет считаться разумной, и ваша собственная кодировка или локальная кодировка вашей платформы, вероятно, будет хорошим выбором. Подробнее см. В Заметки Unicode ниже.
- Когда декодирование:
- Ваша программа должна принимать входные данные вашего режима кодирования.
- Ваша программа должна выводить изображение в любом разумном формате по вашему выбору, как определено выше, хотя для выходных векторных форматов также хорошо.
- Выход изображения должен быть приближением входного изображения; тем ближе вы можете добраться до входного изображения, тем лучше.
- Процесс декодирования может не иметь доступа к какому-либо другому выходу процесса кодирования, кроме указанного выше; то есть вы не можете загрузить изображение где-нибудь и вывести URL-адрес для процесса декодирования для загрузки или что-то глупое.
-
Для обеспечения согласованности в пользовательском интерфейсе ваша программа должна вести себя следующим образом:
- Ваша программа должна быть script, которая может быть установлена на исполняемый файл на платформе с соответствующим интерпретатором или программой, которая может быть скомпилирована в исполняемый файл.
- Ваша программа должна принимать в качестве первого аргумента либо
encode
, либоdecode
для установки режима. -
Ваша программа должна вводить ввод одним или несколькими из следующих способов (если вы реализуете тот, который принимает имена файлов, вы также можете читать и писать из stdin и stdout, если имена файлов отсутствуют):
-
Взять входной сигнал от стандартного входа и произвести вывод на стандартном выходе.
my-program encode <input.png >output.txt my-program decode <output.txt >output.png
-
Сделайте ввод из файла, названного во втором аргументе, и произведите вывод в файле, указанном в третьем.
my-program encode input.png output.txt my-program decode output.txt output.png
-
- Для вашего решения, пожалуйста, напишите:
- Ваш код полностью и/или ссылка на него размещены в другом месте (если он очень длинный или требуется много файлов для компиляции или что-то еще).
- Объяснение того, как это работает, если это не сразу видно из кода, или если код длинный, и люди будут заинтересованы в сводке.
- Пример изображения с исходным изображением, сжатым текстом и декодированным изображением.
- Если вы строите идею о том, что кто-то еще, укажите их. Это нормально, чтобы попытаться улучшить идею кого-то другого, но вы должны атрибуты.
Руководство
Это в основном правила, которые могут быть нарушены, предложения или критерии оценки:
- Эстетика важна. Я буду судить и предлагаю, чтобы другие люди судили, основываясь на:
- Как хорошо выглядит выходное изображение и насколько оно выглядит как оригинал.
- Как хорошо выглядит текст. Полностью случайный gobbledigook в порядке, если у вас действительно умная схема сжатия, но я также хочу видеть ответы, которые превращают изображения в черепочные стихотворения или что-то умное. Обратите внимание, что автор оригинального решения решил использовать только китайских иероглифов, так как он выглядел лучше всего.
- Интересный код и умные алгоритмы всегда хороши. Мне нравится коротко, по сути, и ясный код, но на самом деле умные сложные алгоритмы в порядке, пока они дают хорошие результаты.
- Скорость также важна, хотя и не такая важная, как хорошая работа, сжимающая изображение, которое вы делаете. Я бы предпочел иметь программу, которая может преобразовать изображение в десятую часть секунды, чем что-то, что будет запускать генетические алгоритмы в течение нескольких дней подряд.
- Я предпочел бы более короткие решения для более длинных, если они достаточно сопоставимы по качеству; краткость - это добродетель.
- Ваша программа должна быть реализована на языке, который имеет свободно доступную реализацию в Mac OS X, Linux или Windows. Я хотел бы иметь возможность запускать программы, но если у вас есть отличное решение, которое работает только под MATLAB или что-то в этом роде хорошо.
- Ваша программа должна быть как можно более общей; он должен работать как можно больше различных изображений, хотя некоторые из них могут давать лучшие результаты, чем другие. В частности:
- Наличие нескольких изображений, встроенных в программу, которые соответствуют и записывают ссылку, а затем создает подходящее изображение при декодировании, является довольно хромым и будет охватывать только несколько изображений.
- Программа, которая может принимать изображения простых, плоских геометрических фигур и декомпозировать их в некоторый векторный примитив, довольно изящна, но если она не удалась на изображениях, не зависящих от определенной сложности, это, вероятно, недостаточно общий.
- Программа, которая может принимать только изображения определенного фиксированного соотношения сторон, но делает хорошую работу с ними, также будет в порядке, но не идеальна.
- Вы можете обнаружить, что черно-белое изображение может получить больше информации в меньшем пространстве, чем цветное изображение. С другой стороны, это может ограничивать типы изображений, к которым оно применимо; лица выглядят прекрасно в черно-белом цвете, но абстрактные рисунки могут не так хорошо жить.
- Совершенно нормально, если выходное изображение меньше ввода, при этом примерно такая же пропорция. Хорошо, если вам нужно масштабировать изображение, чтобы сравнить его с оригиналом; что важно, как это выглядит.
- Ваша программа должна выводить результат, который действительно может пройти через Twitter и выйти невредимым. Это лишь правило, а не правило, поскольку я не мог найти документацию о точном наборе поддерживаемых символов, но вам, вероятно, следует избегать управляющих символов, фанки-невидимых сочетающихся символов, персонажей частного использования и т.п.
Оценка рубрики
Как общее руководство по тому, как я буду оценивать решения при выборе моего принятого решения, скажу, что я, вероятно, буду оценивать решения по 25-балльной шкале (это очень грубо, и я не буду ничего забивать напрямую, просто используя это как основное руководство):
- 15 баллов за то, насколько хорошо схема кодирования воспроизводит широкий диапазон входных изображений. Это субъективное, эстетическое суждение
- 0 означает, что он вообще не работает, он возвращает одно и то же изображение каждый раз или что-то
- 5 означает, что он может кодировать несколько изображений, хотя декодированная версия выглядит уродливой и может вообще не работать на более сложных изображениях
- 10 означает, что он работает с широким спектром изображений и создает приятные изображения, которые иногда могут быть различимы.
- 15 означает, что он производит совершенные реплики некоторых изображений, и даже для более крупных и более сложных изображений дает то, что можно распознать. Или, возможно, это не делает изображения, которые являются вполне узнаваемыми, но создает красивые изображения, которые явно получены из оригинала.
- 3 балла для умного использования набора символов Unicode
- 0 баллов за простое использование всего набора допустимых символов
- 1 балл за использование ограниченного набора символов, которые безопасны для передачи через Twitter или в более широком диапазоне ситуаций.
- 2 точки для использования тематического подмножества символов, например, только идеографы Хан или только символы справа налево
- 3 балла за то, что вы делаете что-то действительно аккуратное, например, генерируете читаемый текст или используете символы, которые выглядят как соответствующее изображение.
- 3 балла для умных алгоритмических подходов и стиля кода
- 0 баллов за то, что составляет 1000 строк кода, только для масштабирования изображения вниз, рассматривать его как 1 бит на пиксель, а base64 - кодирование, которое
- 1 пункт для чего-то, что использует стандартную технику кодирования и хорошо написано и кратко
- 2 пункта для чего-то, что вводит относительно новую технику кодирования, или это удивительно коротко и чисто.
- 3 балла за один лайнер, который на самом деле дает хорошие результаты или что-то новое, что ломает новую почву в графическом кодировании (если это кажется небольшим количеством точек для взлома новой земли, помните, что результат, который, вероятно, будет иметь высокий уровень оценка для эстетики также)
- 2 балла для скорости. При прочих равных условиях быстрее, но вышеприведенные критерии важнее скорости.
- 1 балл для работы на бесплатном (с открытым исходным кодом) программном обеспечении, потому что я предпочитаю бесплатное программное обеспечение (обратите внимание, что С# по-прежнему будет иметь право на этот момент, пока он работает на Mono, аналогично код MATLAB иметь право, если он работает на GNU Octave)
- 1 балл для фактического выполнения всех правил. Эти правила стали немного большими и сложными, поэтому я, вероятно, соглашусь с другими хорошими ответами, которые будут иметь небольшую деталь неправильно, но я дам дополнительный пункт любому решению, которое действительно соответствует всем правилам.
Обратные изображения
Некоторые люди попросили некоторые ссылочные изображения. Вот несколько эталонных изображений, которые вы можете попробовать. более мелкие версии встроены здесь, все они ссылаются на более крупные версии изображения, если вам это нужно:
Приз
Я предлагаю 500 rep bounty (плюс 50, которые StackOverflow делает) для решения, которое мне больше всего нравится, на основе вышеуказанных критериев. Конечно, я призываю всех остальных проголосовать за их любимые решения здесь.
Примечание о крайнем сроке
Этот конкурс будет проводиться до тех пор, пока в субботу, 30 мая, не начнется грандиозность, около 6 часов вечера. Я не могу сказать, какое точное время закончится; это может быть где угодно от 5 до 7 вечера. Я гарантирую, что рассмотрю все записи, представленные к 2 PM, и я сделаю все возможное, чтобы посмотреть все записи, представленные к 16:00; если решения будут представлены после этого, у меня может не быть возможности дать им честный взгляд, прежде чем я должен принять решение. Кроме того, чем раньше вы отправляете, тем больше у вас шансов на голосование, чтобы помочь мне выбрать наилучшее решение, поэтому постарайтесь представить более раннее, а не право в крайний срок.
Заметки Unicode
Также существует некоторая путаница в том, какие именно символы Unicode разрешены. Диапазон возможных кодовых точек Unicode составляет от U+0000
до U+10FFFF
. Есть некоторые кодовые точки, которые никогда не действительны для использования в качестве символов Юникода при любом открытом обмене данными; это нехарактеры и суррогатные коды. Нехарактеры определяются в Unidode Standard 5.1.0, раздел 16.7как значения U+FFFE
, U+FFFF
, U+
n FFFE
, U+
n FFFF
, где n равно 1
- 10
шестнадцатеричный, а диапазон U+FDD0
- U+FDEF
. Эти значения предназначены для использования для внутреннего использования приложения, и соответствующие приложения могут лишать эти символы из обработанного ими текста. Суррогатные кодовые точки, определенные в Unicode Standard 5.1.0, раздел 3.8 как U+D800
- U+DFFF
, используются для кодирования символов за пределами Основная многоязычная плоскость в UTF-16; таким образом, невозможно представить эти кодовые точки непосредственно в кодировке UTF-16, и недопустимо кодировать их в любом другом кодировании. Таким образом, для целей этого конкурса я разрешу любую программу, которая кодирует изображения в последовательности не более 140 кодов Unicode из диапазона U+0000
- U+10FFFF
, исключая все нехарактеры и суррогатные пары, как определено выше.
Я предпочитаю решения, которые используют только назначенные символы, и даже лучшие, которые используют умные подмножества назначенных символов или делают что-то интересное с набором символов, который они используют. Список назначенных символов см. В Unicode Character Database; обратите внимание, что некоторые символы перечислены непосредственно, а некоторые перечислены только как начало и конец диапазона. Также обратите внимание, что суррогатные коды указаны в базе данных, но запрещены, как указано выше. Если вы хотите использовать некоторые свойства символов для получения более интересного текста, вы можете найти множество баз данных символьной информации доступный, например список именованных кодовых блоков и различные свойства символов.
Так как Twitter не указывает точный набор символов, который они поддерживают, я буду снисходителен к решениям, которые на самом деле не работают с Twitter, потому что некоторые персонажи подсчитывают лишние или некоторые персонажи лишаются. Предпочтительно, но не обязательно, чтобы все закодированные выходные данные могли быть перенесены без обращения через Twitter или другую службу микроблогов, например identi.ca. Я видел некоторую документацию, в которой говорится о том, что объект-кодировщик Twitter <, > , и &, и, следовательно, считает их 4, 4 и 5 символами соответственно, но я не проверял это самостоятельно, и их счетчик символов JavaScript не работает Кажется, они так считают.
Советы и ссылки
- Определение правильных символов Юникода в правилах немного сложнее. Выбор одного блока символов, например унифицированных идеографов CJK (U + 4E00-U + 9FCF), может быть проще.
- Вы можете использовать существующие библиотеки изображений, например ImageMagick или Библиотека изображений Python, для обработки изображений.
- Если вам нужна помощь в понимании набора символов Unicode и его различных кодировок, см. это краткое руководство или этот подробный FAQ по UTF-8 в Linux и Unix.
- Чем раньше вы получите свое решение, тем больше времени мне придется (и другим людям голосовать). Вы можете отредактировать свое решение, если вы его улучшите; Я буду основывать свою награду на последней версии, когда я рассмотрю последние решения.
- Если вам нужен простой формат изображения для разбора и записи (и вы не хотите использовать только существующий формат), я бы предложил использовать PPM формат. Это текстовый формат, с которым очень легко работать, и вы можете использовать ImageMagick для преобразования в него и из него.