กำหนดจำนวนเต็มสาม 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
รหัสนอกรีตที่สั้นที่สุดจะเป็นผู้ชนะ
คำตอบ:
$_=?#+"%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
ฉันจะเพิ่มเติมสำหรับส่วน "แหกคอก" ;)
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กับเอาต์พุตลูปแทนที่จะต้องใส่มันลงในตัวแปร
รหัส Golfed:
'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
บันทึก:
ไม่มีการตรวจสอบข้อผิดพลาดที่นี่สำหรับอินพุตที่ไม่ถูกต้อง สคริปต์จะใช้อินพุต 256, 4096 และ 65536 อย่างมีความสุขจากนั้นเอาต์พุต # 100100010000 (ซึ่งเห็นได้ชัดว่าใช้งานไม่ได้กับ RGB)
Ungolfed พร้อมความคิดเห็น:
# 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 (อย่างน้อยฉันก็ไม่สามารถทำงานทดสอบได้) อย่างไรก็ตามการใช้ไวยากรณ์ที่ถูกต้องนามแฝงในตัวและทางลัด PowerShell ทางลัดอื่นที่ฉันค้นพบเมื่อเร็ว ๆ นี้ฉันคิดว่าฉันมีอะไรที่ดีกว่าโกนหนวด อีก 12 ตัวอักษรออกจากข้อเสนอแนะของคุณ (1..3)|%{...}(แทรกคำสั่งที่อยู่ในวงเล็บจากสคริปต์ที่มีอยู่ในตำแหน่งของจุดไข่ปลา) ฉันยังต้องทดสอบอย่างเต็มที่ในสคริปต์ แต่ขอบคุณที่ชี้ให้ฉันไปในทิศทางนั้น!
(1..3)|%งานได้และทำให้สคริปต์มีความยาว 56 อักขระ ฉันจะแก้ไขให้เป็นคำตอบและให้เครดิตคุณอย่างแน่นอนสำหรับความคิด ขอบคุณอีกครั้ง!
-join '#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
(ขอบคุณ @ manatwork สำหรับ 1 char โดยใช้\แทนเครื่องหมายคำพูดคู่)
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
ฉันรู้ว่ามันอาจเป็น 82 ตัวอักษรถ้า020ที่เขียน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ไม่เคยเข้ากับสไตล์การเขียนโค้ดของฉันเลย นอกรีตมันก็เพียงพอแล้วสำหรับฉัน
trace("#"+(72<<16|61<<139|b).toString(16));
เอาท์พุท: #483D8B
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สำหรับการจัดอันดับนี้ :-)
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
: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL
1 1 1 #010101ค่าอื่นใดที่ 0-255 ยังใช้งานได้ คุณกำลังใช้สภาพแวดล้อมหรือสภาพแวดล้อมใด
int r,g,b;
scanf("%d %d %d",&r,&b,&g);
printf("#%06x",r<<16|g<<8|b);
การใช้งาน printf & bit twiddler bog มาตรฐาน
readf? ไม่ควรจะเป็นอย่างนั้นscanf?
[#]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"
แค่นั้นแหละ. ใช้ในตัว
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);}
โปรแกรม C น่าเบื่อ - ออร์โธดอกซ์มาก
x=lambda y: ("0"+hex(int(y))[2:])[-2:]
print "#"+''.join(map(x,input().split()))
ฉันกำลังมองหาวิธีที่ดีกว่าในการจัดการค่าเลขฐานสิบหกหลักเดียว ความคิดใด ๆ
Bleh รหัสซ้ำ โอ้ดี เพียงแค่การใช้ Radix Conversion
"#",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 นอกจากนี้ยังไม่ต้องสนใจกับ newlines และตามที่คุณเห็นว่ามันไม่ได้ ไม่ต้องเพิ่ม '#' อย่างถูกต้องเมื่อเรียกใช้ "แบบโต้ตอบ")
แจ้งสำหรับ RGB 3 ถึง 9 หลัก ส่งกลับเลขฐานสิบหกที่มีเครื่องหมายฐานสิบหกของ 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
\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
ถ้าตัวพิมพ์เล็กได้รับอนุญาตให้ใช้เช่นกัน 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}
'#{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
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
นี่อาจจะมาสายเพื่อความสมบูรณ์:
(defn hexy [r g b] (reduce str (cons "#" (map #(format "%02X" %) [r g b]))))
ตัวอย่างการโทร:
(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#)
อ่านจำนวนเต็มสามจำนวนคืนสตริง
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เป็นกรณีทดสอบครั้งแรก
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
'#'+''.join([hex(int(i))[2:].upper() for i in input()])