Cho ba số nguyên rgb, xuất đại diện thập lục phân dưới dạng một chuỗi.
Input: Output:
72 61 139 #483D8B
75 0 130 #4B0082
0 255 127 #00FF7F
Mã ngắn nhất không chính thống nhất sẽ thắng
Cho ba số nguyên rgb, xuất đại diện thập lục phân dưới dạng một chuỗi.
Input: Output:
72 61 139 #483D8B
75 0 130 #4B0082
0 255 127 #00FF7F
Mã ngắn nhất không chính thống nhất sẽ thắng
Câu trả lời:
Tôi đã đi nhiều hơn cho phần "không chính thống". ;)
10;a= gets. split
. map {| x| #x
"%02X" %( x. to_i)
}; $> << ?# << a[
00 .. 1+2]. join;
Phông chữ (trên trình duyệt web của tôi) hơi cao, do đó trông có vẻ bị méo, nhưng nó có vẻ tốt hơn trong Courier New:

Chạy mẫu:
c:\a\ruby>rgb2hex
255 100 0
#FF6400
Cảm ơn @manatwork đã chỉ ra
ForEach-Objectcó thể được sử dụng thay choforvòng lặp.
Cảm ơn @Joey đã chỉ ra rằng tôi có thể sử dụng-jointrên đầu ra vòng lặp, thay vì phải đặt nó vào các biến.
Mã đánh gôn:
'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
Ghi chú:
Không có lỗi kiểm tra ở đây cho đầu vào không hợp lệ. Kịch bản sẽ vui vẻ lấy 256, 4096 và 65536 làm đầu vào, sau đó xuất # 100100010000 (rõ ràng là không hoạt động như RGB).
Ungolfed, với ý kiến:
# 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)để giảm xuống còn 68 ký tự.
foreachPowerShell. . 12 ký tự khác đề nghị của bạn. (1..3)|%{...}(Chèn câu lệnh được đặt trong ngoặc từ tập lệnh hiện tại thay cho dấu chấm lửng.) Tôi vẫn cần kiểm tra đầy đủ điều này trong tập lệnh, nhưng cảm ơn vì đã chỉ cho tôi theo hướng đó!
foreachđề cập đến nó và nó hoạt động với tôi. (Không có ý tưởng về phiên bản. Phiên bản đi kèm với Windows 7.)
(1..3)|%hoạt động và đưa kịch bản xuống còn 56 ký tự. Tôi sẽ chỉnh sửa câu trả lời đó và chắc chắn ghi nhận cho bạn ý tưởng. Cảm ơn một lần nữa!
-join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
(Cảm ơn @manatwork cho 1 char sử dụng \thay vì dấu ngoặc kép)
printf \#%02X%02X%02X 12 12 12
#0C0C0C
hoặc đọc STDIN trong một vòng lặp: 48 ký tự:
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
Tôi biết, nó có thể là 82 ký tự nếu 020được viết 16, nhưng tôi thích điều này ... Hoặc có thể d+=${c[$b$a 0x10]}đó là bài viết đầu tiê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"
Điều này sẽ hiển thị một cửa sổ trình duyệt, với:

Nơi bạn có thể cuộn con lăn chuột để thay đổi giá trị (với phím shift được giữ cho bước 15) ...
printf \#%02X%02X%02Xlà đủ.
d+=${c[$b$a 0x10]}một cái gì đó gợi cảm !
d+=${c[$b$a 020]}sẽ thực hiện công việc và trông thật tuyệt
perl -nE 'say"#",map{unpack H2,chr}split'
Thật khó để làm cho một chương trình ngắn như vậy không chính thống, nhưng tôi nghĩ rằng nó hoạt động.
unpackcâu hỏi: bạn có thể viết hoa thập lục phân a..f, như trong câu hỏi không?
unpack, nhưng không có may mắn. Một cách là sử dụng sprintfthay vì unpack, nhưng đó là lâu hơn và hoàn toàn chính thống. Một cách khác là chỉ sửa đổi chuỗi thành chữ hoa : map{uc unpack H2,chr}, với chi phí là ba ký tự.
packvà unpackkhông bao giờ đi vào phong cách mã hóa của tôi. Vì vậy, nó không chính thống đủ cho tôi.
trace("#"+(72<<16|61<<139|b).toString(16));
Đầu ra: #483D8B
perl -ne 'printf"#"."%02x"x3,split'
13 31 133
#0d1f85
Xin lỗi, nó không gợi cảm hơn sử dụng unpack, nhưng ngắn hơn!
Nhưng nếu bạn thực sự thích sử dụng unpack, thì bạn có thể:
$==24;s/\d+[\n ]*/{$=-=8;($&<<$=).do{rand>.5?qw<+>[0]:"|"}}/eg;$_=
pack("N",eval($_.587.202.560));say$1,unpack("H6",$2)if/^(.)(.*)$/s
Đối với mẫu, nó không phải là phiên bản ngắn hơn, nhưng tôi thích nó! (Lưu ý việc sử dụng randđể sắp xếp thứ này :-)
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)<
Tận dụng khoảng trắng bị lãng phí và chuyển một số mã vào đó
Chạy với đầu vào dòng lệnh:
python fish.py generateHex.fish -v 255 36 72
đầu ra: "# FF2448"
: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL
1 1 1đầu ra #010101. Bất kỳ giá trị nào khác 0-255 cũng hoạt động. Bạn đang sử dụng môi trường nào?
int r,g,b;
scanf("%d %d %d",&r,&b,&g);
printf("#%06x",r<<16|g<<8|b);
sử dụng twiddler tiêu chuẩn bog & bit
readf? Có nên như scanfvậy không?
[#]n16o?ShShSh[Lhd16/n16%n]ddxxx
Chạy mẫu:
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
(Nhưng cần các số đầu vào trên các dòng riêng biệt.)
[#]n16o[?d16/n16%n]ddxxx
Chạy mẫu:
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
dccâu trả lời trên trang web này.
JavaScript, 89 ký tự
console.log('#' + ('00000' + eval('256*(256*(' + DEC.replace(/ /g, ')+')).toString(16)).slice(-6))
Chuyển đổi 72 61 139để 256*(256*(72)+61)+139và evals nó.
eval('(('+DEC.replace(/ /g,'<<8)+'))thay vì eval('256*(256*('+DEC.replace(/ /g,')+'))để bạn tiết kiệm 5 ký tự!
'#'+-join(-split(read-host)|%{'{0:X2}'-f+$_})
Hoặc, nếu nó có thể được sử dụng bằng đường ống trong dữ liệu, bạn chỉ có thể sử dụng
'#'+-join(-split"$input"|%{'{0:X2}'-f+$_})
đưa nó xuống 42 .
-splitvà -join.
đã lưu một byte nhờ 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]vì chúng tôi đã cung cấp đầu vào dưới dạng số nguyên và chỉnh sửa đầu ra của bạn thành "#$o"- cung cấp 31 byte cho$args|%{$o+="{0:X2}"-f$_};"#$o"
main(){int a,b,c;scanf("%d%d%d",&a,&b,&c);printf("#%02X%02X%02X",a,b,c);}
Chương trình C nhàm chán - rất chính thống.
x=lambda y: ("0"+hex(int(y))[2:])[-2:]
print "#"+''.join(map(x,input().split()))
Tôi đang tìm kiếm một cách tốt hơn để xử lý các giá trị hex một chữ số. Có ý kiến gì không?
Bleh, mã trùng lặp. Ồ tốt Chỉ cần thực hiện đơn giản chuyển đổi cơ số.
"#",v
7*+,>#@&:97+/"0"+:"9"`7*+,97+%"0"+:"9"`
Chạy mẫu
% cfunge tohex.98 <<<'72 61 139'
#483D8B
% cfunge tohex.98
#75 0 130
4800820 255 127
00FF7F
(Lưu ý: in '#' trước khi đọc đầu vào --- tác vụ không cấm điều này, với ba số trên stdin, nó tạo ra đầu ra đúng trên thiết bị xuất chuẩn. Nó cũng không bận tâm với các dòng mới và như bạn có thể thấy nó không 't thêm' # 'đúng cách khi chạy "tương tác".)
Nhắc nhở cho 3 đến 9 chữ số RGB. Trả về thập lục phân với dấu thập lục phân 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
Làm cho điều này một kịch bản. Ngoài ra, biên dịch với các biến chưa được khởi tạo được xử lý là 0.
Nếu chữ thường được cho phép thì 10 byte:
psb6\['#+]
Sử dụng:
blsq ) "72 61 139"psb6\['#+]
"#483d8b"
Nếu bạn rất cần chữ hoa, hãy thêm ZZ:
blsq ) "72 61 139"psb6\['#+]ZZ
"#483D8B"
Nếu bạn không nhận được số nguyên như trong một chuỗi thì hãy đi với:
blsq ) {72 61 139}b6\['#+]
"#483d8b"
Giải trình:
ps -- parse string
b6 -- to hex
\[ -- concat
'#+] -- prepend #
Tặng kem:
Để chuyển đổi nó trở lại sử dụng này:
blsq ) "#483d8b"[-2cob6
{72 61 139}
print("#"+3*"%.2X"%tuple(int(n) for n in input().split()))
Không thể cưỡng lại:
[dan@danbook:code_golf/int_to_hex]$ python3.3 int_to_hex.py
176 11 30
#B00B1E
f = StringJoin["#", IntegerString[#, 16, 2]] &
rgbs = {{72, 61, 139}, {75, 0, 130}, {0, 255, 127}}
f /@ rgbs // Column
# 483d8b
# 4b0082
# 00ff7f
h=>'#'+h.split` `.map(x=>(x<16?0:'')+(x*1).toString(16)).join``
x=>(x<16?0:'')+x.toString(16)
r=lúc đầu. Nó vẫn được tính là một hàm ngay cả khi là một hàm ẩn danh, vì bạn có thể gọi nó mà không phải gán bất cứ thứ gì.
x=>(x<16?0:'')+(x*1).toString(16)Bạn và người đầu tiên của tôi hiện đang đưa ra các giá trị sai cho x>9.
#7261139thay vì #483D8Bcho trường hợp thử nghiệm đầu tiên.
'#'+''.join([hex(int(i))[2:].upper() for i in input()])