Diberikan tiga bilangan bulat rgb, menampilkan representasi heksadesimal sebagai string.
Input: Output:
72 61 139 #483D8B
75 0 130 #4B0082
0 255 127 #00FF7F
Kode terpendek yang paling tidak lazim menang
Diberikan tiga bilangan bulat rgb, menampilkan representasi heksadesimal sebagai string.
Input: Output:
72 61 139 #483D8B
75 0 130 #4B0082
0 255 127 #00FF7F
Kode terpendek yang paling tidak lazim menang
Jawaban:
Saya akan lebih banyak untuk bagian "tidak ortodoks". ;)
10;a= gets. split
. map {| x| #x
"%02X" %( x. to_i)
}; $> << ?# << a[
00 .. 1+2]. join;
Font (pada browser web saya) agak tinggi, sehingga terlihat terdistorsi, tetapi terlihat lebih baik di Courier New:

Contoh dijalankan:
c:\a\ruby>rgb2hex
255 100 0
#FF6400
Tidak persis tidak lazim tetapi cukup singkat
4h$
Contoh
q)4h$ 72 61 139
0x483d8b
Untuk mencocokkan format output dalam pertanyaan dengan tepat, kita dapat melakukan (untuk 9 karakter):
"#",/$4h$
Terima kasih kepada @manatwork karena menunjukkan
ForEach-Objectdapat digunakan sebagai gantiforloop.
Terima kasih kepada @ Joey untuk menunjukkan bahwa saya dapat menggunakan-joinpada output loop, daripada harus memasukkannya ke dalam variabel.
Kode golf:
'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
catatan:
Tidak ada kesalahan saat memeriksa input yang tidak valid. Script akan dengan senang hati mengambil 256, 4096, dan 65536 sebagai input, kemudian menghasilkan # 100100010000 (yang jelas tidak akan berfungsi sebagai RGB).
Tidak disatukan, dengan komentar:
# 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)untuk menguranginya menjadi 68 karakter.
foreachdi PowerShell. (Setidaknya, saya belum bisa menjalankan beberapa tes berjalan.) Namun, menggunakan sintaks yang tepat, alias bawaan, dan pintasan PowerShell lain yang baru-baru ini saya temukan, saya pikir saya punya sesuatu yang lebih baik, bercukur. 12 karakter lagi dari saran Anda. (1..3)|%{...}(Sisipkan pernyataan tanda kurung dari skrip yang ada di tempat ellipsis.) Saya masih perlu menguji ini sepenuhnya dalam skrip, tapi terima kasih telah mengarahkan saya ke arah itu!
(1..3)|%berfungsi dan membawa skrip ke 56 karakter. Saya akan mengeditnya menjadi jawabannya, dan pasti akan menghargai Anda untuk ide itu. Terima kasih lagi!
-join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
(Terima kasih @manatwork untuk 1 karakter menggunakan \bukan tanda kutip ganda)
printf \#%02X%02X%02X 12 12 12
#0C0C0C
atau membaca STDIN dalam satu lingkaran: 48 karakter:
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
Saya tahu, bisa jadi 82 karakter jika 020ditulis 16, tetapi saya lebih suka ini ... Atau mungkin d+=${c[$b$a 0x10]}yang merupakan posting pertama.
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"
Ini akan menampilkan jendela browser, dengan:

Di mana Anda dapat menggulung roda mouse untuk mengubah nilai (dengan tombol shift ditahan untuk langkah 15) ...
printf \#%02X%02X%02Xsudah cukup.
d+=${c[$b$a 0x10]}sesuatu yang seksi !
d+=${c[$b$a 020]}akan melakukan pekerjaan itu dan terlihat baik
perl -nE 'say"#",map{unpack H2,chr}split'
Sulit untuk membuat program pendek seperti itu tidak lazim, tapi saya pikir ini berhasil.
unpackpertanyaan: dapatkah Anda membuat huruf heksadesimal a..f, seperti dalam pertanyaan?
unpack, tetapi tidak berhasil. Salah satu caranya adalah menggunakan sprintfalih-alih unpack, tapi itu lebih lama dan sepenuhnya ortodoks. Cara lain adalah dengan hanya memodifikasi string menjadi huruf besar:, map{uc unpack H2,chr}dengan biaya tiga karakter.
packdan unpacktidak pernah masuk ke gaya pengkodean saya. Jadi itu cukup tidak lazim bagi saya.
trace("#"+(72<<16|61<<139|b).toString(16));
Keluaran: #483D8B
perl -ne 'printf"#"."%02x"x3,split'
13 31 133
#0d1f85
Maaf, ini tidak seksi daripada menggunakan unpack, tetapi lebih pendek!
Tetapi jika Anda benar-benar lebih suka menggunakan unpack, maka Anda dapat:
$==24;s/\d+[\n ]*/{$=-=8;($&<<$=).do{rand>.5?qw<+>[0]:"|"}}/eg;$_=
pack("N",eval($_.587.202.560));say$1,unpack("H6",$2)if/^(.)(.*)$/s
Sebagai contoh, ini bukan versi yang lebih pendek, tetapi saya menyukainya! (Perhatikan penggunaan randuntuk randering ini :-)
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)<
Memanfaatkan ruang putih yang terbuang, dan memindahkan beberapa kode ke dalamnya
Jalankan dengan input baris perintah:
python fish.py generateHex.fish -v 255 36 72
output: "# FF2448"
: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL
1 1 1output #010101. Nilai 0-255 lainnya juga berfungsi. Lingkungan apa atau sebagainya yang Anda gunakan?
int r,g,b;
scanf("%d %d %d",&r,&b,&g);
printf("#%06x",r<<16|g<<8|b);
penggunaan printf & bit twiddler standar rawa
readf,? Bukankah seharusnya begitu scanf?
[#]n16o?ShShSh[Lhd16/n16%n]ddxxx
Contoh dijalankan:
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
(Tetapi perlu nomor input pada jalur yang terpisah.)
[#]n16o[?d16/n16%n]ddxxx
Contoh dijalankan:
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
dcjawaban yang cukup di situs web ini.
JavaScript, 89 karakter
console.log('#' + ('00000' + eval('256*(256*(' + DEC.replace(/ /g, ')+')).toString(16)).slice(-6))
Bertobat 72 61 139untuk 256*(256*(72)+61)+139dan evals itu.
eval('(('+DEC.replace(/ /g,'<<8)+'))bukannya eval('256*(256*('+DEC.replace(/ /g,')+'))membiarkan Anda menghemat 5 karakter!
'#'+-join(-split(read-host)|%{'{0:X2}'-f+$_})
Atau, jika itu dapat digunakan dengan memipipkan data, Anda bisa menggunakannya
'#'+-join(-split"$input"|%{'{0:X2}'-f+$_})
yang membawanya ke 42 .
-splitdan -join.
disimpan satu byte berkat 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]sejak kita diberi input sebagai bilangan bulat, dan mengedit output Anda menjadi "#$o"- yang memberikan 31 byte untuk$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);}
Program C membosankan - sangat ortodoks.
x=lambda y: ("0"+hex(int(y))[2:])[-2:]
print "#"+''.join(map(x,input().split()))
Saya mencari cara yang lebih baik untuk menangani nilai hex satu digit. Ada ide?
Bleh, kode duplikat. Baiklah. Hanya implementasi langsung dari konversi radix.
"#",v
7*+,>#@&:97+/"0"+:"9"`7*+,97+%"0"+:"9"`
Contoh dijalankan
% cfunge tohex.98 <<<'72 61 139'
#483D8B
% cfunge tohex.98
#75 0 130
4800820 255 127
00FF7F
(Catatan: mencetak '#' sebelum membaca input --- tugas tidak melarang ini; diberi tiga angka pada stdin menghasilkan output yang tepat pada stdout. Juga tidak mengganggu baris baru, dan seperti yang Anda lihat tidak 't tambahkan' # 'dengan benar ketika menjalankan "secara interaktif".)
Meminta untuk 3 hingga 9 digit RGB. Mengembalikan heksadesimal dengan tanda heksadesimal 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
Jadikan ini skrip. Juga, kompilasi dengan variabel tidak diinisialisasi diperlakukan sebagai 0.
Jika huruf kecil diizinkan juga maka 10 byte:
psb6\['#+]
Pemakaian:
blsq ) "72 61 139"psb6\['#+]
"#483d8b"
Jika Anda sangat membutuhkan huruf besar, tambahkan ZZ:
blsq ) "72 61 139"psb6\['#+]ZZ
"#483D8B"
Jika Anda tidak menerima bilangan bulat seperti dalam string, lanjutkan dengan:
blsq ) {72 61 139}b6\['#+]
"#483d8b"
Penjelasan:
ps -- parse string
b6 -- to hex
\[ -- concat
'#+] -- prepend #
Bonus:
Untuk mengubahnya kembali gunakan ini:
blsq ) "#483d8b"[-2cob6
{72 61 139}
print("#"+3*"%.2X"%tuple(int(n) for n in input().split()))
Tidak bisa menolak:
[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=di awal. Itu masih dianggap sebagai fungsi bahkan sebagai fungsi anonim, karena Anda dapat menjalankannya tanpa harus menetapkan apa pun.
x=>(x<16?0:'')+(x*1).toString(16)Milik saya dan yang pertama di sana memberikan nilai yang salah x>9.
#7261139sebagai ganti #483D8Buntuk kasus uji pertama.
'#'+''.join([hex(int(i))[2:].upper() for i in input()])