RGB'den int'e renkli RGB


13

Üç tamsayı rgb verildiğinde, dize olarak onaltılık gösterimi çıktılar.

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

En kısa alışılmamış kod kazanır


16
SSS bölümümüz , bu sitedeki tüm soruların objektif bir birincil kazanma ölçütüne sahip olması gerektiğini, böylelikle hangi katılımın kazanacağına tartışmasız karar vermek mümkün. . En kısa nesneldir, ancak "en alışılmadık" değildir. Ayrıca, kod-golf etiketi yalnızca kazanan koşul en kısa kodsa kullanılmalıdır; ve kod sorma etiketi yalnızca kod golf etiketi kullanılmıyorsa kullanılmalıdır .
Peter Taylor

ve kazananı bir süre önce kabul et (bu durumda, 24 saat bile değildi) daha fazla katkı cesaretini kırıyor ...
woliveirajr

@PeterTaylor Üzgünüm bundan sonra kılavuz çizgileri okuduğumdan emin olacağım :( Sanırım haklısın alışılmışın dışında çok belirsiz
Quillion

Yanıtlar:


14

Ruby: 19 karakter

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

Örnek çalışma:

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

Yakut

Daha çok "alışılmışın dışında" kısmı için gidiyordum. ;)

10;a=    gets.   split
.  map  {|       x|  #x
"%02X"  %(  x.   to_i)
}; $>   <<   ?#  <<  a[
00  ..   1+2].   join;

Yazı tipi (web tarayıcımda) biraz uzun, bu yüzden bozuk görünüyor, ancak Courier New'de daha iyi görünüyor:

görüntü

Örnek çalışma:

c:\a\ruby>rgb2hex
255 100 0
#FF6400

Bu dahi!
Albert Renshaw

6

q / k (3 karakter)

Tam olarak alışılmışın dışında değil, oldukça kısa

4h$

Misal

q)4h$ 72 61 139
0x483d8b

Sorudaki çıktı biçimini tam olarak eşleştirmek için yapabiliriz (9 karakter için):

"#",/$4h$

1
Bu, sorudaki örnek çıktılar başına gereken sayı işareti (#) eksik.
Iszi

5

PowerShell: 71 52 51 41

@Manatwork sayesinde işaret etmek için ForEach-Objectbir fordöngü yerine kullanılabilir . Değişkenlere koymak yerine döngü çıktısında
kullanabileceğimi gösteren @Joey'e teşekkürler -join.

Golf kodu:

'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})

Not:

Burada geçersiz girişleri kontrol ederken hata yok. Komut dosyası girdiler olarak 256, 4096 ve 65536'yı mutlu bir şekilde alacak, daha sonra # 100100010000 (RGB olarak çalışmaz).

Ungolfed, yorumlarla:

# 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)
    }
)

Döngüyü foreach($i in 1,2,3)68 karaktere düşürmek için yapın.
manatwork

@manatwork Bu bir foreachPowerShell için uygun sözdizimi olduğunu sanmıyorum . (En azından, bazı test çalışmalarını yapamadım.) Ancak, doğru sözdizimini, yerleşik bir takma adı ve yakın zamanda keşfettiğim başka bir PowerShell kısayolunu kullanarak, bence daha iyi bir şeyim var, tıraş başka 12 karakter önerin. (1..3)|%{...}(Üç nokta yerine mevcut komut dosyasından parantez ifadesi ekleyin.) Hala bunu komut dosyasında tam olarak test etmem gerekiyor, ama beni bu yönde işaret ettiğiniz için teşekkürler!
Iszi

Bunun doğru sözdizimi olup olmadığı konusunda bir fikrim yok, ancak SS64 referansı bundan foreachbahsediyor ve benim için çalışıyor. (Sürüm hakkında bir fikrim yok. Windows 7 ile birlikte gelen).
manatwork

@manatwork Bu ilginç. Biraz daha kazmak ve neyin yanlış olduğunu anlamak istiyorum ("..." hatalarında "beklenmeyen simge" alıyordum). SS64 makalesi PowerShell'in farklı bir sürümü için yazılmış olabilir - emin değilim. Şimdilik, bunun (1..3)|%işe yaradığını ve senaryoyu 56 karaktere indirdiğini doğruladım . Bunu cevabın içinde düzenleyeceğim ve kesinlikle fikir için size kredi vereceğim. Tekrar teşekkürler!
Iszi

2
Lanet olsun. Sen kullanarak 41'e bu alabilirsiniz -join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
Joey

4

bash 22 21 karakter

( \Çift tırnaklar yerine 1 karakter için @manatwork teşekkürler )

printf \#%02X%02X%02X 12 12 12 
#0C0C0C

veya bir döngüde STDIN okuma : 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

2015-10-06 eklendi: bash (daha alışılmışın dışında bir yöntem) 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

Biliyorum, eğer 020yazılırsa 82 karakter olabilir 16, ama bunu tercih ederim ... Ya da belki d+=${c[$b$a 0x10]}de ilk yazı idi.

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

Başka bir yaklaşımı

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

Bu, aşağıdakileri içeren bir tarayıcı penceresi görüntüler:

RGB int 2 hex görüntüleyici dönüştürücü

Değerleri değiştirmek için fare tekerleğini döndürebileceğiniz yer (kaydırma tuşu 15 adımda basılı tutulduğunda) ...


Aslında sondaki yeni satır talep edilmedi ve sadece “#” kaçmak gerekiyor, bu yüzden printf \#%02X%02X%02Xyeterli.
manatwork

Bir eklendi daha alışılmışın dışında bir yöntem :
F Hauri

Lol. Bu iç döngü gerçekten şaşırtıcı derecede alışılmadık.
manatwork

@manatwork teşekkürler, seksi bird+=${c[$b$a 0x10]} şey buluyorum !
F.Hauri

1
... ya da belki d+=${c[$b$a 020]}işi yapacak ve güzel görünecek
F. Hauri

3

Perl, 31 karakter

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

Bu kadar kısa bir programı alışılmışın dışında yapmak zor, ama bence bu işe yarıyor.


Bu cevabı beğendim :) birkaç tane daha ve hiçbir şey daha iyi yuvarlanmıyorsa, bu fikre yerleşebilirim.
Quillion

Güzel! Sadece bir unpacksoru: Onaltılık ve bir büyük harf yapabilir misiniz?
manatwork

@manatwork İçinde yapmanın bir yolunu bulmaya çalıştım unpack, ama şans yok. Bunun bir yolu kullanmak sprintfyerine unpack, ama bu daha uzun ve tamamen ortodoks. Diğer yol, dizeyi büyük harfe dönüştürmektir: map{uc unpack H2,chr}üç karakterlik bir maliyetle.
ekmek kutusu

Teşekkürler @breadbox. Bu zor küçük packve unpackasla kodlama stilime girmez. Yani benim için yeterince alışılmışın dışında.
manatwork

Yanlış sayım. Bu 30 karakter yapmak!
F. Hauri

3

Eylem Betiği 3 | 43 karakter

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

Çıktı: #483D8B


Buraya çok fazla boşluk bırakamaz mısınız? Action Script'i bilmiyorum, ancak gerekli görünmüyorlar
Cruncher

@Cruncher evet üzgünüm, buradaki ilk cevaplarımdan biri.
Ilya Gazman

2
Bir char kurtarmak için sonunda noktalı virgül öldür
Doorknob

3

Perl 24 karakter

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

Üzgünüm, kullanmaktan unpackdaha seksi değil , daha kısa!

Daha belirsiz sürüm:

Ancak gerçekten kullanmayı tercih unpackederseniz, şunları yapabilirsiniz:

$==24;s/\d+[\n ]*/{$=-=8;($&<<$=).do{rand>.5?qw<+>[0]:"|"}}/eg;$_=
pack("N",eval($_.587.202.560));say$1,unpack("H6",$2)if/^(.)(.*)$/s

Örnek olarak, daha kısa versiyon değil, ama hoşuma gitti! ( Bunu dikkate almak randiçin kullanımına dikkat edin :-)

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

Boşa giden beyaz alanı kullandı ve içine bazı kodlar taşıdı

Komut satırı girişleriyle çalıştır:

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

çıktı: "# FF2448"


Talep üzerine açıklama sağlayacaktır. Eğer anlayabiliyorsanız rahatsız
etmemeyi

2

Dördüncü, 62 karakter

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

Çıktı gerekir 1 1 1 için çalışmıyor # 010101
cırcır ucube

Merhaba @ratchetfreak. Benim için çalışıyor. Sadece gforth ile test edildi. Bunu verilmesi 1 1 1çıkışları #010101. 0-255 arasındaki diğer değerler de çalışır. Hangi ortamı veya ileriyi kullanıyorsunuz?
Darren Stone

2

C (67 karakter ana ocak plakası yok)

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

bataklık standart printf & bit twiddler kullanımı


Bekle, readf? Olmamalı mı scanf?
ekmek kutusu

@breadbox ah evet D'de çok fazla zaman geçirdim; Her iki şekilde de char sayısında fark yok
cırcır ucube

2

Dc: 35 32 karakter

[#]n16o?ShShSh[Lhd16/n16%n]ddxxx

Örnek çalışma:

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

(Ancak, ayrı satırlardaki giriş numaralarına ihtiyaç duyar.)

[#]n16o[?d16/n16%n]ddxxx

Örnek çalışma:

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
dcBu web sitesinde yeterli cevap yok.
breadbox

2

JavaScript, 89 karakter

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

Dönüştürür 72 61 139için 256*(256*(72)+61)+139ve evals bunu.


Güzel bir, ama soruya yayınlanan 3. örnek üzerinde başarısız.
manatwork

Ah, iyi çağrı. Sabit.
Casey Chu

2
Kullanmak eval('(('+DEC.replace(/ /g,'<<8)+'))yerine eval('256*(256*('+DEC.replace(/ /g,')+'))5 karakter tasarruf sağlar!
F. Hauri

2

PowerShell, 45

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

Veya, verilerde borulama yapılarak kullanılabiliyorsa,

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

ki bu onu 42'ye indirir .


İyi iş! Hala golf hakkında öğrenecek çok şeyim var!
Iszi

Oh, değişkenlerle ilgili fikriniz de zekiydi; aklımı asla geçemezdi. Sadece olağan favorimden daha uzun olur: -splitve -join.
Joey

2

powershell 37

TimmyD sayesinde bir bayt kurtardı

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]Girdi tamsayı olarak verildiğinden kurtularak birkaç bayt kaydedebilir ve çıktınızı şu şekilde düzenleyebilirsiniz "#$o"- bu 31 bayt verir$args|%{$o+="{0:X2}"-f$_};"#$o"
AdmBorkBork

@TimmyD [bayt] kaldırma [bayt] olmadan test ettiğim bir sürümde (iirc 2.0 xp) tüm sürümünde doğru çalışıp çalışmadığını bilmiyorum ama onaltılık olarak bitiştiriyordu ama ints yani 72 61 139 # 7261139 değil # 483d8b "# $ o" tırnak içinde bir dize değişmez değil ama değerlendirilen dize bilmek güzel teşekkürler hex dönüşüm hakkında yorumlar takdir edilecektir
blabb

Görünüşe göre PowerShell v2 ve v3 arasındaki bir fark - karşılık gelen .NET sürümünün onaltılık dönüşümü nasıl işlediğiyle ilgili bir şey olmalı, ancak bununla ilgili belgeleri bulamıyorum.
AdmBorkBork

2

R, 16 bayt

Bu kadar. Yerleşik kullanın.

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

1

C, 67 73 Karakterler (Ana Hariç 65 Karakter)

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

Sıkıcı C programı - çok ortodoks.


16 veya daha küçük ab veya c ile çalışmaz
mandal ucube

% X,% 02X olarak değiştirildi.
Ian James

1

Python 2.7 (80 Karakter)

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

Tek haneli onaltılık değerleri işlemek için daha iyi bir yol arıyorum. Herhangi bir fikir?


Biçim dizeleri kullanıyor olabilirsiniz? '% 02x' herkesin yaptığı gibi görünüyor.
jqblz

1

Befunge-98, 45 karakter

Bleh, yinelenen kod. Oh iyi. Sayı tabanı dönüşümünün basit bir uygulaması.

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

Örnek çalışma

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

(Not: girişi okumadan önce '#' yazdırır --- görev bunu yasaklamaz; stdin'de üç sayı verildiğinde stdout'ta doğru çıktıyı üretir. Ayrıca yeni satırlarla uğraşmaz ve gördüğünüz gibi "etkileşimli" çalıştırıldığında '#' ifadesini düzgün eklemeyin.)


1

Game Maker Dili, 175 (81. konumda hata)

3 ila 9 basamaklı RGB ister. GML onaltılık işaretiyle onaltılık,$

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

Bunu bir senaryo yap. Ayrıca 0 olarak kabul edilen başlatılmamış değişkenlerle derleyin.

Kaynak


1

Gema, 93 karakter

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

Örnek çalışma:

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

Burlsque, 12 bayt (küçük harf için 10 bayt)

Küçük harfe izin verilirse 10 bayt:

psb6\['#+]

Kullanımı:

blsq ) "72 61 139"psb6\['#+]
"#483d8b"

Umutsuzca büyük harfe ihtiyacınız varsa ekleyin ZZ:

blsq ) "72 61 139"psb6\['#+]ZZ
"#483D8B"

Tamsayı bir dizede olduğu gibi almazsanız:

blsq ) {72 61 139}b6\['#+]
"#483d8b"

Açıklama:

ps -- parse string
b6 -- to hex
\[ -- concat
'#+] -- prepend #

Buradan çevrimiçi deneyin .

Bonus:

Geri dönüştürmek için şunu kullanın:

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

1

Powershell, 28 bayt

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

Test komut dosyası:

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

Çıktı:

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

0

Python3.3 @ 60 karakter

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

Direnemedi:

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

0

Clojure 76 Karakter

Bütünlük uğruna bu geç olabilir:

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

Örnek çağrılar:

(hexy 0 255 127)
"#00FF7F"

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


0

Ortak Lisp, 39 karakter

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

Üç tamsayı okuyun, bir dize döndürün.


0

Javascript ES6, 63 bayt

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

Tesadüfen, seninkini görmeden önce seninle neredeyse aynı şeyi yazdım. Çok güzel =) Benimkini göndermeyeceğim kadar yakınlar, ancak bununla eşlemenizde birkaç bayt kaydedebilirsiniz:x=>(x<16?0:'')+x.toString(16)
Mwr247

1
Ayrıca, r=başında dahil etmeye gerek yok . Anonim bir işlev olarak bile bir işlev olarak sayılır, çünkü hiçbir şey atamanıza gerek kalmadan onu çağırabilirsiniz.
Mwr247

Whoops. Harita şu demekti: x=>(x<16?0:'')+(x*1).toString(16)Sizin ve oradaki ilk haritam şu anda yanlış değerler veriyor x>9.
Mwr247

Bu şu anda ilk test senaryosu #7261139yerine geri dönüyor #483D8B.
Dennis

0

Python 2, 40 bayt

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

Üç ayrı satırdan girişi okur. Kötüye kullanım execve dize çarpımı.

Örnek kullanım:

$ python2 rgbint.py
72
61
139
#483D8B

$ python2 rgbint.py
75
0
130
#4B0082

$ python2 rgbint.py
0
255
127
#00FF7F

0

Python (55 karakter)

'#'+''.join([hex(int(i))[2:].upper() for i in input()])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.