16 진수 색상 RGB int


13

3 개의 정수 rgb가 주어지면 16 진 표현을 문자열로 출력합니다.

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

가장 짧은 정통 코드 승리


16
FAQ에 따르면 이 사이트의 모든 질문은 객관적인 주요 우승 기준이 있어야하므로 어떤 항목을 이길 지 확실하게 결정할 수 있습니다. . 최단은 객관적이지만 "가장 정통적인"것은 아니다. 또한 코드 골프 태그는 당첨 조건이 가장 짧은 코드 인 경우에만 사용해야합니다. 그리고 코드 도전 태그는 경우에만 사용되어야한다 코드 골프 태그가 없습니다.
피터 테일러

그리고 약간의 시간 전에 승자 동의 ... 종류의 스타일을 장려 더 공헌 (이 경우,도 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;

내 웹 브라우저의 글꼴이 약간 크므로 왜곡되어 보이지만 Courier New에서 더 좋아 보입니다.

영상

샘플 실행 :

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

이것은 천재입니다!
Albert Renshaw

6

q / k (3 자)

정통은 아니지만 아주 짧은

4h$

q)4h$ 72 61 139
0x483d8b

질문의 출력 형식을 정확히 일치시키기 위해 다음을 수행 할 수 있습니다 (9 자).

"#",/$4h$

1
문제의 샘플 출력에 필요한 파운드 기호 (#)가 누락되었습니다.
Iszi

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로 작동하지 않음).

코멘트가없는 언 골프 드 :

# 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

@manatwork foreachPowerShell 의 올바른 구문이라고 생각하지 않습니다 . (적어도 테스트 실행을 할 수 없었습니다.) 그러나 올바른 구문, 기본 제공 별칭 및 최근에 발견 한 다른 PowerShell 바로 가기를 사용하면 더 나은 무언가가 있다고 생각합니다. 당신의 제안에서 또 다른 12 문자. (1..3)|%{...}(줄임표 대신 기존 스크립트에서 괄호로 묶은 문장을 삽입하십시오.) 여전히 스크립트에서 이것을 완전히 테스트해야하지만 그 방향으로 나를 가리켜 주셔서 감사합니다!
Iszi

그것이 올바른 구문인지 아닌지는 모르겠지만 SS64 참조 foreach는 그것을 언급하고 나에게 효과적입니다. (버전에 대해서는 전혀 모릅니다. Windows 7과 함께 제공되는 버전)
manatwork

@manatwork 흥미 롭습니다. 나는 다른 곳에서 더 많은 문제가 무엇인지 알아 내고 싶습니다 (다른 예기치 않은 토큰 'in'... '오류가 발생했습니다). SS64 아티클이 다른 버전의 PowerShell 용으로 작성되었을 수 있습니다. 잘 모르겠습니다. 지금은 (1..3)|%작동 한다는 것을 확인 했으며 스크립트를 56 자로 줄였습니다. 답변으로 편집하고 아이디어에 대해 분명히 당신을 인정합니다. 다시 감사합니다!
Iszi

2
아, 댕 당신은을 사용하여 41이를 얻을 수 있습니다 -join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
Joey

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 진수 뷰어 변환기

값을 변경하기 위해 마우스 휠을 굴릴 수있는 위치 (Shift 키를 15 단계로 누른 상태) ...


실제로 종료 줄 바꿈은 요청되지 않았으며 "#"만 이스케이프 처리하면 printf \#%02X%02X%02X충분합니다.
manatwork

보다 정통적인 방법을 추가했습니다 :
F. Hauri

롤 그 내부 루프는 실제로 충격적으로 정통적입니다.
manatwork

@ manatwork 감사합니다, 나는 섹시한 것을 발견 d+=${c[$b$a 0x10]}합니다 !
F. Hauri

1
... 또는 아마 d+=${c[$b$a 020]}일을 하고 멋지게 보일 것입니다
F. Hauri

3

펄, 31 자

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

그런 짧은 프로그램을 정 통화하기는 어렵지만 이것이 효과가 있다고 생각합니다.


나는이 대답을 좋아한다.
Quillion

멋있는! 그냥 unpack질문 : 질문에서와 같이 16 진수 a..f를 대문자로 만들 수 있습니까?
manatwork

@manatwork 나는 안에서 그것을 할 수있는 방법을 찾으려고 노력 unpack했지만 운이 없다. 한 가지 방법은 sprintf대신에 사용 하는 unpack것이지만 더 길고 완전히 정통입니다. 다른 방법은 문자열을 대문자로 바꾸는 것 map{uc unpack H2,chr}입니다.
breadbox

감사합니다, @breadbox. 그 까다로운 작은 packunpack결코 내 코딩 스타일에 들어가. 그래서 그 정통은 나를 위해 충분합니다.
manatwork

카운트가 잘못되었습니다. 이것은 30 문자를 만듭니다!
F. Hauri

3

액션 스크립트 3 | 43 자

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

산출: #483D8B


여백을 많이 떨어 뜨릴 수 없습니까? 나는 행동 스크립트를 모른다. 그러나 그것들은 필요하지 않다
Cruncher

@Cruncher 예 죄송합니다. 첫 번째 답변 중 하나입니다.
Ilya Gazman

2
마지막에 세미콜론을 죽여 숯을 구하십시오
Doorknob

3

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위해 사용 :-)

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"


요청시 설명을 제공합니다. 당신이 그것을 알아낼 수 있다면 오히려 귀찮게하지 않을 것입니다
Cruncher

2

넷째, 62 자

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

1 1 1에서 작동하지 않습니다. # 010101
ratchet freak

안녕하세요 @ratchetfreak. 그것은 나를 위해 작동합니다. 방금 gforth로 테스트했습니다. 그주기 1 1 1출력한다 #010101. 다른 값 0-255도 작동합니다. 어떤 환경을 사용하고 있습니까?
대런 스톤

2

C (67 개 문자, 메인 보일러 플레이트 없음)

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

bog 표준 printf 및 비트 트위 들러 사용법


기다려 readf? 그렇지 scanf않습니까?
breadbox

@breadbox 아 그래 D에서 너무 많은 시간을 보냈다; 어느 쪽이든 문자 수에 차이가 없습니다
래칫 괴물

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이 웹 사이트에 충분한 답변 이 없습니다 .
breadbox

2

자바 스크립트, 89 자

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

변환 72 61 139256*(256*(72)+61)+139하고 evals을.


좋은 점이지만 질문에 게시 된 세 번째 샘플에서는 실패합니다.
manatwork

아 좋은 전화. 결정된.
Casey Chu

2
사용 eval('(('+DEC.replace(/ /g,'<<8)+'))대신 eval('256*(256*('+DEC.replace(/ /g,')+'))할 수는 5 개 문자를 저장!
F. Hauri

2

PowerShell, 45

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

또는 데이터를 파이핑하여 사용할 수 있다면

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

이는 그것을 아래로 제공합니다 (42) .


잘 했어! 골프에 대해 아직도 배울 점이 많습니다!
Iszi

아, 변수에 대한 당신의 생각도 영리했습니다. 내 마음을 결코 넘지 못했을 것입니다. 내 평소 좋아하는 것보다 길어집니다 : -split-join.
Joey

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]를 제거하면 [byte]없이 테스트 한 버전 (xp의 iirc 2.0)의 모든 버전에서 올바르게 작동하는지 알 수 없습니다. 따옴표 안의 "# $ o"는 문자열 리터럴이 아니지만 16 진수 변환에 대한 감사의 말을 전합니다. 감사합니다.
blabb

PowerShell v2와 v3의 차이점은 분명히 그렇습니다. 해당 .NET 버전이 16 진수 변환을 처리하는 방법에 관한 것이지만 문서를 찾을 수는 없습니다.
AdmBorkBork

2

R, 16 바이트

그게 다야. 내장을 사용하십시오.

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

1

C, 67 73 자 (메인을 제외한 65 자)

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

지루한 C 프로그램-매우 정통.


16보다 작은 ab 또는 c에서는 작동하지 않습니다
ratchet freak

% X가 % 02X로 변경되었습니다.
Ian James

1

Python 2.7 (80 자)

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

한 자리 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에 세 개의 숫자가 주어지면 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

관장, 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

파워 쉘, 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

클로저 76 문자

완전성을 위해 늦을 수 있습니다.

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

호출 예 :

(hexy 0 255 127)
"#00FF7F"

0

매스 매 티카, 40 자

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

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

f /@ rgbs // Column

# 483d8b

# 4b0082

# 00ff7f


0

공통 리스프, 39 자

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

정수 세 개를 읽고 문자열을 반환합니다.


0

자바 스크립트 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.
Dennis

0

파이썬 2, 40 바이트

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

세 개의 개별 라인에서 입력을 읽습니다. 학대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.