Dada la entrada de un color en #rrggbb
formato hexadecimal, genera su complemento RGB en el mismo formato.
El complemento RGB R 2 G 2 B 2 de cualquier color R 1 G 1 B 1 se define como el color con el valor R 2 255 - R 1 , el valor B 2 255 - B 1 y el valor G 2 255 - G 1 .
Los dígitos hexadecimales pueden estar en mayúsculas (# FFAA20) o en minúsculas (# ffaa20). El caso de la entrada y la salida no tiene por qué ser coherente (por lo que puede tomar la entrada en minúsculas pero la salida en mayúsculas y viceversa).
Como se trata de código de golf , gana el código más corto en bytes.
Casos de prueba (tenga en cuenta que dado que dar a su programa / función su propia salida debería dar como resultado la entrada original (es involuntario ), los casos de prueba deberían funcionar en ambas direcciones):
In/Out Out/In
----------------
#ffffff #000000
#abcdef #543210
#badcab #452354
#133742 #ecc8bd
#a1b2c3 #5e4d3c
#7f7f80 #80807f
Respuestas:
Pyth,
98 bytes¡Gracias a @isaacg por -1 byte!
Restar el valor de un determinado color de 255 es equivalente a restar cada uno de sus dígitos hexadecimales de 15. Digamos que un número es 16a + b . Entonces el valor del número creado restando sus dígitos de 15 es 16 (15-a) + (15-b) = 255 - (16a + b) .
Pruébalo aquí . Banco de pruebas.
fuente
'0123456789abcdef'
para convertir a hexadecimal (en lugar dedec2hex
función)U
es innecesario, está implícitamente rellenado porM
.Retina,
1310 bytesHay tres partes en el código, separadas por backticks (
`
):T
especifica el modo transliterar, que reemplaza cada carácter en la segunda parte con su carácter correspondiente en la tercera parte.w
es lo mismo que las expresiones regulares tradicionales\w
, o_0-9A-Za-z
, que se expande a_0123456789ABCDEFGH...
.La segunda parte se expande
GFEDCBA9876543210
, gracias a la ingeniosa capacidad de Retina para expandirse en orden inverso. Póngalos uno encima del otro y obtendremos:Tenga en cuenta que el último carácter,
0
se repite para ajustarse a la longitud de la cadena más larga, pero solo nos preocupamos por los caracteres hexadecimales, que se muestran con los caracteres de careta.Gracias a Martin Büttner por sugerir este enfoque.
Prueba el paquete de prueba en línea.
fuente
Maravilloso, 41 bytes
Intérprete en línea aquí. La entrada debe estar en mayúscula.
Explicación
El
00
y]]
en la parte inferior buscará el primer carácter (el#
) y caerá al fondo y se generará antes que nada.Las primeras 3 líneas son un bucle para buscar todos los caracteres restantes.
Primero necesitamos convertir los caracteres de dígitos hexadecimales a 0-15, haciendo
x -= 48, x -= x > 9 ? 7 : 0
(ya que'A' - '9'
es 8).Para encontrar el complemento, simplemente necesitamos convertir cada dígito
x
a15-x
. Esto es equivalente a (para valores de 8 bits)(~x)+16 = ~(x-16)
.Finalmente, tenemos que convertir estos números nuevamente en dígitos hexadecimales, haciendo
x += x > 9 ? 7 : 0, x += 48
.Entonces ahora tenemos
x -= 48, x -= x > 9 ? 7 : 0, x = ~(x - 16), x += x > 9 ? 7 : 0, x += 48
.Tenga en cuenta que si eliminamos la expresión con el primer operador ternario, ingrese dígitos
A
-F
se traducirá en un negativo x después de la negación.Por lo tanto, podemos cambiar la expresión anterior a:,
x -= 48, x -= 16, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48
que es igual ax -= 64, x = ~x, x += (x > 9 || x < 0) ? 7 : 0, x += 48
.El código anterior es solo una implementación de la última expresión.
-W
esx -= 32
y+O
esx += 24
. Dado que Marbelous usa aritmética de 8 bits sin signo, la condición<A
cubre tanto el caso dex > 9
comox < 0
.fuente
JavaScript ES6, 61 bytes
66 68 48 53 64Ahorra bastantes bytes gracias a @ Cᴏɴᴏʀ O'Bʀɪᴇɴ, @NinjaBearMonkey y @nderscore
Aprovecha el auto-type-casting. La fijación de los ceros mató el recuento de bytes
fuente
eval(`0x${s.slice(1)}`)
lugar deparseInt
-
lugar de eval que ahorró aún más bytes#FFFFFF
. Las devoluciones#0
.JavaScript ES6,
63585249 bytes¡Gracias a nderscore por guardar 11 bytes!
fuente
c=>"#"+[...c].map(x=>"fedcba9876543210"[+('0x'+x)]).join``
c=>c.replace(/\w/g,x=>"fedcba9876543210"[+('0x'+x)])
Jolf, 17 bytes
Pruébalo aquí! , Conjunto de pruebas (Usar ejecución completa, que ahora funciona)
fuente
Julia,
7449 bytesBastante largo en este momento pero es un comienzo. Esta es una función lambda que acepta una cadena y devuelve una cadena. La salida estará en minúsculas, pero la entrada puede estar en cualquiera.
Como señaló Thomas , restar cada componente de color de 2 dígitos de 255 es equivalente a restar cada dígito individual en la entrada hexadecimal de 15. Al recorrer la cadena de entrada, excluyendo el inicio
#
, convertimos 15, el dígito analizado en hexadecimal. Nos unimos a todos estos, luego agregamos un#
y lo llamamos bueno.fuente
Japt ,
353222201615 bytesExplicación:
fuente
Perl, 30 bytes
incluye +1 para
-p
uso:
echo #000000 | perl -p file.pl
o
echo #000000 | perl -pe 's/\w/sprintf"%x",15&~hex$&/eg'
.fuente
MATL , 21 bytes
Esto usa la versión 6.0.0 del lenguaje / compilador, que es anterior al desafío.
Los dígitos de entrada deben estar en mayúscula.
Ejemplo
Esto se ha ejecutado en Octave:
Editar (12 de junio de 2016)
El código ahora se puede probar en línea . Las comas deben ser reemplazadas por espacios y
6L
por4L
, para ajustarse a los cambios en el lenguaje.Explicación
fuente
Pyth,
2019 bytes1 byte gracias a xnor .
Pruébalo en línea. Banco de pruebas.
Explicación
z
es la entradatz
elimina el#
itz16
analiza como un número hexadecimalt^8 8
calcula 8 8 - 1-t^8 8itz16
calcula 8 8 - 1 - entrada%"#%06x"-t^2 24itz16
lo formatea en una cadena hexadecimal de 6 caracteres con relleno de cero y agrega el#
fuente
Haskell, 85 bytes
Mi primer envío, probablemente será el más largo (85 bytes) pero bueno, tienes que comenzar en alguna parte. En Haskell:
Está usando la misma resta de 15 trucos que vi usar a otras personas.
También intenté usar printf junto con el otro truco (restar 8 ^ 8 - 1) y funciona en ghci pero por alguna razón no se compila:
¡Si alguien pudiera hacer que esto funcionara, sería genial!
fuente
@username
.Mathematica,
6960 bytesUna vez más, es el procesamiento de cadenas lo que me mata aquí.
fuente
C, 94 bytes
La función toma una matriz de caracteres, devuelve un valor inverso. Produce letras mayúsculas para la respuesta. El código voltea cada carácter hexadecimal ASCII a su inverso si es válido, de lo contrario lo ignora.
fuente
i
antes de la función:i;
𝔼𝕊𝕄𝕚𝕟 2, 18 caracteres / 34 bytes
Try it here (Firefox only).
Usando una versión creada después del desafío.
Explicación
Solución no competitiva, 15 caracteres / 29 bytes.
Utiliza transliteración.
fuente
⌿
./g
.Python, 96
Primer código de golf, por favor dar opiniones :)
fuente
"quotes"
BTW, por lo queinput()
funciona. No necesita la nueva línea y la sangría en el bucle for, yrange
funciona bien. También hay un par de espacios que puedes eliminar.int("ff", 16)
puede ser reemplazado por solo255
.CJam, 16 bytes
Esto es bastante largo porque CJam maneja los cambios de base de manera diferente, por lo que fue más corto simplemente hacer transliteración. Vea mi respuesta de Retina para más información sobre transliteración.
Pruébalo en línea.
Explicación
fuente
Python 3, 44 bytes
Originalmente solía
256^3
, entonces16^6
. Luego vi Pietu19988^8
y ahora esta solución usa eso en su lugar.fuente
Java,
9590 bytesBitwise XOR.
fuente
Bash + tr, 35 bytes
La salida siempre es minúscula.
Desafortunadamente "tr" no toma rangos en orden inverso, así que tuve que explicarlos.
fuente
C, 147 bytes
Usé strtol para convertir de hexadecimal a int y luego restamos el número de 255 para obtener el cumplido como decía la publicación original. Sin embargo, me pregunto si hay una manera de pasar un rango de caracteres de s a strtol para no tener que desperdiciar un montón de bytes copiando a una nueva cadena.
fuente
void
tipo de retorno.R, 62 bytes
fuente
sed, 48 bytes
O 36 bytes si solo necesita admitir un caso.
fuente
0
en tu código, entre9
yA
(el conteo de bytes es correcto, sin embargo, debe ser un error de copia).PowerShell, 48 bytes
Necesariamente toma la entrada vía
param($a)
como una cadena, delimitada con'
o"
, ya queC:\Tools\Scripts\Golfing> .\complementary-colors #a1b2c3
en la línea de comando de PowerShell se tratará#a1b2c3
como un comentario y la ignorará sumariamente.De izquierda a derecha, los
"#{0:x6}"-f(...)
formatos de nuestros cálculos de salida vuelven a ser hexadecimales con 6 caracteres garantizados (para tener en cuenta la entrada#ffffff
). Dentro de los parens, restamos nuestro número de entrada0xffffff
. Hacemos esto aprovechando el hecho de que PowerShell analiza los números hexadecimales en formato0xNNN
, por lo que construimos un número hexadecimal de formato adecuado a partir de nuestro número de entrada$a
. (Tenga en cuenta que la concatenación plus.Trim()
es más corta que.Replace()
aquí en un byte). También aprovechamos elMB
operador unario a través16MB-1
de construir en16777215
lugar de0xffffff
.fuente
TeaScript, 24 bytes
Los errores en el intérprete no me permiten acortar esto :(
Pruébalo en línea
fuente