给定三个整数rgb,将十六进制表示形式输出为字符串。
Input: Output:
72 61 139 #483D8B
75 0 130 #4B0082
0 255 127 #00FF7F
最短的最非常规代码获胜
给定三个整数rgb,将十六进制表示形式输出为字符串。
Input: Output:
72 61 139 #483D8B
75 0 130 #4B0082
0 255 127 #00FF7F
最短的最非常规代码获胜
Answers:
对于“非正统”部分,我要付出更多。;)
10;a= gets. split
. map {| x| #x
"%02X" %( x. to_i)
}; $> << ?# << a[
00 .. 1+2]. join;
(在我的网络浏览器上)该字体有点高,因此看起来变形,但是在Courier New中看起来更好:
样品运行:
c:\a\ruby>rgb2hex
255 100 0
#FF6400
不完全是非正统的,但很短
4h$
例
q)4h$ 72 61 139
0x483d8b
为了完全匹配问题中的输出格式,我们可以做(9个字符):
"#",/$4h$
感谢@manatwork指出
ForEach-Object
可以代替for
循环使用。
感谢@Joey指出我可以-join
在循环输出中使用,而不必将其放入变量中。
高尔夫代码:
'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
注意:
这里没有错误检查无效输入。脚本将愉快地将256、4096和65536作为输入,然后输出#100100010000(显然不能作为RGB工作)。
取消评论,并附上评论:
# 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)
减少到68个字符。
foreach
PowerShell中a的正确语法。(至少,我无法进行一些测试运行。)但是,使用正确的语法,内置别名和我最近发现的另一个PowerShell快捷方式,我认为我的工作状况有所改善建议再减少12个字符。(1..3)|%{...}
(在现有脚本中插入带括号的语句来代替省略号。)我仍然需要在脚本中对此进行全面测试,但是感谢您指出这一方向!
foreach
提到了它,并且对我有用。(不知道版本。Windows7附带的版本。)
(1..3)|%
正常工作并将脚本缩减为56个字符。我将其编辑为答案,并且绝对会相信您的想法。再次感谢!
-join
以下命令将其设置为41 '#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
。
(感谢@manatwork使用1个字符\
而不是双引号)
printf \#%02X%02X%02X 12 12 12
#0C0C0C
或循环读取STDIN:48个字符:
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
我知道,020
写的地方可能是82个字符16
,但我更喜欢这个……或者也许d+=${c[$b$a 0x10]}
是第一篇。
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"
这将显示一个浏览器窗口,其中包含:
您可以在这里滚动鼠标滚轮来更改值(按住Shift键的同时按15步)...
printf \#%02X%02X%02X
就足够了。
d+=${c[$b$a 0x10]}
一些性感!
d+=${c[$b$a 020]}
会做得很好,看上去很好
perl -nE 'say"#",map{unpack H2,chr}split'
很难使这样一个简短的程序变得非常规,但我认为这可行。
unpack
问题:是否可以像问题中那样将十六进制a..f大写?
unpack
,但是没有运气。一种方法是使用sprintf
代替unpack
,但这是更长且完全是正统的。另一种方法是将字符串修改为大写:map{uc unpack H2,chr}
,但要花三个字符。
pack
,unpack
永远不会进入我的编码风格。所以这对我来说已经足够了。
perl -ne 'printf"#"."%02x"x3,split'
13 31 133
#0d1f85
抱歉,没有使用来得性感unpack
,但要短一些!
但是,如果您真的喜欢使用unpack
,则可以:
$==24;s/\d+[\n ]*/{$=-=8;($&<<$=).do{rand>.5?qw<+>[0]:"|"}}/eg;$_=
pack("N",eval($_.587.202.560));say$1,unpack("H6",$2)if/^(.)(.*)$/s
例如,它不是较短的版本,但我喜欢它!(注意使用rand
的randering这个:-)
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
[#]n16o?ShShSh[Lhd16/n16%n]ddxxx
样品运行:
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
(但需要在单独的行上输入数字。)
[#]n16o[?d16/n16%n]ddxxx
样品运行:
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
该网站上没有足够的答案。
JavaScript,89个字符
console.log('#' + ('00000' + eval('256*(256*(' + DEC.replace(/ /g, ')+')).toString(16)).slice(-6))
转换72 61 139
到256*(256*(72)+61)+139
和evals它。
eval('(('+DEC.replace(/ /g,'<<8)+'))
而不是eval('256*(256*('+DEC.replace(/ /g,')+'))
让您节省5个字符!
'#'+-join(-split(read-host)|%{'{0:X2}'-f+$_})
或者,如果可以通过管道传输来使用它,则可以使用
'#'+-join(-split"$input"|%{'{0:X2}'-f+$_})
这使其降至42。
-split
和-join
。
感谢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]
,因为我们给出的输入为整数,编辑您的输出为"#$o"
- ,让31个字节$args|%{$o+="{0:X2}"-f$_};"#$o"
x=lambda y: ("0"+hex(int(y))[2:])[-2:]
print "#"+''.join(map(x,input().split()))
我正在寻找一种更好的方法来处理一位数的十六进制值。有任何想法吗?
如果还允许小写,则为10个字节:
psb6\['#+]
用法:
blsq ) "72 61 139"psb6\['#+]
"#483d8b"
如果您急需大写字母,请添加ZZ
:
blsq ) "72 61 139"psb6\['#+]ZZ
"#483D8B"
如果没有收到字符串中的整数,请继续:
blsq ) {72 61 139}b6\['#+]
"#483d8b"
说明:
ps -- parse string
b6 -- to hex
\[ -- concat
'#+] -- prepend #
奖金:
要转换回它,请使用以下命令:
blsq ) "#483d8b"[-2cob6
{72 61 139}
h=>'#'+h.split` `.map(x=>(x<16?0:'')+(x*1).toString(16)).join``
x=>(x<16?0:'')+x.toString(16)
r=
一开始就包含。它甚至仍然可以算作一个匿名函数,因为您无需分配任何内容就可以调用它。
x=>(x<16?0:'')+(x*1).toString(16)
您和我的第一个地图目前为给出了错误的值x>9
。
#7261139
而不是#483D8B
第一个测试用例。
'#'+''.join([hex(int(i))[2:].upper() for i in input()])