Kolor RGB int na hex

13

Biorąc pod uwagę trzy liczby całkowite rgb, wyjściowa reprezentacja szesnastkowa jest ciągiem.

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

Najkrótszy najbardziej niekonwencjonalny kod wygrywa

Quillion
źródło
16
Nasze FAQ mówi, że wszystkie pytania na tej stronie ... powinny mieć obiektywne podstawowe kryterium wygranej, aby można było bezdyskusyjnie zdecydować, które zgłoszenie powinno wygrać. . Najkrótszy jest obiektywny, ale „najbardziej niekonwencjonalny” nie. Ponadto znacznika code-golf należy używać tylko wtedy, gdy warunkiem wygranej jest tylko najkrótszy kod; a tag kodowy-wyzwanie powinien być używany tylko wtedy, gdy tag kod-golf nie jest.
Peter Taylor,
i zaakceptuj zwycięzcę przed pewnym czasem (w tym przypadku nie było nawet 24 godziny), rodzaj zniechęca do dalszego wkładu ...
woliveirajr
@PeterTaylor Przepraszamy. Przeczytam teraz wytyczne :( Chyba masz rację, niekonwencjonalny jest bardzo niejasny
Quillion

Odpowiedzi:

14

Ruby: 19 znaków

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

Przykładowy przebieg:

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
człowiek w pracy
źródło
16

Rubin

Chodziłem bardziej na część „niekonwencjonalną”. ;)

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

Czcionka (w mojej przeglądarce) jest nieco wysoka, więc wygląda na zniekształconą, ale lepiej wygląda w Courier New:

wizerunek

Przykładowy przebieg:

c:\a\ruby>rgb2hex
255 100 0
#FF6400
Klamka
źródło
To jest genialne!
Albert Renshaw,
6

q / k (3 znaki)

Niezupełnie niekonwencjonalny, ale dość krótki

4h$

Przykład

q)4h$ 72 61 139
0x483d8b

Aby dokładnie dopasować format wyjściowy w pytaniu, możemy zrobić (dla 9 znaków):

"#",/$4h$
skeevey
źródło
1
Brakuje wymaganego znaku funta (#) na wyjściowe próbki w pytaniu.
Iszi
5

PowerShell: 71 52 51 41

Dzięki @manatwork za wskazanie ForEach-Objectmożna zastosować zamiast forpętli.
Dzięki @Joey za wskazanie, że mogę użyć -joinwyjścia pętli, zamiast konieczności umieszczania go w zmiennych.

Kod do gry w golfa:

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

Uwaga:

Nie ma tu błędu sprawdzania nieprawidłowych danych wejściowych. Skrypt na szczęście pobierze 256, 4096 i 65536 jako dane wejściowe, a następnie wypisze # 100100010000 (który oczywiście nie będzie działał jako RGB).

Niegolfowany, z komentarzami:

# 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)
    }
)
Iszi
źródło
Wykonaj pętlę, foreach($i in 1,2,3)aby zmniejszyć ją do 68 znaków.
manatwork
@manatwork Nie sądzę, że jest to odpowiednia składnia dla programu foreachPowerShell. (Przynajmniej nie udało mi się uruchomić niektórych testów). Jednak używając właściwej składni, wbudowanego aliasu i innego skrótu programu PowerShell, który niedawno odkryłem, myślę, że mam coś lepszego - golenie kolejne 12 znaków poza twoją sugestią. (1..3)|%{...}(Wstaw wielokropek z istniejącego skryptu zamiast wielokropka.) Wciąż muszę to w pełni przetestować w skrypcie, ale dziękuję za skierowanie mnie w tym kierunku!
Iszi
Nie mam pojęcia, czy jest to właściwa składnia, czy nie, ale wzmianka o SS64 foreachwspomina o tym i działa dla mnie. (Nie mam pojęcia o wersji. Ta, która została dostarczona z Windows 7.)
manatwork
@manatwork To ciekawe. Chciałbym przekopać się i dowiedzieć się, co jest z tym nie tak (otrzymałem błąd „nieoczekiwany token” w błędach „...”). Możliwe, że artykuł SS64 został napisany dla innej wersji PowerShell - nie jestem pewien. Na razie potwierdziłem, że to (1..3)|%działa i sprowadzam skrypt do 56 znaków. Przeredaguję to w odpowiedzi i na pewno przypisuję ci pomysł. Dzięki jeszcze raz!
Iszi
2
O rany. Formularz ten można uzyskać do 41 za pomocą -join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
Joey,
4

bash 22 21 znaków

(Dzięki @manatwork za 1 znak za pomocą \zamiast podwójnych cudzysłowów)

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

lub czytanie STDIN w pętli: 48 znaków:

while read f;do printf "#%02X%02X%02X\n" $f;done <<<$'72 61 139\n75 0 130\n0 255 127'
#483D8B
#4B0082
#00FF7F

Dodano 06.10.2015: bash (bardziej niekonwencjonalna metoda) 84 83 znaków

c=({0..9} {a..f}) d=\#;for b;do for a in / %;do d+=${c[$b$a 020]};done;done;echo $d

Wiem, że mogą być 82 znaki, jeśli zostały 020napisane 16, ale wolę to ... A może d+=${c[$b$a 0x10]}pierwszy post.

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

Kolejne podejście do

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

Spowoduje to wyświetlenie okna przeglądarki z:

Konwerter przeglądarek RGB int 2 hex

Gdzie można obrócić kółko myszy, aby zmienić wartości (z klawiszem Shift przytrzymanym krok po kroku 15) ...

F. Hauri
źródło
W rzeczywistości nie wymagano zakończenia nowej linii i tylko „#” wymaga ucieczki, więc printf \#%02X%02X%02Xwystarczy.
manatwork
Dodano bardziej niekonwencjonalną metodę :
F. Hauri
Lol. Ta wewnętrzna pętla jest rzeczywiście szokująco niekonwencjonalna.
manatwork
@manatwork dzięki, znajduję d+=${c[$b$a 0x10]}coś seksownego !
F. Hauri,
1
... a może d+=${c[$b$a 020]}wykona robotę i będzie ładnie wyglądać
F. Hauri
3

Perl, 31 znaków

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

Tak krótki program trudno jest niekonwencjonalny, ale myślę, że to działa.

chlebak
źródło
Podoba mi się ta odpowiedź :) jeszcze kilka i myślę, że mógłbym się na to zgodzić, gdyby nie było nic lepszego.
Quillion
Chłodny! Tylko unpackpytanie: czy możesz zrobić szesnastkową a ... f wielką literę, jak w pytaniu?
manatwork
@manatwork Próbowałem znaleźć sposób na zrobienie tego w środku unpack, ale bez powodzenia. Jednym ze sposobów jest użycie sprintfzamiast unpack, ale jest to dłuższe i całkowicie ortodoksyjne. Innym sposobem jest po prostu zmodyfikowanie łańcucha na wielkie litery: map{uc unpack H2,chr}kosztem trzech znaków.
breadbox
Dziękuję, @breadbox. Te małe trudne packi unpacknigdy nie wejdą w mój styl kodowania. Więc to jest dla mnie niekonwencjonalne.
manatwork
Zła liczba. To daje 30 znaków!
F. Hauri,
3

Skrypt akcji 3 | 43 znaki

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

Wynik: #483D8B

Ilya Gazman
źródło
Czy nie możesz tu upuścić dużej ilości białej przestrzeni? Nie znam skryptu akcji, ale nie wyglądają na wymagane
Cruncher,
@Cruncher tak przepraszam, jedna z moich pierwszych odpowiedzi tutaj.
Ilya Gazman
2
Na końcu zabij średnik, aby uratować znak
Klamka
3

Perl 24 znaków

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

Przepraszamy, nie jest tak seksowny jak używanie unpack, ale krótszy!

Bardziej niejasna wersja:

Ale jeśli naprawdę wolisz używać unpack, możesz:

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

Na przykład, nie jest to krótsza wersja, ale mi się podoba! (Zwróć uwagę na wykorzystanie randdo randowania tego :-)

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
F. Hauri
źródło
3

> <> 103 60

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

Wykorzystał zmarnowaną białą przestrzeń i przeniósł do niej trochę kodu

Uruchom z danymi z wiersza poleceń:

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

wyjście: „# FF2448”

Cruncher
źródło
Na żądanie udzieli wyjaśnień. Jeśli potrafisz to rozgryźć, wolałbym nie przejmować się
Cruncher
2

Dalej, 62 znaki

: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL
Darren Stone
źródło
nie działa dla 1 1 1, który powinien dać wynik # 010101
maniak zapadkowy
Cześć @ratchetfreak. Mi to pasuje. Właśnie przetestowane z gforth. Daje to 1 1 1wyniki #010101. Wszelkie inne wartości 0-255 również działają. Z jakiego środowiska korzystasz?
Darren Stone
2

C (67 znaków bez płyty głównej)

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

wykorzystanie standardowego printf i bitowego twiddlera

maniak zapadkowy
źródło
Czekaj, readf? Czy nie powinno tak być scanf?
breadbox
@breadbox ah tak, spędziłem zbyt dużo czasu w D; w obu przypadkach nie ma różnicy w liczbie
znaków
2

Dc: 35 32 znaków

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

Przykładowy przebieg:

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 znaków

(Ale potrzebuje liczb wejściowych w osobnych wierszach.)

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

Przykładowy przebieg:

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
człowiek w pracy
źródło
2
Brak wystarczających dcodpowiedzi na tej stronie.
breadbox
2

JavaScript, 89 znaków

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

Konwertuje 72 61 139do 256*(256*(72)+61)+139i evals niego.

Casey Chu
źródło
Fajny, ale nie udaje się na trzeciej próbce zamieszczonej w pytaniu.
manatwork
Ach, dobra rozmowa. Naprawiony.
Casey Chu,
2
Używanie eval('(('+DEC.replace(/ /g,'<<8)+'))zamiast eval('256*(256*('+DEC.replace(/ /g,')+'))pozwala zaoszczędzić 5 znaków!
F. Hauri,
2

PowerShell, 45

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

Lub, jeśli można go użyć poprzez przesłanie danych, możesz po prostu użyć

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

co sprowadza się do 42 .

Joey
źródło
Dobra robota! Pokazy Wciąż muszę się wiele nauczyć o golfie!
Iszi
Och, twój pomysł ze zmiennymi też był sprytny; nigdy by mi nie przyszło do głowy. Tak się składa, że ​​jest dłuższy niż mój zwykły ulubiony: -spliti -join.
Joey,
2

PowerShell 37

zaoszczędzono jeden bajt dzięki TimmyD

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
blabb
źródło
Możesz zaoszczędzić kilka bajtów, pozbywając się, [byte]ponieważ dane wejściowe otrzymaliśmy jako liczby całkowite, i edytuj dane wyjściowe tak, aby "#$o"- co daje 31 bajtów$args|%{$o+="{0:X2}"-f$_};"#$o"
AdmBorkBork
@ TimmyD nie wiem, czy usunięcie [bajtu] działa poprawnie we wszystkich wersjach w wersji, w której testowałem (iirc 2.0 w xp) bez [bajtu] nie było konkatenacji jako szesnastkowe, ale jako ints tj. 72 61 139 to # 7261139 nie # 483d8b "# $ o" wewnątrz cudzysłowów nie jest dosłowne, ale oceniany jest ciekawy, dzięki czemu docenione zostaną komentarze na temat konwersji szesnastkowej
blabb
Najwyraźniej jest to różnica między PowerShell v2 i v3 - musi być coś w tym, jak odpowiednia wersja .NET obsługuje konwersję szesnastkową, ale nie mogę znaleźć dokumentacji na ten temat.
AdmBorkBork,
2

R, 16 bajtów

Otóż ​​to. Użyj wbudowanego.

rgb(r,g,b,m=255)
J.Doe
źródło
1

C, 67 73 znaków (65 znaków bez głównego)

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

Nudny program C - bardzo ortodoksyjny.

Ian James
źródło
nie działa z ab lub c mniejszym niż 16
maniak zapadkowy
Zmieniono% X na% 02X.
Ian James
1

Python 2.7 (80 znaków)

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

Szukam lepszego sposobu obsługi jednocyfrowych wartości szesnastkowych. Jakieś pomysły?

Will Coggins
źródło
Może użyć ciągów formatu? „% 02x” wydaje się być tym, co zrobili wszyscy inni.
jqblz,
1

Befunge-98, 45 znaków

Bleh, zduplikowany kod. No cóż. Prosta implementacja konwersji radix.

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

Przykładowy przebieg

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

(Uwaga: wypisuje „#” przed odczytem danych wejściowych --- zadanie nie zabrania tego; biorąc pod uwagę trzy liczby na standardowym wyjściu, tworzy prawidłowe wyjście na standardowym wyjściu. Nie przeszkadza to również w znakach nowej linii i jak widać, nie robi tego „dodaj” # poprawnie, gdy uruchomisz „interaktywnie”).

Robaczek świętojański
źródło
1

Game Maker Language, 175 (Błąd na pozycji 81)

Monituje o 3 do 9 cyfr RGB. Zwraca wartość szesnastkową ze znakiem szesnastkowym GML,$

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

Zrób z tego skrypt. Również skompiluj z niezainicjowanymi zmiennymi traktowanymi jako 0.

Źródło

Timtech
źródło
1

Gema, 93 znaki

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

Przykładowy przebieg:

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
człowiek w pracy
źródło
1

Burlsque, 12 bajtów (10 bajtów dla małych liter)

Jeśli dozwolone są również małe litery, to 10 bajtów:

psb6\['#+]

Stosowanie:

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

Jeśli rozpaczliwie potrzebujesz dużych liter, dodaj ZZ:

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

Jeśli nie otrzymasz liczb całkowitych jak w ciągu, przejdź do:

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

Wyjaśnienie:

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

Spróbuj online tutaj .

Premia:

Aby go przekonwertować, użyj tego:

blsq ) "#483d8b"[-2cob6
{72 61 139}
mroman
źródło
1

PowerShell, 28 bajtów

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

Skrypt testowy:

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

Wynik:

True: #483D8B
True: #4B0082
True: #00FF7F
mazzy
źródło
0

Python 3.3 @ 60 znaków

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

Nie mogłem się oprzeć:

[dan@danbook:code_golf/int_to_hex]$ python3.3 int_to_hex.py
176 11 30
#B00B1E
Danmcardle
źródło
0

Clojure 76 znaków

Może to być późno, ze względu na kompletność:

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

Przykładowe wywołania:

(hexy 0 255 127)
"#00FF7F"
Lynx Luna
źródło
0

Mathematica, 40 znaków

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

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

f /@ rgbs // Column

# 483d8b

# 4b0082

# 00ff7f

Chris Degnen
źródło
0

Common Lisp, 39 znaków

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

Przeczytaj trzy liczby całkowite, zwróć ciąg.

rdzeń rdzeniowy
źródło
0

JavaScript ES6, 63 bajty

h=>'#'+h.split` `.map(x=>(x<16?0:'')+(x*1).toString(16)).join``
Mama Fun Roll
źródło
Przypadkowo skończyło się na tym, że napisałem prawie dokładnie to samo, co ty, zanim zobaczyłem twój. Bardzo fajnie =) Są na tyle blisko, że nie opublikuję mojego, ale możesz zaoszczędzić kilka bajtów na swoim mapowaniu za pomocą:x=>(x<16?0:'')+x.toString(16)
Mwr247
1
Nie trzeba też dołączać r=na początku. Nadal liczy się jako funkcja nawet jako funkcja anonimowa, ponieważ można ją wywoływać bez konieczności przypisywania czegokolwiek.
Mwr247,
Ups Oznaczono, że mapa: x=>(x<16?0:'')+(x*1).toString(16)Twoja i moja pierwsza podają obecnie nieprawidłowe wartości dla x>9.
Mwr247,
To obecnie zwraca #7261139zamiast #483D8Bpierwszego przypadku testowego.
Dennis,
0

Python 2, 40 bajtów

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

Odczytuje dane wejściowe z trzech oddzielnych linii. Nadużycia execi mnożenie ciągów.

Przykładowe użycie:

$ python2 rgbint.py
72
61
139
#483D8B

$ python2 rgbint.py
75
0
130
#4B0082

$ python2 rgbint.py
0
255
127
#00FF7F
jqblz
źródło
0

Python (55 znaków)

'#'+''.join([hex(int(i))[2:].upper() for i in input()])
Dhruv Ramani
źródło