Color RGB int a hexadecimal

13

Dados tres enteros rgb, la representación hexadecimal de salida como una cadena.

Input:          Output:
72 61 139       #483D8B
75 0 130        #4B0082
0 255 127       #00FF7F

El código más corto y menos ortodoxo gana

Quillion
fuente
16
Nuestras preguntas frecuentes dicen que todas las preguntas en este sitio ... deben tener un criterio objetivo primario ganador, de modo que sea posible decidir indiscutiblemente qué participación debe ganar. . El más corto es objetivo, pero el "más heterodoxo" no lo es. Además, la etiqueta de código de golf debe usarse solo si la condición ganadora es solo el código más corto; y la etiqueta de desafío de código debe usarse solo si la etiqueta de golf de código no lo es.
Peter Taylor
y aceptar al ganador antes de algún tiempo (en este caso, ni siquiera era 24 horas) desalienta más contribuciones ...
woliveirajr
@PeterTaylor Lo siento, me aseguraré de leer las directrices a partir de ahora :( Creo que tienes razón, no ortodoxo es muy vago
Quillion

Respuestas:

14

Rubí: 19 caracteres.

$_=?#+"%02X"*3%$F

Ejecución de muestra:

bash-4.1$ ruby -pae '$_=?#+"%02X"*3%$F' <<< '72 61 139'
#483D8B

bash-4.1$ ruby -pae '$_=?#+"%02X"*3%$F' <<< '75 0 130'
#4B0082

bash-4.1$ ruby -pae '$_=?#+"%02X"*3%$F' <<< '0 255 127'
#00FF7F
hombre trabajando
fuente
16

Rubí

Iba más por la parte "poco ortodoxa". ;)

10;a=    gets.   split
.  map  {|       x|  #x
"%02X"  %(  x.   to_i)
}; $>   <<   ?#  <<  a[
00  ..   1+2].   join;

La fuente (en mi navegador web) es un poco alta, por lo que se ve distorsionada, pero se ve mejor en Courier New:

imagen

Ejecución de muestra:

c:\a\ruby>rgb2hex
255 100 0
#FF6400
Pomo de la puerta
fuente
Esto es genial!
Albert Renshaw
6

q / k (3 caracteres)

No exactamente poco ortodoxo, pero bastante corto.

4h$

Ejemplo

q)4h$ 72 61 139
0x483d8b

Para que coincida exactamente con el formato de salida en la pregunta, podemos hacer (para 9 caracteres):

"#",/$4h$
skeevey
fuente
1
Le falta el signo de número (#) requerido por los resultados de muestra en la pregunta.
Iszi
5

Potencia Shell: 71 52 51 41

Gracias a @manatwork por señalar, ForEach-Objectse puede usar en lugar de un forbucle.
Gracias a @Joey por señalar que podría usar -joinen la salida del bucle, en lugar de tener que ponerlo en variables.

Código de golf:

'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})

Nota:

No hay ningún error al verificar aquí las entradas no válidas. El script felizmente tomará 256, 4096 y 65536 como entradas, luego la salida # 100100010000 (que obviamente no funcionará como RGB).

Sin golf, con comentarios:

# Put a hashtag in front of the output.
'#'+

# Join the nested code into one string.
-join(

    # Pipe 1..3 to ForEach-Object to run a loop three times.
    1..3|%{

        # Take user input and format it as hex, with minimum two digits in output.
        "{0:X2}"-f+(read-host)
    }
)
Iszi
fuente
Haz el bucle foreach($i in 1,2,3)para reducirlo a 68 caracteres.
manatwork
@manatwork No creo que esa sea la sintaxis adecuada para un foreachen PowerShell. (Al menos, no he podido hacer que funcionen algunas pruebas). Sin embargo, usando la sintaxis correcta, un alias incorporado y otro acceso directo de PowerShell que descubrí recientemente, creo que tengo algo mejor, afeitarme otros 12 caracteres de su sugerencia. (1..3)|%{...}(Inserte una declaración entre corchetes del guión existente en lugar de los puntos suspensivos). Todavía necesito probar esto completamente en el guión, ¡pero gracias por señalarme en esa dirección!
Iszi
No tengo idea de si es la sintaxis adecuada o no, pero la referencia SS64 lo foreachmenciona y funciona para mí. (No tengo idea de la versión. La que vino con Windows 7.)
manatwork
@manatwork Eso es interesante. Me gustaría investigar un poco más y descubrir qué hay de malo en eso (estaba recibiendo errores de "token inesperado '...') en otro momento. Es posible que el artículo SS64 haya sido escrito para una versión diferente de PowerShell. No estoy seguro. Por ahora, he confirmado que (1..3)|%funciona y reduce el guión a 56 caracteres. Lo editaré en la respuesta y definitivamente te daré crédito por la idea. ¡Gracias de nuevo!
Iszi
2
Oh dang Se puede conseguir que esto mediante el uso de 41 -join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
Joey
4

bash 22 21 caracteres

(Gracias @manatwork por 1 carácter usando en \lugar de comillas dobles)

printf \#%02X%02X%02X 12 12 12 
#0C0C0C

o leyendo STDIN en un bucle: 48 caracteres:

while read f;do printf "#%02X%02X%02X\n" $f;done <<<$'72 61 139\n75 0 130\n0 255 127'
#483D8B
#4B0082
#00FF7F

Añadido 2015-10-06: bash ( método más poco ortodoxo ) 84 83 caracteres

c=({0..9} {a..f}) d=\#;for b;do for a in / %;do d+=${c[$b$a 020]};done;done;echo $d

Lo sé, podrían ser 82 caracteres si están 020escritos 16, pero prefiero esto ... O tal vez d+=${c[$b$a 0x10]}cuál fue la primera publicación.

hexcolor() {
    local a b c=({0..9} {a..f}) d=\#
    for b ;do
        for a in / % ;do
            d+=${c[$b$a 0x10]}
        done
    done
    echo $d
}
hexcolor 72 61 139
#483d8b
hexcolor 75 0 130
#4b0082
hexcolor 0 255 127
#00ff7f

Otro enfoque

#!/bin/bash
browser=firefox   #  google-chrome iceweasel
url="data:text/html;charset=UTF-8,<html><head></head><body>"
url+="<script type='text/javascript'>
  function h(i){var h=i.toString(16);if(16>1*i)h='0'+h;
  return h};function C(r,g,b){return'\043'+h(r)+h(g)+h(b)};
  function m(){ var r=1.0*R.value; var g=1.0*G.value; var b=1.0*B.value;
   var fore='black';if(384>r+g+b)fore='white';var c=C(r,g,b);
   s.setAttribute('style','background:'+c+';color:'+fore+';');s.innerHTML=c};
  function w(e){console.log(e);var val=e.target.value;var q=1;if(e.shiftKey)
  q=15;if(e.detail){if(e.detail>0){q=0-q;}}else if(0>e.wheelDelta){q=0-q;};
  val=1*val+q;if(val>255)val=255;if(0>val)val=0;e.target.value=val;m(); };
  function k(e){console.log(e);var val=e.target.value;var q=1;if(e.shiftKey)q=
  15;if(e.keyCode==38){val=1*val+q;if(val>255)val=255;e.target.value=val;m();}
  else if(e.keyCode==40){val=1*val-q;if(0>val)val=0;e.target.value=val;m();}};
  function n(){R=document.getElementById('R');G=document.getElementById('G');
    B=document.getElementById('B');s=document.getElementById('s');
    R.addEventListener('DOMMouseScroll',w);R.addEventListener('mousewheel',w);
    G.addEventListener('DOMMouseScroll',w);G.addEventListener('mousewheel',w);
    B.addEventListener('DOMMouseScroll',w);B.addEventListener('mousewheel',w);
  m();};var R, G, B, s;window.onload=n;
  </script><style>div{display:inline-block;width:10em;}</style>
  <div id='s'>&nbsp;</div>"
input="%s:<input type='text' size='5' value='200'"
input+=" onKeyDown='k(event)' onChange='m()' id='%s' />"
for c in R G B ;do
    printf -v add "$input" $c $c
    url+="$add"
  done    
$browser "$url"

Esto mostrará una ventana del navegador, con:

Convertidor visor RGB int 2 hexadecimal

Donde podría girar la rueda del mouse para cambiar los valores (con la tecla Mayús presionada para el paso 15) ...

F. Hauri
fuente
En realidad, la nueva línea de terminación no se solicitó y solo "#" necesita escapar, por lo que printf \#%02X%02X%02Xes suficiente.
manatwork
Se agregó un método menos ortodoxo :
F. Hauri
Jajaja Ese circuito interno es de hecho sorprendentemente poco ortodoxo.
manatwork
@manatwork gracias, ¡encuentro d+=${c[$b$a 0x10]}algo sexy !
F. Hauri
1
... o tal vez d+=${c[$b$a 020]}hará el trabajo y se verá bien
F. Hauri
3

Perl, 31 caracteres

perl -nE 'say"#",map{unpack H2,chr}split'

Es difícil hacer que un programa tan corto no sea ortodoxo, pero creo que esto funciona.

caja de pan
fuente
Me gusta esta respuesta :) un poco más y creo que podría decidirme si no hay nada mejor.
Quillion el
¡Frio! Solo una unpackpregunta: ¿puedes hacer que el hexadecimal sea ... mayúscula, como en la pregunta?
manatwork
@manatwork Intenté encontrar una manera de hacerlo dentro unpack, pero no tuve suerte. Una forma es usar en sprintflugar de unpack, pero eso es más largo y completamente ortodoxo. La otra forma es simplemente modificar la cadena a mayúsculas: map{uc unpack H2,chr}a un costo de tres caracteres.
breadbox
Gracias, @breadbox. Esos pequeños tramposos packy unpacknunca entran en mi estilo de codificación. Entonces es poco ortodoxo para mí.
manatwork
Cuenta equivocada. ¡Esto hace 30 char!
F. Hauri
3

Guión de acción 3 | 43 caracteres

trace("#"+(72<<16|61<<139|b).toString(16));

Salida: #483D8B

Ilya Gazman
fuente
¿No puedes dejar mucho espacio en blanco aquí? No sé Action Script, pero no parecen necesarios
Cruncher
@Cruncher, sí, lo siento, una de mis primeras respuestas aquí.
Ilya Gazman
2
Mata el punto y coma al final para salvar un char
Doorknob
3

Perl 24 caracteres

perl -ne 'printf"#"."%02x"x3,split'
13 31 133
#0d1f85

Lo sentimos, no es tan sexy como usar unpack, ¡pero es más corto!

Versión más oscura:

Pero si realmente prefiere usar unpack, entonces podría:

$==24;s/\d+[\n ]*/{$=-=8;($&<<$=).do{rand>.5?qw<+>[0]:"|"}}/eg;$_=
pack("N",eval($_.587.202.560));say$1,unpack("H6",$2)if/^(.)(.*)$/s

Por ejemplo, no es la versión más corta, ¡pero me gusta! (Tenga en cuenta el uso de randpara ordenar esto :-)

perl -nE '
    $==24;s/\d+[\n ]*/{$=-=8;($&<<$=).
    do{rand>.5?qw<+>:"|"}}/eg;$_=pack(
    "N",eval($_.587.202.560) );say $1,
    unpack("H"."6",$2) if /^(.)(.*)$/s
  ' <<< $'72 61 139\n75 0 130\n0 255 127'
#483d8b
#4b0082
#00ff7f
F. Hauri
fuente
3

> <> 103 60

"#"or>1[:82*%:}-82*,86*+:"9"v
    ;^?l ]o+*7)"9":+*68o+*7)<

Hizo uso del espacio en blanco desperdiciado y moví un poco de código

Ejecutar con entradas de línea de comando:

python fish.py generateHex.fish -v 255 36 72

salida: "# FF2448"

Cruncher
fuente
Proporcionará una explicación a petición. Si puedes resolverlo, prefiero no molestarme
Cruncher
2

Adelante, 62 caracteres

: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL
Piedra de Darren
fuente
no funciona para 1 1 1, que es la Salida # 010101
monstruo de trinquete
Hola @ratchetfreak. Esto funciona para mi. Acabo de probar con gforth. Dándole 1 1 1salidas #010101. Cualquier otro valor 0-255 también funciona. ¿Qué ambiente o más estás usando?
Darren Stone
2

C (67 caracteres sin placa principal)

int r,g,b;
scanf("%d %d %d",&r,&b,&g);
printf("#%06x",r<<16|g<<8|b);

el uso estándar de twiddler de printf & bit

monstruo de trinquete
fuente
Espera, readf? ¿No debería ser eso scanf?
breadbox
@breadbox ah, sí, pasé demasiado tiempo en D; De cualquier manera hay diferencia en el recuento de carbón
monstruo de trinquete
2

Dc: 35 32 caracteres

[#]n16o?ShShSh[Lhd16/n16%n]ddxxx

Ejecución de muestra:

bash-4.1$ dc -e '[#]n16o?ShShSh[Lhd16/n16%n]ddxxx' <<< '72 61 139'
#483D8B

bash-4.1$ dc -e '[#]n16o?ShShSh[Lhd16/n16%n]ddxxx' <<< '75 0 130'
#4B0082

bash-4.1$ dc -e '[#]n16o?ShShSh[Lhd16/n16%n]ddxxx' <<< '0 255 127'
#00FF7F

Dc: 27 24 caracteres

(Pero necesita los números de entrada en líneas separadas).

[#]n16o[?d16/n16%n]ddxxx

Ejecución de muestra:

bash-4.1$ dc -e '[#]n16o[?d16/n16%n]ddxxx' <<< $'72\n61\n139'
#483D8B

bash-4.1$ dc -e '[#]n16o[?d16/n16%n]ddxxx' <<< $'75\n0\n130'
#4B0082

bash-4.1$ dc -e '[#]n16o[?d16/n16%n]ddxxx' <<< $'0\n255\n127'
#00FF7F
hombre trabajando
fuente
2
No hay suficientes dcrespuestas en este sitio web.
breadbox
2

JavaScript, 89 caracteres

console.log('#' + ('00000' + eval('256*(256*(' + DEC.replace(/ /g, ')+')).toString(16)).slice(-6))

Convierte 72 61 139a 256*(256*(72)+61)+139y evals TI.

Casey Chu
fuente
Buena, pero falla en la tercera muestra publicada en la pregunta.
manatwork
Ah, buena llamada. Fijo.
Casey Chu el
2
¡Usar en eval('(('+DEC.replace(/ /g,'<<8)+'))lugar de eval('256*(256*('+DEC.replace(/ /g,')+'))permitirle guardar 5 caracteres!
F. Hauri
2

PowerShell, 45

'#'+-join(-split(read-host)|%{'{0:X2}'-f+$_})

O, si se puede usar canalizando los datos, simplemente puede usar

'#'+-join(-split"$input"|%{'{0:X2}'-f+$_})

lo que lo reduce a 42 .

Joey
fuente
¡Buen trabajo! ¡Muestra que todavía tengo mucho que aprender sobre el golf!
Iszi
Oh, tu idea con las variables también fue inteligente; nunca me hubiera pasado por la cabeza. Sucede que es más largo que mi favorito habitual: -splity -join.
Joey
2

PowerShell 37

guardado un byte gracias a TimmyD

cat rgb2hex.ps1
$args|%{$o+="{0:X2}"-f[byte]$_};"#$o"
wc -c rgb2hex.ps1
38 rgb2hex.ps1
powershell -f .\rgb2hex.ps1 72 61 139
#483D8B
powershell -f .\rgb2hex.ps1 0 255 127
#00FF7F
blabb
fuente
Puede guardar un par de bytes deshaciéndose del [byte]dado que se nos da la entrada como números enteros, y edite su salida para que sea "#$o"- eso da 31 bytes para$args|%{$o+="{0:X2}"-f$_};"#$o"
AdmBorkBork
@TimmyD no sabe si eliminar [byte] funciona correctamente en todas las versiones en una versión en la que probé (iirc 2.0 en xp) sin [byte] no estaba concatenando como hexadecimal, sino como ints, es decir, 72 61 139 fue # 7261139 no # 483d8b "# $ O" cotizaciones dentro tampoco un literal de cadena, pero evaluado cordaje que saber gracias comentarios acerca de la conversión hexadecimal se apreciará
blabb
Aparentemente, es una diferencia entre PowerShell v2 y v3: debe ser algo en cómo la versión correspondiente de .NET maneja la conversión hexadecimal, pero no puedo encontrar documentación al respecto.
AdmBorkBork
2

R, 16 bytes

Eso es. Utiliza el incorporado.

rgb(r,g,b,m=255)
J.Doe
fuente
1

C, 67 73 caracteres (65 caracteres excluyendo principal)

main(){int a,b,c;scanf("%d%d%d",&a,&b,&c);printf("#%02X%02X%02X",a,b,c);}

Programa aburrido C - muy ortodoxo.

Ian James
fuente
no funciona con ab o c menor que 16
monstruo de trinquete
Cambiado% X a% 02X.
Ian James
1

Python 2.7 (80 caracteres)

x=lambda y: ("0"+hex(int(y))[2:])[-2:]
print "#"+''.join(map(x,input().split()))

Estoy buscando una mejor manera de manejar los valores hexadecimales de un solo dígito. ¿Algunas ideas?

Will Coggins
fuente
¿Quizás usar cadenas de formato? '% 02x' parece ser lo que todos los demás han hecho.
jqblz
1

Befunge-98, 45 caracteres

Bleh, código duplicado. Oh bien. Solo una implementación sencilla de conversión de radix.

"#",v
7*+,>#@&:97+/"0"+:"9"`7*+,97+%"0"+:"9"`

Ejecución de la muestra

% cfunge tohex.98 <<<'72 61 139'
#483D8B
% cfunge tohex.98
#75 0 130
4800820 255 127
00FF7F

(Nota: imprime '#' antes de leer la entrada --- la tarea no lo prohíbe; dado tres números en stdin produce el resultado correcto en stdout. Tampoco se molesta con las nuevas líneas, y como puede ver no 'agregue' # 'correctamente cuando se ejecute "interactivamente".)

Luciérnaga
fuente
1

Game Maker Language, 175 (Error en la posición 81)

Solicita RGB de 3 a 9 dígitos. Devuelve hexadecimal con signo hexadecimal GML,$

d=get_string('','')if(d=='')e=""else e="00"h="0123456789ABCDEF"while(d!=''){b=d&255i=string_char_at(h,byte div 16+1)l=string_char_at(h,byte mod 16+1)e+=i+l;d=d>>8}return '$'+e

Haz de esto un guión. Además, compile con variables no inicializadas tratadas como 0.

Fuente

Timtech
fuente
1

Gema, 93 caracteres

\B=@set{x;0123456789abcdef}\#
<D>=@substring{@div{$1;16};1;$x}@substring{@mod{$1;16};1;$x}
?=

Ejecución de muestra:

bash-4.3$ gema '\B=@set{x;0123456789abcdef}\#;<D>=@substring{@div{$1;16};1;$x}@substring{@mod{$1;16};1;$x};?=' <<< '0 255 127'
#00ff7f
hombre trabajando
fuente
1

Burlsque, 12 bytes (10 bytes para minúsculas)

Si también se permiten minúsculas, entonces 10 bytes:

psb6\['#+]

Uso:

blsq ) "72 61 139"psb6\['#+]
"#483d8b"

Si necesita desesperadamente mayúsculas, agregue ZZ:

blsq ) "72 61 139"psb6\['#+]ZZ
"#483D8B"

Si no recibe los enteros como en una cadena, vaya con:

blsq ) {72 61 139}b6\['#+]
"#483d8b"

Explicación:

ps -- parse string
b6 -- to hex
\[ -- concat
'#+] -- prepend #

Prueba en línea aquí .

Prima:

Para volver a convertirlo, use esto:

blsq ) "#483d8b"[-2cob6
{72 61 139}
mroman
fuente
1

Powershell, 28 bytes

'#{0:X2}{1:X2}{2:X2}'-f$args

Script de prueba:

$f = {

"#{0:X2}{1:X2}{2:X2}"-f$args
}

@(
    ,('#483D8B',72, 61, 139)
    ,('#4B0082',75,  0, 130)
    ,('#00FF7F',0 ,255, 127)
) | % {
    $e,$a = $_
    $r = &$f @a
    "$($r-eq$e): $r"
}

Salida:

True: #483D8B
True: #4B0082
True: #00FF7F
mazzy
fuente
0

Python3.3 @ 60 caracteres

print("#"+3*"%.2X"%tuple(int(n) for n in input().split())) 

No pude resistir:

[dan@danbook:code_golf/int_to_hex]$ python3.3 int_to_hex.py
176 11 30
#B00B1E
danmcardle
fuente
0

Clojure 76 Personajes

Esto podría ser tarde, en aras de la integridad:

(defn hexy [r g b] (reduce str (cons "#" (map #(format "%02X" %) [r g b]))))

Llamadas de ejemplo:

(hexy 0 255 127)
"#00FF7F"
Lynx Luna
fuente
0

Mathematica, 40 caracteres.

f = StringJoin["#", IntegerString[#, 16, 2]] &

rgbs = {{72, 61, 139}, {75, 0, 130}, {0, 255, 127}}

f /@ rgbs // Column

# 483d8b

# 4b0082

# 00ff7f

Chris Degnen
fuente
0

Lisp común, 39 caracteres

(format()"#~@{~2,'0x~}"#1=(read)#1##1#)

Lee tres enteros, devuelve una cadena.

volcado de memoria
fuente
0

Javascript ES6, 63 bytes

h=>'#'+h.split` `.map(x=>(x<16?0:'')+(x*1).toString(16)).join``
Mama Fun Roll
fuente
Casualmente, terminé escribiendo casi exactamente lo mismo que tú antes de ver el tuyo. Muy agradable =) Están lo suficientemente cerca como para que no publique el mío, pero puede guardar algunos bytes en su mapeo con esto:x=>(x<16?0:'')+x.toString(16)
Mwr247
1
Además, no es necesario incluir el r=al principio. Todavía cuenta como una función, incluso como una función anónima, ya que puede invocarla sin tener que asignar nada.
Mwr247
Whoops Significaba que el mapa era: el x=>(x<16?0:'')+(x*1).toString(16)tuyo y el primero allí dan valores incorrectos x>9.
Mwr247
Actualmente, esto regresa en #7261139lugar del #483D8Bprimer caso de prueba.
Dennis
0

Python 2, 40 bytes

s='#';exec's+="%02X"%input();'*3;print s

Lee la entrada de tres líneas separadas. Abusos execy multiplicación de cuerdas.

Ejemplo de uso:

$ python2 rgbint.py
72
61
139
#483D8B

$ python2 rgbint.py
75
0
130
#4B0082

$ python2 rgbint.py
0
255
127
#00FF7F
jqblz
fuente
0

Python (55 caracteres)

'#'+''.join([hex(int(i))[2:].upper() for i in input()])
Dhruv Ramani
fuente