RGB intから16進数へ


13

3つの整数rgbを指定すると、16進表現を文字列として出力します。

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

最も短い最も正統でないコードが勝ちます


16
よくある質問には、このサイトのすべての質問に...客観的な主要な受賞基準が必要であるため、どのエントリが受賞するかを議論の余地なく決定することができます。。最短は客観的ですが、「最も非正統的」は客観的ではありません。また、勝利条件が最短のコードである場合にのみ、code-golfタグを使用する必要があります。そして、コード・チャレンジタグが場合にのみ使用されるべきコード・ゴルフタグはありません。
ピーターテイラー

しばらくしてから(この場合は24時間もなかった)勝者を受け入れて、さらなる貢献を思いとどまらせる
...-woliveirajr

@PeterTaylor申し訳ありませんが、私は今からに義務づける方針を読み取ることを確認します:(私はあなたが右の異例のは非常にあいまいであると思います
Quillion

回答:


14

ルビー:19文字

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

サンプル実行:

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

ルビー

私は「非正統派」の部分にもっと行きました。;)

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

フォント(私のWebブラウザー上)は少し背が高いため、ゆがんで見えますが、Courier Newではより見やすくなっています。

image

サンプル実行:

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

これは天才です!
アルバートレンショー

6

q / k(3文字)

まったく正統ではないが、かなり短い

4h$

q)4h$ 72 61 139
0x483d8b

質問の出力形式を正確に一致させるには、次のようにします(9文字の場合):

"#",/$4h$

1
これには、質問のサンプル出力ごとに必要なポンド記号(#)がありません。
イッツィ

5

PowerShell:71 52 51 41

指摘してくれた@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文字に減らします。
マナトワーク

@manatwork私はそれforeachがPowerShellでの適切な構文だとは思わない。(少なくとも、いくつかのテストを実行することはできませんでした。)ただし、正しい構文、組み込みのエイリアス、および最近発見した別のPowerShellショートカットを使用すると、より良いものが得られると思います。あなたの提案からさらに12文字。(1..3)|%{...}(省略記号の代わりに既存のスクリプトから括弧で囲まれたステートメントを挿入します。)スクリプトでこれを完全にテストする必要がありますが、その方向を示してくれてありがとう!
イッツィ

それが適切な構文であるかどうかはわかりませんが、SS64参照でforeach言及されており、私にとってはうまくいきます。(バージョンについては
わかり

@manatworkそれは面白いです。もう一度調べて、さらに何が問題なのかを調べたいと思います(「予期しないトークン 'in' ...」エラーが発生していました)。SS64の記事がPowerShellの異なるバージョン用に書かれた可能性があります-よくわかりません。今のところ、私はそれを確認しました(1..3)|%機能する、スクリプトを56文字にまで減らしました。それを答えに編集し、間違いなくあなたのアイデアを称賛します。再度、感謝します!
イッツィ

2
あら 以下を使用して、これを41に取得できます-join'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
ジョーイ

4

bash 22 21文字

\二重引用符の代わりに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

2015-10-06を追加:bash(より非正統的な方法)84 83文字

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'>&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"

これにより、ブラウザウィンドウが表示されます。

RGB int 2 hex viewer converter

マウスホイールを回して値を変更できる場所(シフトキーを15ずつ押したまま)...


実際には、終了する改行は要求されず、「#」のみをエスケープする必要があるためprintf \#%02X%02X%02X、十分です。
マナトワーク

追加されました多くの非正統的な方法を
F. HAURI

笑。その内側のループは実に驚くほど非正統的です。
マナトワーク

@manatworkありがとう、セクシーなd+=${c[$b$a 0x10]}ものを見つけました!
F.ハウリ

1
...または多分d+=${c[$b$a 020]}仕事でしょう見て素敵
F. HAURI

3

Perl、31文字

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

このような短いプログラムを非正統派にするのは難しいですが、これはうまくいくと思います。


私はこの答えが好きです:)さらにもう何も転がらないなら、私はこれに落ち着くかもしれないと思います。

涼しい!ただ、unpack質問:あなたが問題のように、大文字のA〜F進を行うことができますか?
マナトワーク

@manatwork内でそれを行う方法を見つけようとしましたunpackが、運はありません。1つの方法はのsprintf代わりに使用することですがunpack、それは長くて完全に正統的です。もう1つの方法はmap{uc unpack H2,chr}、3文字のコストで、文字列を大文字に変更するだけです。
ブレッドボックス

ありがとう、@ breadbox。これらのトリッキーな少しpackunpack決して私のコーディングスタイルに入ります。だから私にとっては正統派ではない。
マナトワーク

間違ったカウント。これで30文字になります!
F.ハウリ

3

アクションスクリプト3 | 43文字

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

出力: #483D8B


ここにたくさんの空白を落とすことはできませんか?アクションスクリプトはわかりませんが、必要なようには見えません。
Cruncher

@Cruncherええ、ごめんなさい、私の最初の答えはここにあります。
イリヤガスマン

2
文字を保存するために最後にセミコロンを殺す
Doorknob

3

Perl 24文字

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

3

> <> 103 60

"#"or>1[:82*%:}-82*,86*+:"9"v
    ;^?l ]o+*7)"9":+*68o+*7)<

無駄な空白を利用して、そこにいくつかのコードを移動しました

コマンドライン入力で実行します。

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

出力: "#FF2448"


リクエストに応じて説明を提供します。あなたがそれを理解できるなら、私はむしろ気にしたくない
ランチャー

2

Forth、62文字

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

#010101を出力するはずの1 1 1では動作しません
ラチェットフリーク

こんにちは@ratchetfreak。わたしにはできる。gforthでテストしました。それを1 1 1出力します#010101。他の0〜255の値も機能します。どの環境を使用していますか?
ダレンストーン


2

Dc:35 32文字

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

Dc:27 24文字

(しかし、別々の行に入力番号が必要です。)

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

2
dcこのウェブサイトには十分な回答がありません。
ブレッドボックス

2

JavaScript、89文字

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

変換72 61 139256*(256*(72)+61)+139て評価します。


良いものですが、質問に投稿された3番目のサンプルでは失敗します。
マナトワーク

ああ、いい電話。修繕。
ケーシーチュー

2
eval('(('+DEC.replace(/ /g,'<<8)+'))代わりに使用するとeval('256*(256*('+DEC.replace(/ /g,')+'))、5文字を節約できます!
F.ハウリ

2

PowerShell、45

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

または、データのパイピングで使用できる場合は、単に使用できます

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

これで42になります。


よくやった!ショー私はまだゴルフについて学ぶべきことがたくさんあります!
イスジ

ああ、変数に関するあなたの考えも賢明でした。私の心を決して横切ることはなかっただろう。ちょうどので、それは私のいつものお気に入りよりも長いということが起こる:-split-join
ジョーイ

2

パワーシェル37

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

@TimmyDは、[byte]なしでテストしたバージョン(xrcのiirc 2.0)のすべてのバージョンで[byte]を削除しても正しく機能するかどうかを知りません。引用符内の「#$ o」は文字列リテラルではありませんが、16進変換についての感謝のコメントを感謝します
-blabb

PowerShell v2とv3の違いのようです。対応する.NETバージョンが16進変換を処理する方法に違いがあるはずですが、ドキュメントが見つかりません。
AdmBorkBork

2

R、16バイト

それでおしまい。組み込みを使用します。

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


1

Python 2.7(80文字)

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

1桁の16進数値を処理するより良い方法を探しています。何か案は?


おそらくフォーマット文字列を使用しますか?「%02x」は他のすべての人が行っていることのようです。
jqblz

1

Befunge-98、45文字

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で正しい出力が生成されます。 「対話的に」実行するときに「#」を適切に追加しないでください。)


1

ゲームメーカー言語、175(81の位置でエラー)

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として処理してコンパイルします。

ソース


1

Gema、93文字

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

サンプル実行:

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バイト(小文字の場合は10バイト)

小文字も許可される場合、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}

1

Powershell、28バイト

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

テストスクリプト:

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

出力:

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

0

Python3.3 @ 60文字

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

抵抗できませんでした:

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

0

Clojure 76キャラクター

完全を期すため、これは遅れる可能性があります。

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

呼び出しの例:

(hexy 0 255 127)
"#00FF7F"

0

Mathematica、40文字

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

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

f /@ rgbs // Column

#483d8b

#4b0082

#00ff7f


0

Common Lisp、39文字

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

3つの整数を読み取り、文字列を返します。


0

Javascript ES6、63バイト

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

偶然にも、私はあなたのものを見る前にあなたとほとんどまったく同じことを書いてしまいました。非常に素晴らしい=)それらは私が投稿しないほど十分に近いですが、これでマッピングに数バイトを節約できます:x=>(x<16?0:'')+x.toString(16)
Mwr247

1
また、r=最初に含める必要はありません。何も割り当てずに呼び出すことができるため、匿名関数としても関数としてカウントされます。
Mwr247

おっと。マップが意味すること:x=>(x<16?0:'')+(x*1).toString(16)あなたと私の最初のマップは現在、に間違った値を与えていますx>9
-Mwr247

これは現在、最初のテストケースの#7261139代わりに戻ります#483D8B
デニス

0

Python 2、40バイト

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

3つの別々の行から入力を読み取ります。虐待execと文字列の乗算。

使用例:

$ python2 rgbint.py
72
61
139
#483D8B

$ python2 rgbint.py
75
0
130
#4B0082

$ python2 rgbint.py
0
255
127
#00FF7F

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.