Рэндалл Манро (автор XKCD) провел опрос, чтобы дать названия цветам . Основным результатом является список названий для 954 самых распространенных цветов монитора RGB .
Для простоты программирования вот список в виде простого текста: http://xkcd.com/color/rgb.txt . Осторожно, первая строка не является данными, но содержит лицензию.
Напишите программу или функцию, которая принимает действительное имя цвета из вышеприведенного списка в качестве входных данных и выводит соответствующий цветовой код RGB. Ваша программа не должна обрабатывать некорректные входные данные каким-либо определенным образом.
Применяются стандартные лазейки. Кроме того, в вашем ответе не должны использоваться предварительно определенные (встроенные или внешние) цветовые коды <-> карты имен цветов. (Это включает связанный список.) Короткий код в байтах побеждает. Если вы читаете из файла, число байтов файла должно быть включено.
Примеры:
dark peach -> #de7e5d
robin's egg blue -> #98eff9
pink/purple -> #ef1de7
shit #7f5f00
-bubble gum pink #ff69af
,bubblegum pink #fe83cc
Ответы:
Perl 5 -
421239563930407 байт для кода и 3523 для файла данных. Двоичные данные считываются из файла «g», шестнадцатеричный дамп которого можно найти здесь .
При этом используется идеальная хеш-функция, сгенерированная с использованием GNU gperf , которая присваивает каждому имени цвета уникальное целое число в диапазоне от 0 до 6304, которое можно использовать для индексации таблицы. Данные gzipped содержат значения цвета в формате 1 байта, указывающего смещение в таблице от предыдущего цвета, затем 3 байта для самого цвета (с двумя шестнадцатеричными цифрами на байт). (Байт 0 для смещения означает, что это фактически следующее значение + 255, поскольку не каждое смещение умещается в один байт).
Код анализирует данные, чтобы создать таблицу, содержащую строку цвета RGB, а затем применяет к входу хэш-функцию (переведенную в perl), чтобы выбрать соответствующий выход из таблицы.
Использование:
Изменить: дальнейшее уменьшение размера путем сжатия файла данных
источник
EXCEL, 18 (+ 18269)
Просто чтобы установить базовый уровень, я покажу простейшее решение для Excel, о котором я мог подумать:
Код
Код в Excel очень прост:
Входные данные должны быть помещены между двойными кавычками.
Данные
Данные должны храниться в файле .csv, выглядя примерно так:
Когда я нажимаю на CSV, он автоматически открывает Excel и помещает данные в столбцы A и B, вам может понадобиться другой разделитель.
источник
Ruby, 5
37988 + 9 + 5 220 = 5 317 байт+9 байт за
-rdigest
флаг.... плюс словарь на 5220 байт в виде двоичных данных, считанных из STDIN (или аргумента имени файла). Вы найдете словарь в формате xxd во фрагменте ниже. Программа принимает имя цвета в качестве аргумента, поэтому вы вызываете его так:
Если кто-то может придумать более короткий способ как прочитать файл и принять имя цвета в качестве аргумента, пожалуйста, оставьте комментарий.
$*
(ARGV) и$<
(ARGF) взаимодействуют странным и оккультным образом, следовательно$*.pop
.Словарь (формат xxd)
Показать фрагмент кода
объяснение
Кодирование словаря
Конструкция словаря очень проста. Я беру шестнадцатеричный хэш MD5 имени цвета и объединяю шестые шестнадцатеричные цифры от второй до шестой (которые уникальны для каждого цвета) с 6-значным цветовым кодом. Я соединяю их в одну строку из 10 439 шестнадцатеричных цифр. Затем я конвертирую это в эквивалентные 5219,5 байта, дополненные нулями справа, для еще 5220 байтов.
Забавно: я попробовал сжать словарь и даже
zopfli -i100
создал файл на 40 байт больше . Ради интереса я подсчитал энтропию двоичного словаря, и она составляет 99,8% (например,rgb.txt
61,2%). Неплохо!Вот код, который генерирует словарь:
Расшифровка и поиск по словарю
Это полная противоположность вышесказанному. Сначала я преобразую преобразование двоичных данных в их шестнадцатеричное представление из 10 439 цифр. Затем я беру входную строку (имя цвета) и получаю шестнадцатеричные шестнадцатеричные цифры его хеша MD5 и использую регулярное выражение, чтобы найти эти цифры в шестнадцатеричной строке размером 10 439 цифр по некоторому индексу, кратному 11, и возвращаю последующие 6 цифр. , которые являются соответствующим цветовым кодом. Например, для хэша
b9ca5
( «облачные голубого»), следующее регулярное выражение строятся:/^.{11}*b9ca5\K.{6}/
. В\K
оператор отбрасывает не совпадают до этого момента, так что только последние шесть символов возвращаются.источник
pink/purple
это#a6814c
, но правильный ответ#ef1de7
.Perl, 7375 байт
Сохраняет слегка сжатые данные (
grey
->E
и т. Д.) В виде сжатых двоичных данных, расширяет их в хеш и возвращает соответствующий ключ после замены пробелов во входных данных_
. Я не думаю, что это так здорово, и я уверен, что у других будут намного более интеллектуальные методы сжатия данных, я мог бы поиграть с этим позже.Обратимый hexdump доступен здесь, который был создан с помощью этого сценария .
использование
источник
Рубин,
12131,12030 +-p
= 12033 байтаКоличество байтов указывается после замены
<compressed text>
необработанными данными вставки в http://pastebin.com/xQM6EF9Q . (Убедитесь, что вы получаете необработанные данные из-за вкладок в файле)Я действительно мог бы уменьшить текст дальше, но я занимался этим уже несколько часов, и мне нужно поспать.
Ввод - это вводная строка из STDIN без завершающей строки. Добавление в конце новой строки требует +3 байта при изменении
($_+?\t)
на(chomp+?\t)
.источник
BASH + bzip2,
805868096797 байтПосле сжатия сохранил исходный список в файл, не уверенный, разрешено ли это.
Звоните с:
источник
dusty teal
потерпит неудачу. Прочитайте все аргументы$*
или что-то в этом роде.bzgrep ..... c
вместо этогоPython, 9360 символов
Не использует библиотеку сжатия. Я пока оставлю это в тайне, как это работает, а затем выложу ссылку на технику. Конечно, это можно сделать короче, сохранив данные в двоичном формате, но это упражнение в другой раз.
Объяснение:
Использует адаптацию кода из http://stevehanov.ca/blog/index.php?id=119 для создания минимального идеального поиска по хэшу от имен цветов до цветовых кодов.
источник
Питон 3, 4927
182 код + 4745 файл данных
Теория Операции:
md5((67*s).encode('ascii')).digest()[5:7]
идеальный хеш от имен цветов до 2-байтового значения. Файл двоичных данных - это просто список 5-байтовых блоков - 2-байтовый хэш и 3-байтовый цвет. Код хэширует имя входного цвета и просматривает данные, чтобы найти совпадение.Код для генерации двоичного файла:
Вот код, который я использовал, чтобы найти идеальный хеш. Ничего особенного, только три вложенных цикла: количество повторений имени (например, «синий», «синий», ...); доступные алгоритмы хеширования; и смещения в хешах. Распечатывает комбинации, для которых нет столкновений.
источник
Python 3, 296 + 3960 = 4256 байт
Я не использовал
gperf
, потому что было бы слишком скучно просто повторять этот трюк. Вместо этого я сделал решение «грубой силы» с нуля, и поэтому размер не является оптимальным (но тоже не слишком плохим).Однако я нашел, как более эффективно сжимать цвета - они сортируются и выровнены по 4 байта, и LZMA использует это в своих интересах. (цвета сжаты до 2180 байт)
Чтобы найти цвет по имени, используется 15-битная хеш-функция. Теоретически его можно найти с меньшим количеством битов (числа 0,949 можно кодировать с помощью 10 битов), но мой компьютер не может найти ничего лучше, это слишком много работы.
Код принимает входные данные из стандартного ввода и печатает ответ.
Код:
Файл данных (двоичный, должен быть назван
a
и помещен в одну папку):Как запустить:
источник
С, 19 566 байт
Бедный 19 566 байт.
Болотный стандарт C. Файл rgb.txt передается через стандартный ввод. Цвет для поиска дается в качестве первого аргумента.
Так:
./xkcd "bright sea green" < colors.txt
дает:
bright sea green -> #05ffa6
источник
Java,
7 978 7435 байтКод - 293 байта, данные - 7 142 байта.
Golfed:
Ungolfed:
Файл с именем «c» в программе является результатом обратной операции этой программы: возьмите хеш-код каждого ключа во входном файле и сохраните его с целочисленным представлением значения цвета. Это входит в поток вывода объекта, поток вывода GZip, затем поток вывода файла. Эта программа читает его через обратные входные потоки.
Стандартные хэш-коды Java всех цветов уникальны для этого набора данных, поэтому он является хорошим 32-битным ключом в хэш-карте. Значение уже является целым числом, поэтому все, что нужно сделать, это правильно отформатировать его в виде шестнадцатеричной строки, дополненной до шести цифр, если необходимо, с меткой хеша впереди.
источник
Java, 4649 байт
Java-код: 497 байт, файл данных: 4152 байт
Файл можно найти здесь
ungolfed:
Программа использует улучшенную версию хэш-кода Java, которая использует только 17 бит:
Цвета отсортированы по возрастанию синего компонента. Они хранятся в 18 битах: 8 для красного, 8 для зеленого и 2 для дельта синего.
Общий размер файла: 949 цветов * (18 + 17) = 33 215 = 4152 байта
источник
JavaScript (Node.js), 10785 байт
Использование:
Закодированные данные .
источник
MATLAB, 94 + 7,243 = 7,337 байт
Создайте MAT-файл "h.mat" с переменной "c", содержащий отсортированный список контрольных сумм имен CRC32 (c = java.util.zip.CRC32; c.update (uint8 (x)); c.getValue ();) и тот же отсортированный список преобразованных шестнадцатеричных кодов цветов (sscanf (x (:, end), '% x')), что и "e". Это должно иметь (R2013b, формат файла v7, размер 7,243 байта.
Функция выглядит следующим образом
Он использует встроенное сжатие MAT-файлов и поддержку Java для функции CRC32.
источник
Go, 6709 байт
Код 404 байта, данные 6305 байтов
Данные кодируются с
xxd -p
. Извлечь в файл, просто названныйf
сxxd -r paste f
. Код можно запустить какgo run file.go "tree green"
источник
C #, 6422 байта
Код 575 байт, данные 5847 байт
Данные существуют в соседнем файле GZipped, который содержит преобразованное представление исходных данных. Цветные слова, которые появляются более одного раза, извлекаются и помещаются в таблицу заголовков в верхней части файла с префиксом длиной в один байт.
Записи данных (после заголовка) состоят из набора:
Каждая запись заканчивается либо 0xFF, 0xFE, 0xFD, что указывает на то, что следующие один, два или три байта, следующие, представляют смещение значения цвета, соответственно.
Таблица анализируется по порядку, и значение цвета накапливается до тех пор, пока не будет найдена соответствующая строка для ввода.
Минимизированный код декомпрессии / поиска:
Код сжатия данных
источник
C # 7,209 байт: данные 6,643 байт + код 566 байт (878 байт не минимизированы)
Github репо здесь: https://github.com/nbcarey/color-map
Имена цветов сжимаются в файле данных с использованием хэша FNV-32-1a, так как этот алгоритм хэширования обычно не имеет коллизий для этого набора имен цветов. Таким образом, каждое имя цвета хранится как 4 байта.
Каждый цвет хранится в виде 3 байтов (1 для красного, зеленого и синего). Там нет магии.
Следовательно, каждое сопоставление имени цвета со значением RGV занимает 7 байтов в сжатом файле.
Это однострочная версия хеша FNV-32-1a (предполагается, что строка содержит только простые символы ASCII:
Этот сжатый файл данных находится в репозитории github по адресу https://github.com/nbcarey/color-map/blob/master/color-map/hashed-color-map.dat.
Вот свернутый код:
А вот читабельный код:
источник
PHP, 5014 байта
Не самое лучшее, но уже поздно, и мне нужно немного поспать. :-)
Прелесть PHP в том, что вы можете встроить полезные данные в ваш скрипт и прочитать сам файл, поэтому скрипт самодостаточен. Просто скачайте его, запустите, и он запросит название цвета.
Основной трюк здесь состоит в том, чтобы хэшировать имена цветов и генерировать минимально идентифицирующие подстроки этого хэша. Я обнаружил, что достаточно 4 символов хэша SHA1, первые 3 и 17 числа, чтобы однозначно идентифицировать все эти цвета. Ключ находится в двоичном и цветовом коде, который обычно составляет один байт на цветовой канал. Таким образом, каждая запись занимает 5 байтов, что составляет 5 x 949 = 4745 байтов полезной нагрузки (магическое число, которое вы видите в коде).
Сжатие не очень помогло, bzip2, LZMA создали файлы большего размера, поэтому без каких-либо дополнительных хитростей это сжато так же, как и для этого подхода.
источник
Bash + (coreutils, gzip, xxd, openssl, sed, grep), 4946 байт
данные: 4482 байта, код: 464 байта
Данные можно найти в base64 здесь . Я знаю, что код может быть больше в гольфе. Слишком сонно сейчас: / Любые предложения приветствуются :-)
объяснение
Вот действия, которые я сделал с исходным файлом после удаления комментария лицензии.
openssl dgst -md5 -binary|base64
base64
использует набор из 64 символов для представления данныхA-Za-z0-9+/
,. Итак, я надеялся найти 2 байта, потому что все записи были 494 и 64 * 64 = 4096, но я не смог найти ни одного. Я также попытался найти уникальные записи с двумя символами, используяsha512
первый шаг, но безуспешно. Итак, я остался с этими 3 байтами для имен цветов.(echo '0:';echo -n "$line"|cut -d '#' -f 2)|xxd -rp -l 16|base64
zopfli -i1000
чтобы сжать файл.Таким образом, файл результата до сжатия будет выглядеть так:
Я пробовал и другие утилиты сжатия, но с худшими результатами, кроме как
zopfli -i0000 --zlib
с 4470 байтами иzopfli -i10000 --defalte
с 4464, но я не был уверен, как распаковать там форматы.Чтобы найти цветовой код, я делаю обратные действия. Я создаю трехсимвольный код из заданного имени и частично восстанавливаю исходные цветовые коды. Например,
adobe
я создаю все, что начинается сX
:Затем я выбираю
Xqy
строку и возвращаю вторую часть, представляющую собой цветной гекс.Мне очень понравилась эта головоломка, и здесь есть много отличных ответов. Спасибо и хорошая работа всем!
источник
Bash + coreutils / xxd, 4064 байта
Данные 3796 байт (шестнадцатеричный дамп файла данных)
Баш 268 байт
Ungolfed
Общая идея состоит в том, чтобы сканировать 32-битные поля, находить совпадающий уникальный 14-битный хэш и печатать цветовой код в этом месте. 18-битное цветовое кодирование использует подход Super Chafouin.
Уникальный 14-битный хеш начинается с подмножества 14 битов из 128-битной суммы md5. Для того, чтобы найти те биты , я использовал генетический алгоритм , закодированный в C ++ здесь . Код предварительно загружает фиксированный файл с именем «data», который представляет собой двоичные суммы md5, по одному на строку. Если вам нужно это в форме рецепта, это создаст файл данных:
Я нашел лучшего кандидата в 14 бит (который я видел до сих пор) из этого кода во втором поколении, но этот набор имеет два столкновения. В частности: «грязь» и «бледно-фиолетовый» отображаются на одно и то же значение, а «аква-синий» и «светло-зеленый» отображаются на одно и то же значение. Поскольку есть только два столкновения, и я не нашел ничего лучшего, я просто устраню их; Оказывается, половина каждого из этих значений не используется.
Я уже пробовал сжатие на d; но ни bzip2, ни gzip, ни xz не уменьшают размер d.
источник
Groovy,
153 + 10 697 = 10 850253 + 9870 = 10 123 байтаЯ решил, что мне нужно решение, которое включало бы только один файл, поэтому (при очевидной стоимости места) я закодировал GZIPped CSV-версию данных в символы Unicode 0x0020-0x007E (что, я думаю, будет кодировкой base 95?). Код состоит из 253 символов, содержимое строки - 10123 символа.
Для удобства чтения вот то же самое с исключенным закодированным текстом:
Моим оригинальным решением было более простое кодирование Base 64 с использованием встроенного кодировщика.
Для удобства чтения вот то же самое с исключением текста:
источник