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
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
$_=?#+"%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
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:
Ejecución de muestra:
c:\a\ruby>rgb2hex
255 100 0
#FF6400
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$
Gracias a @manatwork por señalar,
ForEach-Object
se puede usar en lugar de unfor
bucle.
Gracias a @Joey por señalar que podría usar-join
en 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)
}
)
foreach($i in 1,2,3)
para reducirlo a 68 caracteres.
foreach
en 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!
foreach
menciona y funciona para mí. (No tengo idea de la versión. La que vino con Windows 7.)
(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!
-join
: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
.
(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
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 020
escritos 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
#!/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'> </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:
Donde podría girar la rueda del mouse para cambiar los valores (con la tecla Mayús presionada para el paso 15) ...
printf \#%02X%02X%02X
es suficiente.
d+=${c[$b$a 0x10]}
algo sexy !
d+=${c[$b$a 020]}
hará el trabajo y se verá bien
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.
unpack
pregunta: ¿puedes hacer que el hexadecimal sea ... mayúscula, como en la pregunta?
unpack
, pero no tuve suerte. Una forma es usar en sprintf
lugar 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.
pack
y unpack
nunca entran en mi estilo de codificación. Entonces es poco ortodoxo para mí.
trace("#"+(72<<16|61<<139|b).toString(16));
Salida: #483D8B
perl -ne 'printf"#"."%02x"x3,split'
13 31 133
#0d1f85
Lo sentimos, no es tan sexy como usar unpack
, ¡pero es más corto!
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 rand
para 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
"#"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"
: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL
1 1 1
salidas #010101
. Cualquier otro valor 0-255 también funciona. ¿Qué ambiente o más estás usando?
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
readf
? ¿No debería ser eso scanf
?
[#]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
(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
dc
respuestas en este sitio web.
JavaScript, 89 caracteres
console.log('#' + ('00000' + eval('256*(256*(' + DEC.replace(/ /g, ')+')).toString(16)).slice(-6))
Convierte 72 61 139
a 256*(256*(72)+61)+139
y evals TI.
eval('(('+DEC.replace(/ /g,'<<8)+'))
lugar de eval('256*(256*('+DEC.replace(/ /g,')+'))
permitirle guardar 5 caracteres!
'#'+-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 .
-split
y -join
.
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
[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"
Eso es. Utiliza el incorporado.
rgb(r,g,b,m=255)
main(){int a,b,c;scanf("%d%d%d",&a,&b,&c);printf("#%02X%02X%02X",a,b,c);}
Programa aburrido C - muy ortodoxo.
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?
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".)
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.
\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
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 #
Prima:
Para volver a convertirlo, use esto:
blsq ) "#483d8b"[-2cob6
{72 61 139}
'#{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
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
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"
f = StringJoin["#", IntegerString[#, 16, 2]] &
rgbs = {{72, 61, 139}, {75, 0, 130}, {0, 255, 127}}
f /@ rgbs // Column
# 483d8b
# 4b0082
# 00ff7f
(format()"#~@{~2,'0x~}"#1=(read)#1##1#)
Lee tres enteros, devuelve una cadena.
h=>'#'+h.split` `.map(x=>(x<16?0:'')+(x*1).toString(16)).join``
x=>(x<16?0:'')+x.toString(16)
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.
x=>(x<16?0:'')+(x*1).toString(16)
tuyo y el primero allí dan valores incorrectos x>9
.
#7261139
lugar del #483D8B
primer caso de prueba.
s='#';exec's+="%02X"%input();'*3;print s
Lee la entrada de tres líneas separadas. Abusos exec
y 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
'#'+''.join([hex(int(i))[2:].upper() for i in input()])