Warna RGB int ke hex

13

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

Quillion
sumber
16
FAQ kami mengatakan Semua pertanyaan di situs ini ... harus memiliki kriteria menang utama yang obyektif, sehingga dimungkinkan untuk memutuskan entri mana yang harus dimenangkan. . Terpendek adalah objektif, tetapi "paling tidak ortodoks" tidak. Selain itu, tag kode-golf harus digunakan hanya jika kondisi yang menang hanya kode terpendek; dan tag kode tantangan harus digunakan hanya jika tag kode golf tidak.
Peter Taylor
dan menerima pemenang sebelum waktu tertentu (dalam hal ini, bahkan tidak 24 jam) jenis mencegah kontribusi lebih lanjut ...
woliveirajr
@PeterTaylor Maaf saya akan pastikan untuk membaca pedoman mulai dari sekarang :( Saya kira Anda benar, ortodoks sangat kabur
Quillion

Jawaban:

14

Ruby: 19 karakter

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

Contoh dijalankan:

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
manatwork
sumber
16

Rubi

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:

gambar

Contoh dijalankan:

c:\a\ruby>rgb2hex
255 100 0
#FF6400
Gagang pintu
sumber
Ini jenius!
Albert Renshaw
6

q / k (3 karakter)

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$
skeevey
sumber
1
Ini tidak memiliki tanda pound (#) yang diperlukan per output sampel dalam pertanyaan.
Iszi
5

PowerShell: 71 52 51 41

Terima kasih kepada @manatwork karena menunjukkan ForEach-Objectdapat digunakan sebagai ganti forloop.
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)
    }
)
Iszi
sumber
Buat loop foreach($i in 1,2,3)untuk menguranginya menjadi 68 karakter.
manatwork
@manatwork Saya tidak berpikir itu sintaks yang tepat untuk 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!
Iszi
Tidak tahu apakah itu sintaks yang tepat atau tidak, tetapi referensi SS64 untuk foreachmenyebutkannya dan bekerja untuk saya. (Tidak tahu tentang versi. Yang datang dengan Windows 7.)
manatwork
@manatwork Itu menarik. Saya ingin menggali dan mencari tahu apa yang salah dengan kesalahan itu lagi (saya mendapatkan kesalahan "tak terduga 'dalam' ...".) Di lain waktu. Mungkin artikel SS64 ditulis untuk versi PowerShell yang berbeda - Saya tidak yakin. Untuk saat ini, saya telah mengonfirmasi bahwa (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!
Iszi
2
Oh, sial. Anda bisa mendapatkan ini untuk 41 dengan menggunakan -join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
Joey
4

bash 22 21 karakter

(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

Ditambahkan 2015-10-06: bash ( metode yang lebih tidak lazim ) 84 83 karakter

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

Pendekatan lain

#!/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"

Ini akan menampilkan jendela browser, dengan:

RGB int 2 hex viewer converter

Di mana Anda dapat menggulung roda mouse untuk mengubah nilai (dengan tombol shift ditahan untuk langkah 15) ...

F. Hauri
sumber
Sebenarnya baris baru yang berhenti tidak diminta dan hanya "#" yang perlu diloloskan, jadi printf \#%02X%02X%02Xsudah cukup.
manatwork
Menambahkan metode yang lebih ortodoks :
F. Hauri
Lol. Lingkaran dalam itu memang sangat tidak lazim.
manatwork
@manatwork terima kasih, saya menemukan d+=${c[$b$a 0x10]}sesuatu yang seksi !
F. Hauri
1
... atau mungkin d+=${c[$b$a 020]}akan melakukan pekerjaan itu dan terlihat baik
F. Hauri
3

Perl, 31 karakter

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

Sulit untuk membuat program pendek seperti itu tidak lazim, tapi saya pikir ini berhasil.

kotak roti
sumber
Saya suka jawaban ini :) beberapa lagi dan saya pikir saya mungkin akan menyelesaikan ini jika tidak ada yang lebih baik berguling-guling.
Quillion
Keren! Hanya sebuah unpackpertanyaan: dapatkah Anda membuat huruf heksadesimal a..f, seperti dalam pertanyaan?
manatwork
@manatwork Saya mencoba mencari cara untuk melakukannya di dalam 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.
kotak roti
Terima kasih, @breadbox. Itu sedikit rumit packdan unpacktidak pernah masuk ke gaya pengkodean saya. Jadi itu cukup tidak lazim bagi saya.
manatwork
Hitungan salah. Ini menghasilkan 30 char!
F. Hauri
3

Skrip Tindakan 3 | 43 karakter

trace("#"+(72<<16|61<<139|b).toString(16));

Keluaran: #483D8B

Ilya Gazman
sumber
Tidak bisakah kamu menjatuhkan banyak ruang putih di sini? Saya tidak tahu Action Script, tetapi mereka tidak terlihat diperlukan
Cruncher
@Cruncher ya maaf, salah satu jawaban pertama saya di sini.
Ilya Gazman
2
Bunuh titik koma di akhir untuk menyelamatkan char
Doorknob
3

Perl 24 karakter

perl -ne 'printf"#"."%02x"x3,split'
13 31 133
#0d1f85

Maaf, ini tidak seksi daripada menggunakan unpack, tetapi lebih pendek!

Versi yang lebih tidak jelas:

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
F. Hauri
sumber
3

> <> 103 60

"#"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"

Cruncher
sumber
Akan memberikan penjelasan atas permintaan. Jika Anda bisa mengetahuinya, saya lebih suka tidak repot
Cruncher
2

Keempat, 62 karakter

: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL
Darren Stone
sumber
tidak berfungsi untuk 1 1 1 yang akan menghasilkan # 010101
ratchet freak
Hai @ scratchetfreak. Ini bekerja untuk saya. Baru diuji dengan gforth. Memberikannya 1 1 1output #010101. Nilai 0-255 lainnya juga berfungsi. Lingkungan apa atau sebagainya yang Anda gunakan?
Darren Stone
2

C (67 karakter tanpa boilerplate utama)

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

penggunaan printf & bit twiddler standar rawa

orang aneh
sumber
Tunggu readf,? Bukankah seharusnya begitu scanf?
kotak roti
@boxbox ah ya saya menghabiskan terlalu banyak waktu di D; bagaimanapun juga tidak ada perbedaan dalam hitungan char
ratchet freak
2

Dc: 35 32 karakter

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

Dc: 27 24 karakter

(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
manatwork
sumber
2
Tidak ada dcjawaban yang cukup di situs web ini.
kotak roti
2

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.

Casey Chu
sumber
Bagus, tetapi gagal pada sampel ke-3 yang diposting dalam pertanyaan.
manatwork
Ah, panggilan yang bagus. Tetap.
Casey Chu
2
Menggunakan eval('(('+DEC.replace(/ /g,'<<8)+'))bukannya eval('256*(256*('+DEC.replace(/ /g,')+'))membiarkan Anda menghemat 5 karakter!
F. Hauri
2

PowerShell, 45

'#'+-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 .

Joey
sumber
Kerja bagus! Saya masih harus belajar banyak tentang golf!
Iszi
Oh, ide Anda dengan variabel-variabel itu juga pintar; tidak akan pernah terlintas dalam pikiranku. Kebetulan itu lebih lama dari favorit saya yang biasa: -splitdan -join.
Joey
2

PowerShell 37

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
mengoceh
sumber
Anda dapat menyimpan beberapa byte dengan menghilangkan [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"
AdmBorkBork
@TimmyD tidak tahu apakah menghapus [byte] berfungsi dengan benar di semua versi dalam versi yang saya uji (iirc 2.0 di xp) tanpa [byte] itu tidak digabungkan sebagai hex tetapi sebagai ints yaitu 72 61 139 adalah # 7261139 bukan # 483d8b "# $ o" di dalam kutipan bukan string literal tetapi string yang dievaluasi senang mengetahui terima kasih komentar tentang konversi hex akan dihargai
blabb
Tampaknya perbedaan antara PowerShell v2 dan v3 - pasti ada sesuatu dalam bagaimana versi .NET yang sesuai menangani konversi heksadesimal, tetapi saya tidak dapat menemukan dokumentasi di dalamnya.
AdmBorkBork
2

R, 16 byte

Itu dia. Gunakan bawaan.

rgb(r,g,b,m=255)
J.Apakah
sumber
1

C, 67 73 Karakter (65 Karakter tidak termasuk utama)

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

Program C membosankan - sangat ortodoks.

Ian James
sumber
tidak bekerja dengan ab atau c lebih kecil dari 16
ratchet freak
Mengubah% X menjadi% 02X.
Ian James
1

Python 2.7 (80 Karakter)

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?

Will Coggins
sumber
Mungkin menggunakan format string? '% 02x' tampaknya seperti yang dilakukan orang lain.
jqblz
1

Befunge-98, 45 karakter

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".)

FireFly
sumber
1

Bahasa Game Maker, 175 (Kesalahan pada posisi 81)

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.

Sumber

Timtech
sumber
1

Gema, 93 karakter

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

Contoh dijalankan:

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
manatwork
sumber
1

Burlsque, 12 byte (10 byte untuk huruf kecil)

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 #

Coba online di sini .

Bonus:

Untuk mengubahnya kembali gunakan ini:

blsq ) "#483d8b"[-2cob6
{72 61 139}
mroman
sumber
1

Powershell, 28 byte

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

Skrip uji:

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

Keluaran:

True: #483D8B
True: #4B0082
True: #00FF7F
mazzy
sumber
0

Python3.3 @ 60 karakter

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
danmcardle
sumber
0

Clojure 76 Karakter

Ini mungkin terlambat, demi kelengkapan:

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

Contoh panggilan:

(hexy 0 255 127)
"#00FF7F"
Lynx Luna
sumber
0

Mathematica, 40 karakter

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

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

f /@ rgbs // Column

# 483d8b

# 4b0082

# 00ff7f

Chris Degnen
sumber
0

Gangguan Umum, 39 karakter

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

Baca tiga bilangan bulat, kembalikan string.

coredump
sumber
0

Javascript ES6, 63 byte

h=>'#'+h.split` `.map(x=>(x<16?0:'')+(x*1).toString(16)).join``
Mama Fun Roll
sumber
Secara kebetulan, saya akhirnya menulis hal yang persis sama dengan Anda sebelum saya melihat milik Anda. Sangat bagus =) Mereka cukup dekat sehingga saya tidak akan memposting milik saya, tetapi Anda dapat menyimpan beberapa byte pada pemetaan Anda dengan ini:x=>(x<16?0:'')+x.toString(16)
Mwr247
1
Juga, tidak perlu menyertakan r=di awal. Itu masih dianggap sebagai fungsi bahkan sebagai fungsi anonim, karena Anda dapat menjalankannya tanpa harus menetapkan apa pun.
Mwr247
Aduh. Dimaksudkan sebagai peta: x=>(x<16?0:'')+(x*1).toString(16)Milik saya dan yang pertama di sana memberikan nilai yang salah x>9.
Mwr247
Ini saat ini kembali #7261139sebagai ganti #483D8Buntuk kasus uji pertama.
Dennis
0

Python 2, 40 byte

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

Membaca input dari tiga baris terpisah. Pelanggaran execdan perkalian string.

Contoh penggunaan:

$ python2 rgbint.py
72
61
139
#483D8B

$ python2 rgbint.py
75
0
130
#4B0082

$ python2 rgbint.py
0
255
127
#00FF7F
jqblz
sumber
0

Python (55 karakter)

'#'+''.join([hex(int(i))[2:].upper() for i in input()])
Dhruv Ramani
sumber