Учитывая ввод цвета в #rrggbb
шестнадцатеричном формате, выведите его дополнение RGB в том же формате.
Дополнение RGB R 2 G 2 B 2 любого цвета R 1 G 1 B 1 определяется как цвет со значением R 2 255 - R 1 , значением B 2 255 - B 1 и значением G 2 255 - G 1 .
Шестнадцатеричные цифры могут быть прописными (# FFAA20) или строчными (# ffaa20). Случай ввода и вывода не обязательно должен быть согласованным (поэтому вы можете использовать ввод в нижнем регистре, но вывод в верхнем и наоборот).
Поскольку это код-гольф , выигрывает самый короткий код в байтах.
Тестовые (обратите внимание , что с момента предоставления вашей программы / функционировать свой собственный выход должен привести к первоначальному входу (это инволютивное ), тестовые примеры должны работать в обоих направлениях):
In/Out Out/In
----------------
#ffffff #000000
#abcdef #543210
#badcab #452354
#133742 #ecc8bd
#a1b2c3 #5e4d3c
#7f7f80 #80807f
Ответы:
Pyth,
98 байтСпасибо @isaacg за -1 байт!
Вычитание значения определенного цвета из 255 эквивалентно вычитанию каждой из шестнадцатеричных цифр из 15. Скажем, число равно 16a + b . Тогда значение числа, созданного путем вычитания его цифр из 15, равно 16 (15-a) + (15-b) = 255 - (16a + b) .
Попробуй это здесь . Тестирование.
источник
'0123456789abcdef'
для преобразования в гекс (вместоdec2hex
функции)U
не нужно - оно неявно заполненоM
.Сетчатка,
1310 байтКод состоит из трех частей, разделенных backticks (
`
):T
указывает режим транслитерации, который заменяет каждый символ во второй части соответствующим символом в третьей части.w
такой же, как традиционные регулярные выражения\w
, или_0-9A-Za-z
, который расширяется до_0123456789ABCDEFGH...
.Вторая часть расширена
GFEDCBA9876543210
, благодаря изящной способности Retina расширяться в обратном порядке. Поместите их друг на друга, и мы получим:Обратите внимание, что последний символ,
0
повторяется, чтобы соответствовать длине более длинной строки, но мы заботимся только о шестнадцатеричных символах, показанных символами вставки.Спасибо Мартину Бюттнеру за предложенный подход.
Попробуйте тестовый набор онлайн.
источник
Marbelous, 41 байт
Онлайн переводчик здесь. Ввод должен быть в верхнем регистре.
объяснение
00
И]]
на дне будет получать первый символ (#
) , и он будет падать на дно и выводиться прежде всего.Первые 3 строки представляют собой цикл для извлечения всех оставшихся символов.
Сначала мы должны преобразовать шестнадцатеричные символы в 0-15, выполнив
x -= 48, x -= x > 9 ? 7 : 0
(так как'A' - '9'
это 8).Чтобы найти дополнение, нам просто нужно преобразовать каждую цифру
x
в15-x
. Это эквивалентно (для 8-битных значений)(~x)+16 = ~(x-16)
.Наконец, мы должны преобразовать эти числа обратно в шестнадцатеричные цифры
x += x > 9 ? 7 : 0, x += 48
.Так что теперь у нас есть
x -= 48, x -= x > 9 ? 7 : 0, x = ~(x - 16), x += x > 9 ? 7 : 0, x += 48
.Обратите внимание, что если мы удалим выражение с первым троичным оператором, то введенные цифры
A
-F
приведут к отрицательному x после отрицания.Таким образом, мы можем изменить предыдущее выражение на:,
x -= 48, x -= 16, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48
что равноx -= 64, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48
.Приведенный выше код является просто реализацией последнего выражения.
-W
естьx -= 32
и+O
естьx += 24
. Поскольку в Marbelous используется 8-разрядная арифметика без знака, условие<A
распространяется как на случай, такx > 9
и наx < 0
.источник
JavaScript ES6, 61 байт
66 68 48 53 64Экономит немало байтов благодаря @ Cᴏɴᴏʀ O'Bʀɪᴇɴ, @NinjaBearMonkey и @nderscore
Использует преимущества автоматического набора типов. Исправление нулей убило количество байтов
источник
eval(`0x${s.slice(1)}`)
вместоparseInt
-
вместо eval, который сохранил еще больше байтов#FFFFFF
. Возвращает#0
.JavaScript ES6,
63585249 байтСпасибо nderscore за сохранение 11 байтов!
источник
c=>"#"+[...c].map(x=>"fedcba9876543210"[+('0x'+x)]).join``
c=>c.replace(/\w/g,x=>"fedcba9876543210"[+('0x'+x)])
Джольф, 17 байт
Попробуй это здесь! , Набор тестов (Использовать полный прогон, который в настоящее время работает.)
источник
Юлия,
7449 байтДовольно долго на данный момент, но это начало. Это лямбда-функция, которая принимает строку и возвращает строку. Вывод будет в нижнем регистре, но ввод может быть в любом.
Как отметил Томас , вычитание каждого двухзначного цветового компонента из 255 эквивалентно вычитанию каждой отдельной цифры в шестнадцатеричном вводе из 15. Зацикливая входную строку, исключая первую
#
, мы преобразуем 15 - проанализированный разряд в шестнадцатеричный. Мы присоединяемся ко всем этим, затем придерживаемся#
и называем это хорошим.источник
Japt ,
353222201615 байтОбъяснение:
источник
Perl, 30 байт
включает +1 для
-p
использование:
echo #000000 | perl -p file.pl
или
echo #000000 | perl -pe 's/\w/sprintf"%x",15&~hex$&/eg'
.источник
MATL , 21 байт
При этом используется версия 6.0.0 языка / компилятора, которая является более ранней, чем проблема.
Входные цифры должны быть в верхнем регистре.
пример
Это было выполнено в Октаве:
Изменить (12 июня 2016 г.)
Код теперь можно попробовать онлайн . Запятые должны быть заменены пробелами, и
6L
от того4L
, чтобы соответствовать изменениям в языке.объяснение
источник
Pyth,
2019 байтов1 байт благодаря xnor .
Попробуйте онлайн. Тестирование.
объяснение
z
это входtz
удаляет#
itz16
разбирает как шестнадцатеричное числоt^8 8
рассчитывает 8 8 - 1-t^8 8itz16
рассчитывает 8 8 - 1 - вход%"#%06x"-t^2 24itz16
форматирует его в шестнадцатеричную строку, дополненную нулями, и добавляет#
источник
Haskell, 85 байт
Мое первое представление, оно, вероятно, будет самым длинным (85 байт), но эй, ты должен начать где-нибудь. В Хаскеле:
Он использует то же самое вычитание из 15 трюков, что и другие люди.
Я также попытался использовать printf вместе с другим трюком (вычесть 8 ^ 8 - 1), и он работает в ghci, но по какой-то причине он не компилируется:
Если бы кто-то мог сделать эту работу, это было бы здорово!
источник
@username
.Mathematica,
6960 байтЕще раз, это обработка строки, которая убивает меня здесь.
источник
C 94 байта
Функция принимает массив символов, возвращает обратное значение. Производит заглавные буквы для ответа. Код переворачивает каждый шестнадцатеричный символ ASCII в обратный, если он действителен, игнорирует его в противном случае.
источник
i
перед функцией глобально :i;
𝔼𝕊𝕄𝕚𝕟 2, 18 символов / 34 байта
Try it here (Firefox only).
Использование версии, созданной после испытания.
объяснение
Неконкурентное решение, 15 символов / 29 байт
Использует транслитерацию.
источник
⌿
./g
.Питон, 96
Первый код гольф, пожалуйста, дайте мнение :)
источник
"quotes"
кстати, так чтоinput()
работает. Вам не нужны перевод строки и отступ в цикле for, и онrange
работает просто отлично. Есть также пара пробелов, которые вы можете удалить.int("ff", 16)
можно заменить просто255
.CJam, 16 байтов
Это довольно долго, потому что CJam обрабатывает базовые изменения по-разному, поэтому было проще сделать транслитерацию. Смотрите мой ответ Retina для получения дополнительной информации о транслитерации.
Попробуйте онлайн.
объяснение
источник
Python 3, 44 байта
Первоначально я использовал
256^3
тогда16^6
. Тогда я видел Pietu1998,8^8
и теперь это решение использует это вместо.источник
Ява,
9590 байтПобитовый XOR.
источник
Баш + тр, 35 байт
Вывод всегда в нижнем регистре.
К сожалению, tr не принимает диапазоны в обратном порядке, поэтому мне пришлось их прописать.
источник
C, 147 байтов
Использовал strtol для преобразования из шестнадцатеричной строки в int, затем вычел число из 255, чтобы получить комплимент, как в оригинальном сообщении. Мне, однако, интересно, есть ли способ передать диапазон символов из s в strtol, чтобы мне не пришлось тратить кучу байтов, копируя в новую строку?
источник
void
тип возвращаемого значения?R, 62 байта
источник
sed, 48 байтов
Или 36 байтов, если вам нужно только поддержать один случай.
источник
0
код в коде между9
иA
(хотя число байтов верное, должно быть ошибка копирования).PowerShell, 48 байт
Обязательно принимает входные данные
param($a)
в виде строки, разделенной символом'
или"
, посколькуC:\Tools\Scripts\Golfing> .\complementary-colors #a1b2c3
в командной строке PowerShell будет обрабатываться#a1b2c3
как комментарий и в целом игнорировать его.Слева направо
"#{0:x6}"-f(...)
форматирует наши выходные вычисления обратно в шестнадцатеричное с гарантированными 6 символами (для учета ввода#ffffff
). Внутри скобок мы вычитаем наш входной номер из0xffffff
. Мы делаем это, используя тот факт, что PowerShell анализирует шестнадцатеричные числа в формате0xNNN
, поэтому мы строим шестнадцатеричное число правильного формата из нашего входного числа$a
. (Обратите внимание, что конкатенация плюс.Trim()
короче, чем.Replace()
здесь, на один байт.) Мы также используемMB
унарный оператор через16MB-1
конструкцию16777215
вместо0xffffff
.источник
TeaScript, 24 байта
Ошибки в интерпретаторе не позволяют мне сократить это :(
Попробуйте онлайн
источник