Dada a entrada de uma cor no #rrggbb
formato hexadecimal, imprima seu complemento RGB no mesmo formato.
O complemento RGB R 2 G 2 B 2 de qualquer cor R 1 G 1 B 1 é definido como a cor com o valor R 2 255 - R 1 , valor B 2 255 - B 1 e valor G 2 255 - G 1 .
Os dígitos hexadecimais podem estar em maiúsculas (# FFAA20) ou minúsculas (# ffaa20). As maiúsculas e minúsculas da entrada e da saída não precisam ser consistentes (portanto, você pode receber entradas em minúsculas, mas em maiúsculas e vice-versa).
Como esse é o código-golfe , o código mais curto em bytes vence.
Casos de teste (observe que, como fornecer ao seu programa / função sua própria saída deve resultar na entrada original (é involutória ), os casos de teste devem funcionar nas duas direções):
In/Out Out/In
----------------
#ffffff #000000
#abcdef #543210
#badcab #452354
#133742 #ecc8bd
#a1b2c3 #5e4d3c
#7f7f80 #80807f
Respostas:
Pitão,
98 bytesObrigado a @isaacg por -1 byte!
Subtrair o valor de uma determinada cor de 255 é equivalente a subtrair cada um dos dígitos hexadecimais de 15. Digamos que um número seja 16a + b . Então o valor do número criado subtraindo seus dígitos de 15 é 16 (15-a) + (15-b) = 255 - (16a + b) .
Experimente aqui . Suíte de teste.
fonte
'0123456789abcdef'
para converter para hex (em vez dedec2hex
função)U
é desnecessário - é preenchido implicitamente porM
.Retina,
1310 bytesExistem três partes no código, separadas por backticks (
`
):T
especifica o modo transliterado, que substitui cada caractere na segunda parte pelo seu caractere correspondente na terceira parte.w
é o mesmo que o do regex tradicional\w
ou_0-9A-Za-z
que é expandido para_0123456789ABCDEFGH...
.A segunda parte é expandida para
GFEDCBA9876543210
, graças à capacidade bacana de Retina de expandir na ordem inversa. Coloque-as umas sobre as outras e obteremos:Observe que o último caractere,
0
é repetido para se ajustar ao comprimento da string mais longa, mas nos preocupamos apenas com os caracteres hexadecimais, mostrados por pontos de interpolação.Agradecemos a Martin Büttner por sugerir essa abordagem.
Experimente o conjunto de testes online.
fonte
Marbelous, 41 bytes
Intérprete online aqui. A entrada deve estar em maiúscula.
Explicação
A
00
e]]
na parte inferior vai buscar o primeiro caractere (a#
) e ele vai cair para o fundo e ser emitido antes de mais nada.As 3 primeiras linhas são um loop para buscar todos os caracteres restantes.
Primeiro, precisamos converter os caracteres do dígito hexadecimal para 0-15, fazendo
x -= 48, x -= x > 9 ? 7 : 0
(já que'A' - '9'
é 8).Para encontrar o complemento, basta converter todos os dígitos
x
em15-x
. Isso é equivalente a (para valores de 8 bits)(~x)+16 = ~(x-16)
.Finalmente, temos que converter esses números novamente em dígitos hexadecimais, fazendo isso
x += x > 9 ? 7 : 0, x += 48
.Então agora nós temos
x -= 48, x -= x > 9 ? 7 : 0, x = ~(x - 16), x += x > 9 ? 7 : 0, x += 48
.Observe que, se removermos a expressão com o primeiro operador ternário, os dígitos de entrada
A
-F
resultarão em um x negativo após a negação.Assim, podemos alterar a expressão anterior para:,
x -= 48, x -= 16, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48
que é igual ax -= 64, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48
.O código acima é apenas uma implementação da última expressão.
-W
éx -= 32
e+O
éx += 24
. Como o Marbelous usa aritmética de 8 bits não assinada, a condição<A
cobre o caso dex > 9
ex < 0
.fonte
JavaScript ES6, 61 bytes
66 68 48 53 64Economiza alguns bytes graças a @ Cᴏɴᴏʀ O'Bʀɪᴇɴ, @NinjaBearMonkey e @nderscore
Aproveita a conversão automática de tipo. Corrigindo os zeros eliminaram a contagem de bytes
fonte
eval(`0x${s.slice(1)}`)
vez deparseInt
-
em vez de eval que salvou ainda mais bytes#FFFFFF
. Retorna#0
.JavaScript ES6,
63585249 bytesObrigado ao nderscore por salvar 11 bytes!
fonte
c=>"#"+[...c].map(x=>"fedcba9876543210"[+('0x'+x)]).join``
c=>c.replace(/\w/g,x=>"fedcba9876543210"[+('0x'+x)])
Jolf, 17 bytes
Experimente aqui! , Conjunto de testes (use a execução completa, que agora funciona.)
fonte
Julia,
7449 bytesMuito tempo no momento, mas é um começo. Esta é uma função lambda que aceita uma string e retorna uma string. A saída estará em minúscula, mas a entrada poderá estar em qualquer um.
Como Thomas observou , subtrair cada componente de cor de 2 dígitos de 255 é equivalente a subtrair cada dígito individual na entrada hexadecimal de 15. Ao fazer um loop sobre a sequência de entrada, excluindo o líder
#
, convertemos 15 - o dígito analisado em hexadecimal. Juntamos tudo isso e depois aderimos a um#
e chamamos de bom.fonte
Japt ,
353222201615 bytesExplicação:
fonte
Perl, 30 bytes
inclui +1 para
-p
uso:
echo #000000 | perl -p file.pl
ou
echo #000000 | perl -pe 's/\w/sprintf"%x",15&~hex$&/eg'
.fonte
MATL , 21 bytes
Isso usa a versão 6.0.0 do idioma / compilador, anterior ao desafio.
Os dígitos da entrada devem estar em maiúsculas.
Exemplo
Isso foi executado no Octave:
Editar (12 de junho de 2016)
O código agora pode ser experimentado online . As vírgulas precisam ser substituídas por espaços e
6L
por4L
, para se adaptar às mudanças no idioma.Explicação
fonte
Pyth,
2019 bytes1 byte graças ao xnor .
Experimente online. Suíte de teste.
Explicação
z
é a entradatz
remove o#
itz16
analisa como um número hexadecimalt^8 8
calcula 8 8 - 1-t^8 8itz16
calcula 8 8 - 1 - entrada%"#%06x"-t^2 24itz16
formata-o em uma string hexadecimal de 6 caracteres e adiciona o#
fonte
Haskell, 85 bytes
Minha primeira submissão, provavelmente será a mais longa (85 bytes), mas ei, você precisa começar em algum lugar. Em Haskell:
Ele está usando a mesma subtração de 15 truques que eu vi outras pessoas usarem.
Eu também tentei usar printf junto com o outro truque (subtrair 8 ^ 8 - 1) e funciona em ghci, mas por algum motivo não compila:
Se alguém pudesse fazer esse trabalho, seria ótimo!
fonte
@username
.Mathematica,
6960 bytesMais uma vez, é o processamento de strings que me mata aqui.
fonte
C, 94 bytes
A função recebe uma matriz de caracteres, retorna valor inverso. Produz letras maiúsculas para resposta. O código inverte cada caractere hexadecimal ASCII para seu inverso, se for válido, ignorando-o de outra forma.
fonte
i
antes da função:i;
𝔼𝕊𝕄𝕚𝕟 2, 18 caracteres / 34 bytes
Try it here (Firefox only).
Usando uma versão criada após o desafio.
Explicação
Solução não competitiva, 15 caracteres / 29 bytes
Usa transliteração.
fonte
⌿
./g
.Python, 96
Primeiro código de golfe, por favor, dê opiniões :)
fonte
"quotes"
entre btw, portantoinput()
funciona. Você não precisa da nova linha e do recuo no loop for erange
funciona muito bem. Também há alguns espaços que você pode remover.int("ff", 16)
pode ser substituído por apenas255
.CJam, 16 bytes
Isso é bastante longo, porque o CJam lida com as alterações básicas de maneira diferente; portanto, era mais curto fazer transliteração. Veja minha resposta da Retina para mais informações sobre transliteração.
Experimente online.
Explicação
fonte
Python 3, 44 bytes
Originalmente eu usei
256^3
então16^6
. Então eu vi o Pietu19988^8
e agora essa solução usa isso.fonte
Java,
9590 bytesXOR bit a bit.
fonte
Bash + tr, 35 bytes
A saída é sempre em minúscula.
Infelizmente "tr" não leva intervalos na ordem inversa, então eu tive que explicá-los.
fonte
C, 147 bytes
O strtol usado para converter da sequência hexadecimal em int subtraiu o número de 255 para obter o elogio, como dizia o post original. No entanto, estou me perguntando se existe uma maneira de passar um intervalo de caracteres de s para strtol, para que eu não tenha que perder um monte de bytes copiando para uma nova string?
fonte
void
tipo de retorno?R, 62 bytes
fonte
sed, 48 bytes
Ou 36 bytes, se você precisar apenas suportar um caso.
fonte
0
no seu código, entre9
eA
(embora a contagem de bytes esteja correta, deve haver um erro de cópia).PowerShell, 48 bytes
Necessariamente recebe entrada via
param($a)
como uma sequência de caracteres, delimitada por'
ou"
, uma vez queC:\Tools\Scripts\Golfing> .\complementary-colors #a1b2c3
na linha de comando do PowerShell será tratada#a1b2c3
como um comentário e a ignorará sumariamente.Da esquerda para a direita,
"#{0:x6}"-f(...)
formata nossos cálculos de saída de volta em hexadecimal com 6 caracteres garantidos (para contabilizar a entrada#ffffff
). Dentro das parênteses, subtraímos nosso número de entrada de0xffffff
. Fazemos isso aproveitando o fato de que o PowerShell analisa números hexadecimais no formato0xNNN
, para construirmos um número hexadecimal de formato adequado a partir do nosso número de entrada$a
. (Observe que a concatenação mais.Trim()
é mais curta do que.Replace()
aqui em um byte.) Também aproveitamos oMB
operador unário via16MB-1
para construir em16777215
vez de0xffffff
.fonte
TeaScript, 24 bytes
Erros no intérprete não estão me deixando mais curto :(
Experimente online
fonte