颜色RGB int到十六进制


13

给定三个整数rgb,将十六进制表示形式输出为字符串。

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

最短的最非常规代码获胜


16
我们的常见问题解答说,该网站上的所有问题...都应有一个客观的主要获胜标准,这样就可以毫无疑问地确定哪个入围者应该获胜。。最短的时间是客观的,但“最不合常规的”不是。另外,只有在获胜条件只是最短的代码时,才应使用代码高尔夫球标签;并且仅在不使用代码高尔夫标记的情况下才应使用代码挑战标记。
彼得·泰勒

并在一段时间(在这种情况下甚至不是24小时)之前接受获胜者,这会阻止进一步的贡献……
woliveirajr

@PeterTaylor对不起,我从现在开始一定要阅读指南:(我想你是对的非正统
观念

Answers:


14

Ruby:19个字符

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

样品运行:

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

16

红宝石

对于“非正统”部分,我要付出更多。;)

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

这是天才!
艾伯特·伦肖2015年

6

q / k(3个字符)

不完全是非正统的,但很短

4h$

q)4h$ 72 61 139
0x483d8b

为了完全匹配问题中的输出格式,我们可以做(9个字符):

"#",/$4h$

1
这缺少了问题中每个示例输出所需的井号(#)。
Iszi 2013年

5

PowerShell:71 52 51 41

感谢@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个字符。
manatwork

@manatwork我认为这不是foreachPowerShell中a的正确语法。(至少,我无法进行一些测试运行。)但是,使用正确的语法,内置别名和我最近发现的另一个PowerShell快捷方式,我认为我的工作状况有所改善建议再减少12个字符。(1..3)|%{...}(在现有脚本中插入带括号的语句来代替省略号。)我仍然需要在脚本中对此进行全面测试,但是感谢您指出这一方向!
Iszi 2013年

不知道它是否是正确的语法,但是SS64参考foreach提到了它,并且对我有用。(不知道版本。Windows7附带的版本。)
manatwork 2013年

@manatwork很有意思。我想再次挖掘一下,找出更多的问题(我收到了“意外的令牌'in'...”错误。)。SS64文章可能是为其他版本的PowerShell写的-我不确定。现在,我已经确认可以(1..3)|%正常工作并将脚本缩减为56个字符。我将其编辑为答案,并且绝对会相信您的想法。再次感谢!
Iszi 2013年

2
天啊 您可以使用-join以下命令将其设置为41 '#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
乔伊

4

bash 22 21个字符

(感谢@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

添加了2015-10-06:bash(更多非传统方法)84 83个字符

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'>&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"

这将显示一个浏览器窗口,其中包含:

RGB int 2十六进制查看器转换器

您可以在这里滚动鼠标滚轮来更改值(按住Shift键的同时按15步)...


实际上,不要求终止换行符,只需要转义“#” printf \#%02X%02X%02X就足够了。
manatwork 2013年

添加了更非传统的方法
F. Hauri 2015年

大声笑。这种内在循环确实是令人震惊的非常规的。
manatwork 2015年

@manatwork感谢,我发现d+=${c[$b$a 0x10]}一些性感
F. Hauri 2015年

1
...或者也许d+=${c[$b$a 020]}会做得很好看上去很好
F. Hauri 2015年

3

Perl,31个字符

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

很难使这样一个简短的程序变得非常规,但我认为这可行。


我喜欢这个答案:)还有更多,如果没有更好的选择,我想我可能会解决。
Quillion

凉!只是一个unpack问题:是否可以像问题中那样将十六进制a..f大写?
manatwork

@manatwork我试图在内部找到一种方法unpack,但是没有运气。一种方法是使用sprintf代替unpack,但这是更长且完全是正统的。另一种方法是将字符串修改为大写:map{uc unpack H2,chr},但要花三个字符。
面包箱

谢谢@breadbox。那些棘手的小东西packunpack永远不会进入我的编码风格。所以这对我来说已经足够了。
manatwork

计数错误。这赚了30个字符!
F. Hauri 2013年


3

Perl 24个字符

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

例如,它不是较短的版本,但我喜欢它!(注意使用randrandering这个:-)

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

3

> <> 103 60

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

利用浪费的空白,并将一些代码移入其中

使用命令行输入运行:

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

输出:“#FF2448”


将根据要求提供解释。如果您能弄清楚,我宁愿不打扰
Cruncher

2

第四十二个字符

: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL

对于1 1 1不起作用,应该输出#010101
棘轮怪胎

嗨@ratchetfreak。这个对我有用。刚刚用gforth进行了测试。给它1 1 1输出#010101。任何其他值0-255也可以使用。您正在使用什么环境?
达伦·斯通

2

C(67个字符,没有主样板)

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

沼泽标准printf和bit twiddler用法


等等,readf?那不是scanf吗?
面包箱

@breadbox啊,是的,我在D中花了太多时间;两种方式的字符数都没有区别
棘轮怪胎

2

直流电:35 32个字符

[#]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

直流电:27个 24个字符

(但需要在单独的行上输入数字。)

[#]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

2
dc该网站上没有足够的答案。
面包箱

2

JavaScript,89个字符

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

转换72 61 139256*(256*(72)+61)+139和evals它。


不错,但在问题中发布的第三个样本中失败。
manatwork

啊,打个好电话。固定。
Casey Chu

2
使用eval('(('+DEC.replace(/ /g,'<<8)+'))而不是eval('256*(256*('+DEC.replace(/ /g,')+'))让您节省5个字符!
F. Hauri

2

PowerShell,45岁

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

或者,如果可以通过管道传输来使用它,则可以使用

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

这使其降至42


干得好!显示我仍然有很多关于高尔夫的知识!
Iszi 2013年

哦,您对变量的想法也很聪明;永远不会忘记我的想法。碰巧的是,它比我通常喜欢的时间更长:-split-join
乔伊

2

Powershell的37

感谢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"
AdmBorkBork

@TimmyD不知道在我测试的版本(xp中的iirc 2.0)中没有[byte]的情况下,删除[byte]是否在所有版本中均能正常工作,它不是串联为十六进制,而是整数,即72 61 139是#7261139不是#483d8b引号内的“#$ o”不是字符串文字,但对字符串进行了评估很高兴知道,谢谢您对十六进制转换的评论将不胜感激
blabb 2015年

显然,PowerShell v2和v3之间存在差异-必须在相应的.NET版本如何处理十六进制转换方面有所不同,但我找不到有关它的文档。
AdmBorkBork 2015年

2

R,16个字节

而已。使用内置的。

rgb(r,g,b,m=255)

1

C,67 73个字符(65个字符,不包括主字符)

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

无聊的C程序-非常正统。


不适用于小于16的a或c
棘轮怪胎

将%X更改为%02X。
伊恩·詹姆斯

1

Python 2.7(80个字符)

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

我正在寻找一种更好的方法来处理一位数的十六进制值。有任何想法吗?


也许使用格式字符串?'%02x'似乎是其他所有人所做的。
jqblz 2015年

1

Befunge-98,45个字符

Bleh,重复的代码。那好吧。只是基数转换的简单实现。

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

样品运行

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

(注意:在读取输入之前打印'#'-任务不禁止这样做;在stdin上给定三个数字,它将在stdout上产生正确的输出。它也不会打扰换行符,如您所见,它不会“以交互方式运行”时,不能正确添加“#”。)


1

游戏制作者语言,175(位置81错误)

提示输入3到9位RGB。返回带有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

使它成为脚本。另外,使用未初始化的变量作为0进行编译。

资源


1

Gema,93个字符

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

样品运行:

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

1

滑稽,12字节(小写为10字节)

如果还允许小写,则为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}

1

Powershell,28个字节

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

测试脚本:

$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"
}

输出:

True: #483D8B
True: #4B0082
True: #00FF7F

0

Python3.3 @ 60个字符

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

无法抗拒:

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

0

Clojure 76个字符

为了完整起见,这可能太迟了:

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

示例调用:

(hexy 0 255 127)
"#00FF7F"

0

Mathematica,40个字符

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

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

f /@ rgbs // Column

#483d8b

#4b0082

#00ff7f


0

Common Lisp,39个字符

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

读取三个整数,返回一个字符串。


0

Javascript ES6,63个字节

h=>'#'+h.split` `.map(x=>(x<16?0:'')+(x*1).toString(16)).join``

巧合的是,我最终在看到您之前写了几乎与您完全相同的东西。非常好=)它们足够接近,我不会在这里发布我的消息,但是您可以使用以下方法在映射中保存一些字节:x=>(x<16?0:'')+x.toString(16)
Mwr247

1
此外,无需r=一开始就包含。它甚至仍然可以算作一个匿名函数,因为您无需分配任何内容就可以调用它。
Mwr247

哎呀 表示地图应该是:x=>(x<16?0:'')+(x*1).toString(16)您和我的第一个地图目前为给出了错误的值x>9
Mwr247

当前返回#7261139而不是#483D8B第一个测试用例。
丹尼斯

0

Python 2,40个字节

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

从三个单独的行读取输入。滥用exec和字符串乘法。

用法示例:

$ python2 rgbint.py
72
61
139
#483D8B

$ python2 rgbint.py
75
0
130
#4B0082

$ python2 rgbint.py
0
255
127
#00FF7F

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.