Якщо малюнок вартує 1000 слів, на скільки зображень ви можете вмістити 140 символів?
Примітка : це все, люди! Кінцевий термін Баунті тут, і після деяких жорстких роздумів я вирішив, що вступ Бужуа ледве обрізав Сема Хочевара . Я опублікую більш детальні замітки, як тільки матиму можливість їх написати. Звичайно, кожен повинен вільно продовжувати надсилати рішення та вдосконалювати рішення для людей, за яких голосують. Дякую всім, хто подав та вступив; Мені все сподобалось. Це мені було дуже весело бігати, і я сподіваюся, що це було весело і для абітурієнтів, і для глядачів.
Я натрапив на цей цікавий пост про спробу стиснення зображень до коментаря у Twitter, і багато людей із цієї теми (та нитки на Reddit ) мали пропозиції щодо різних способів, як це можна зробити. Отже, я вважаю, що це може стати гарним завданням кодування; дозвольте людям покласти свої гроші туди, де є рот, і покажіть, як їхні уявлення про кодування можуть призвести до більш детальної інформації в обмеженому просторі, яке у вас є.
Я закликаю вас придумати систему загального призначення для кодування зображень у повідомлення 140 Twitter із символів та знову їх декодування у зображення. Ви можете використовувати символи Unicode, тому ви отримуєте більше 8 біт на символ. Однак, навіть допускаючи символи Unicode, вам потрібно буде стиснути зображення в дуже невеликому просторі; це, безумовно, призведе до стиснення втрат, і тому доведеться суб'єктивно оцінювати, наскільки добре виглядає кожен результат.
Ось результат, який отримав оригінальний автор, Quasimondo , від його кодування (зображення ліцензоване за ліцензією Creative Commons Attribution-некомерційна ):
Ви можете зробити краще?
Правила
- Ваша програма повинна мати два режими: кодування та декодування .
- При кодуванні :
- Ваша програма повинна приймати як введення графіку у будь-якому розумному растровому графічному форматі на ваш вибір. Ми скажемо, що будь-який растровий формат, підтримуваний ImageMagick, вважається розумним.
- Ваша програма повинна вивести повідомлення, яке може бути представлено у 140 або менших кодових точках Unicode; 140 кодових точок в діапазоні
U+0000
-U+10FFFF
, без урахування символів (U+FFFE
,U+FFFF
,U+
пFFFE
,U+
пFFFF
, де п є1
-10
шістнадцяткове, а діапазонU+FDD0
-U+FDEF
) і сурогатною кодові точки (U+D800
-U+DFFF
). Він може виводитися в будь-якому розумному кодуванні на ваш вибір; будь-яке кодування, що підтримується GNU,iconv
буде вважатися розумним, і кодування коду на вашій платформі або локальне кодування буде, ймовірно, хорошим вибором. Докладнішу інформацію див. У примітках Unicode нижче.
- При розшифровці :
- Ваша програма повинна приймати як вхід вихідний режим кодування .
- Ваша програма повинна виводити зображення у будь-якому розумному форматі на ваш вибір, як визначено вище, хоча для форматів вихідних векторів також добре.
- Вихід зображення повинен бути наближеним до вхідного зображення; чим ближче ви можете підійти до вхідного зображення, тим краще.
- Процес декодування може не мати доступу до будь-якого іншого виходу процесу кодування, крім виходу, зазначеного вище; тобто ви не можете завантажувати зображення кудись і виводити URL-адресу процесу декодування для завантаження, або щось подібне нерозумно.
Для послідовності в інтерфейсі користувача ваша програма повинна вести себе так:
- У вашій програмі повинен бути сценарій, який можна встановити на виконуваний на платформі відповідний інтерпретатор, або програма, яку можна скласти у виконуваний файл.
- Ваша програма повинна брати свій перший аргумент
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 біт на піксель та базовий код 64
- 1 бал за те, що використовує стандартну техніку кодування та добре написане та коротке
- 2 бали за те, що впроваджує порівняно нову техніку кодування, або це напрочуд коротко і чисто
- 3 бали за один вкладиш, який фактично дає хороші результати або щось, що порушує нову основу в графічному кодуванні (якщо це здається низькою кількістю балів за прорив нового ґрунту, пам’ятайте, що результат цього товару, ймовірно, матиме високий бал за естетику так само)
- 2 бали за швидкість. За інших рівних ситуацій швидше - краще, але вищезазначені критерії важливіші за швидкість
- 1 бал для запуску вільного програмного забезпечення (з відкритим кодом), тому що я віддаю перевагу вільному програмному забезпеченню (зауважте, що C # як і раніше буде придатним до цього пункту, поки він працює на Mono; аналогічно, код MATLAB був би придатним, якщо він працює на GNU Octave)
- 1 бал за фактичне дотримання всіх правил. Ці правила стали трохи великими і складними, тому я, мабуть, прийму хороші відповіді в іншому випадку, якщо одна маленька деталь буде неправильною, але я дам додаткову точку будь-якому рішенню, яке насправді дотримується всіх правил
Довідкові зображення
Деякі люди попросили довідкові зображення. Ось кілька довідкових зображень, які ви можете спробувати; Тут вбудовані менші версії, усі вони посилаються на більші версії зображення, якщо вам потрібні:
Приз
Я пропоную винагороду на 500 представників (плюс 50, які починає StackOverflow) за рішення, яке мені подобається найкраще, виходячи з вищенаведених критеріїв. Звичайно, я закликаю всіх інших також проголосувати за їх улюблені рішення.
Примітка про термін
Цей конкурс триватиме до виграшу щедрості, близько 18:00 у суботу, 30 травня. Я не можу сказати точного часу, коли він закінчиться; він може бути десь від 5 до 19 вечора. Я гарантую, що я перегляну всі записи, подані до 14:00, і зроблю все можливе, щоб переглянути всі записи, подані до 16:00; якщо після цього будуть подані рішення, я, можливо, не маю шансу надати їм справедливий вигляд, перш ніж приймати своє рішення. Крім того, чим раніше ви подасте заявку, тим більше шансів на голосування матимете змогу допомогти мені вибрати найкраще рішення, тож спробуйте подати раніше, а не правильно в крайній термін.
Примітки Unicode
Була також деяка плутанина щодо того, які саме символи Unicode дозволено Діапазон можливих точок коду Unicode - U+0000
до U+10FFFF
. Є деякі точки коду, які ніколи не можна використовувати як символи Unicode при будь-якій відкритій обміні даними; це нехарактерні та сурогатні кодові точки . Noncharacters визначені в 5.1.0 секції Unidode Standard 16.7 в якості значень U+FFFE
, U+FFFF
, U+
пFFFE
, U+
пFFFF
, де п є 1
- 10
шістнадцяткове, а діапазон U+FDD0
-U+FDEF
. Ці значення призначені для використання для внутрішнього використання, що відповідає додатку, і відповідні програми можуть викреслити цих символів із тексту, обробленого ними. Сурогатні кодові точки, визначені у розділі 3.8 Unicode Standard 5.1.0 як U+D800
- U+DFFF
, використовуються для кодування символів, що перебувають за межами базової багатомовної площини в UTF-16; таким чином, неможливо представити ці кодові точки безпосередньо в кодуванні UTF-16, і кодування їх у будь-якому іншому кодуванні недійсне. Таким чином, для цього конкурсу я дозволю будь-яку програму, яка кодує зображення в послідовності не більше 140 кодів Unicode з діапазону U+0000
- U+10FFFF
за винятком усіх нехарактерних та сурогатних пар, як визначено вище.
Я віддаю перевагу рішенням, які використовують лише призначені символи, а ще кращі, які використовують розумні підмножини призначених символів або роблять щось цікаве з набором символів, який вони використовують. Список призначених символів див. У базі даних символів Unicode ; зауважте, що деякі символи перераховані безпосередньо, а деякі вказані лише як початок і кінець діапазону. Також зауважте, що сурогатні кодові точки вказані в базі даних, але заборонені, як згадувалося вище. Якщо ви хочете скористатися певними властивостями символів для того, щоб зробити текст, який виводить, цікавішим, є різноманітні бази даних символьної інформації , такі як список названих блоків коду та різні властивості символів.
Оскільки Twitter не визначає точний набір символів, який вони підтримують, я буду поблажливий до рішень, які насправді не працюють з Twitter, оскільки певні символи нараховують додаткові чи певні символи позбавлені. Бажано, але не потрібно, щоб усі кодовані виходи мали можливість перенести неушкоджений через Twitter або інший сервіс мікроблогінгу, такий як identi.ca . Я бачив деяку документацію, в якій зазначається, що сутність Twitter кодує <,> і &, і таким чином підраховує їх відповідно 4, 4 і 5 символів, але я не перевіряв це сам, і їх лічильник JavaScript символів не здається порахувати їх так.
Поради та посилання
- Визначення дійсних символів Unicode у правилах дещо складне. Вибір одного блоку символів, наприклад, CJK Unified Ideographs (U + 4E00 – U + 9FCF), може бути простішим.
- Ви можете використовувати існуючі бібліотеки зображень, наприклад ImageMagick або Python Imaging Library , для обробки зображень.
- Якщо вам потрібна допомога для розуміння набору символів Unicode та різних його кодувань, перегляньте цей короткий посібник або детальний FAQ щодо UTF-8 в Linux та Unix .
- Чим раніше ви отримаєте своє рішення, тим більше часу мені (та іншим людям, які голосують) доведеться його розглянути. Ви можете відредагувати своє рішення, якщо вдосконалите його; Я буду базувати свою винагороду на останній версії, коли я останній погляд на рішення.
- Якщо ви хочете, щоб легкий формат зображення розбирав і писав (а ви не хочете просто використовувати існуючий формат), я б запропонував використовувати формат PPM . Це текстовий формат, з яким дуже легко працювати, і ви можете використовувати ImageMagick для перетворення в нього та з нього.