Üç 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
Üç 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
Yanıtlar:
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:

Örnek çalışma:
c:\a\ruby>rgb2hex
255 100 0
#FF6400
@Manatwork sayesinde işaret etmek için
ForEach-Objectbirfordö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)
}
)
foreach($i in 1,2,3)68 karaktere düşürmek için yapın.
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!
(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!
-join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
( \Ç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
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
#!/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"
Bu, aşağıdakileri içeren bir tarayıcı penceresi görüntüler:

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) ...
printf \#%02X%02X%02Xyeterli.
d+=${c[$b$a 0x10]} şey buluyorum !
d+=${c[$b$a 020]}işi yapacak ve güzel görünecek
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.
unpacksoru: Onaltılık ve bir büyük harf yapabilir misiniz?
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.
packve unpackasla kodlama stilime girmez. Yani benim için yeterince alışılmışın dışında.
trace("#"+(72<<16|61<<139|b).toString(16));
Çıktı: #483D8B
perl -ne 'printf"#"."%02x"x3,split'
13 31 133
#0d1f85
Üzgünüm, kullanmaktan unpackdaha seksi değil , daha kısa!
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
"#"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"
: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL
1 1 1çıkışları #010101. 0-255 arasındaki diğer değerler de çalışır. Hangi ortamı veya ileriyi kullanıyorsunuz?
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ı
readf? Olmamalı mı scanf?
[#]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
(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
dcBu web sitesinde yeterli cevap yok.
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.
eval('(('+DEC.replace(/ /g,'<<8)+'))yerine eval('256*(256*('+DEC.replace(/ /g,')+'))5 karakter tasarruf sağlar!
'#'+-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 .
-splitve -join.
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"
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.
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?
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.)
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.
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 #
Bonus:
Geri dönüştürmek için şunu kullanın:
blsq ) "#483d8b"[-2cob6
{72 61 139}
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
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=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.
x=>(x<16?0:'')+(x*1).toString(16)Sizin ve oradaki ilk haritam şu anda yanlış değerler veriyor x>9.
#7261139yerine geri dönüyor #483D8B.
'#'+''.join([hex(int(i))[2:].upper() for i in input()])