3つの整数rgbを指定すると、16進表現を文字列として出力します。
Input: Output:
72 61 139 #483D8B
75 0 130 #4B0082
0 255 127 #00FF7F
最も短い最も正統でないコードが勝ちます
3つの整数rgbを指定すると、16進表現を文字列として出力します。
Input: Output:
72 61 139 #483D8B
75 0 130 #4B0082
0 255 127 #00FF7F
最も短い最も正統でないコードが勝ちます
回答:
私は「非正統派」の部分にもっと行きました。;)
10;a= gets. split
. map {| x| #x
"%02X" %( x. to_i)
}; $> << ?# << a[
00 .. 1+2]. join;
フォント(私のWebブラウザー上)は少し背が高いため、ゆがんで見えますが、Courier Newではより見やすくなっています。

サンプル実行:
c:\a\ruby>rgb2hex
255 100 0
#FF6400
指摘してくれた@manatworkに感謝
ForEach-Objectで、forループの代わりにできるようになりました。
@Joeyが-join、ループ出力を変数に入れる代わりに使用できることを指摘してくれてありがとう。
ゴルフコード:
'#'+-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)})。
(\二重引用符の代わりに1文字を使用して@manatworkに感謝します)
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
私が知っているのは、020書かれていれば82文字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"
これにより、ブラウザウィンドウが表示されます。

マウスホイールを回して値を変更できる場所(シフトキーを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が、運はありません。1つの方法はのsprintf代わりに使用することですがunpack、それは長くて完全に正統的です。もう1つの方法はmap{uc unpack H2,chr}、3文字のコストで、文字列を大文字に変更するだけです。
packとunpack決して私のコーディングスタイルに入ります。だから私にとっては正統派ではない。
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するためにranderingこれを:-)
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
[#]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て評価します。
eval('(('+DEC.replace(/ /g,'<<8)+'))代わりに使用するとeval('256*(256*('+DEC.replace(/ /g,')+'))、5文字を節約できます!
TimmyDのおかげで1バイト節約
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"
Bleh、重複コード。しかたがない。基数変換の簡単な実装です。
"#",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で3つの数値を指定すると、stdoutで正しい出力が生成されます。 「対話的に」実行するときに「#」を適切に追加しないでください。)
3〜9桁のRGBを要求します。GML 16進符号付きの16進を返します。$
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として処理してコンパイルします。
小文字も許可される場合、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}
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。