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


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

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

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$

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)
    }
)

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) ...


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.


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


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

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”


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

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


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

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.


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 .


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

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)

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.


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?


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”).


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


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

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}

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

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

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"

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


0

Common Lisp, 39 znaków

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

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


0

JavaScript ES6, 63 bajty

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.