Couleur RVB int à hex

13

Étant donné trois entiers rgb, affichez la représentation hexadécimale sous forme de chaîne.

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

Victoires de code les plus peu orthodoxes les plus courtes

Quillion
la source
16
Notre FAQ dit que toutes les questions sur ce site ... devraient avoir un critère de gain principal objectif, de sorte qu'il est possible de décider de manière incontestable quelle inscription devrait gagner. . Le plus court est objectif, mais «le plus peu orthodoxe» ne l'est pas. De plus, la balise code-golf ne doit être utilisée que si la condition gagnante est juste le code le plus court; et la balise code-challenge ne doit être utilisée que si la balise code-golf ne l'est pas.
Peter Taylor
et accepter le gagnant avant un certain temps (dans ce cas, ce n'était même pas 24h) décourage de nouvelles contributions ...
woliveirajr
@PeterTaylor Désolé, je vais m'assurer de lire les lignes directrices à partir de maintenant :( Je suppose que vous avez raison, peu orthodoxe est très vague
Quillion

Réponses:

14

Ruby: 19 caractères

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

Exemple d'exécution:

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
homme au travail
la source
16

Rubis

J'allais plus pour la partie "peu orthodoxe". ;)

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

La police (sur mon navigateur Web) est un peu grande, donc elle a l'air déformée, mais elle est meilleure dans Courier New:

image

Exemple d'exécution:

c:\a\ruby>rgb2hex
255 100 0
#FF6400
Poignée de porte
la source
C'est génial!
Albert Renshaw
6

q / k (3 caractères)

Pas exactement peu orthodoxe mais assez court

4h$

Exemple

q)4h$ 72 61 139
0x483d8b

Pour correspondre exactement au format de sortie de la question, nous pouvons faire (pour 9 caractères):

"#",/$4h$
skeevey
la source
1
Il manque le signe dièse (#) requis par les sorties d'échantillon dans la question.
Iszi
5

PowerShell: 71 52 51 41

Merci à @manatwork pour avoir souligné que ForEach-Objectpeut être utilisé à la place d'une forboucle.
Merci à @Joey d'avoir souligné que je pouvais l'utiliser -joinsur la sortie de la boucle, au lieu d'avoir à la mettre en variables.

Code golf:

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

Remarque:

Il n'y a pas d'erreur lors de la vérification des entrées non valides. Le script prendra volontiers 256, 4096 et 65536 comme entrées, puis la sortie # 100100010000 (qui ne fonctionnera évidemment pas en RVB).

Non golfé, avec commentaires:

# 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
la source
Faites la boucle foreach($i in 1,2,3)pour la réduire à 68 caractères.
manatwork
@manatwork Je ne pense pas que ce soit la syntaxe appropriée pour un foreachdans PowerShell. (Au moins, je n'ai pas pu faire fonctionner certains tests.) Cependant, en utilisant la bonne syntaxe, un alias intégré et un autre raccourci PowerShell que j'ai récemment découvert, je pense que j'ai quelque chose de mieux, le rasage 12 autres caractères de votre suggestion. (1..3)|%{...}(Insérez la déclaration entre crochets du script existant à la place des points de suspension.) J'ai encore besoin de tester complètement cela dans le script, mais merci de m'avoir pointé dans cette direction!
Iszi
foreachJe ne sais pas si c'est la bonne syntaxe ou non, mais la référence SS64 la mentionne et cela fonctionne pour moi. (Aucune idée de la version. Celle fournie avec Windows 7.)
manatwork
@manatwork C'est intéressant. Je voudrais creuser et découvrir ce qui ne va pas avec ça (je recevais des erreurs de "jeton inattendu" ... "). Il est possible que l'article SS64 ait été écrit pour une version différente de PowerShell - je ne suis pas sûr. Pour l'instant, j'ai confirmé que cela (1..3)|%fonctionne et ramène le script à 56 caractères. Je vais éditer cela dans la réponse, et je vous créditerai certainement pour l'idée. Merci encore!
Iszi
2
Oh, dang. Vous pouvez obtenir ce à 41 en utilisant -join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
Joey
4

bash 22 21 caractères

(Merci @manatwork pour 1 caractère en utilisant \au lieu de guillemets doubles)

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

ou lire STDIN en boucle: 48 caractères:

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

Ajouté le 06-10-2015: bash ( méthode plus peu orthodoxe ) 84 83 caractères

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

Je sais, ce pourrait être 82 caractères si 020c'est écrit 16, mais je préfère ça ... Ou peut-être d+=${c[$b$a 0x10]}qui était le premier 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

Une autre approche

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

Cela affichera une fenêtre de navigateur, avec:

RGB int 2 hex viewer converter

Où vous pouvez faire tourner la molette pour changer les valeurs (avec la touche Maj enfoncée pour l'étape par 15) ...

F. Hauri
la source
En fait, la nouvelle ligne de fin n'a pas été demandée et seul "#" doit être échappé, c'est donc printf \#%02X%02X%02Xsuffisant.
manatwork
Ajout d'une méthode plus peu orthodoxe :
F. Hauri
Lol. Cette boucle intérieure est en effet scandaleusement peu orthodoxe.
manatwork
@manatwork merci, je trouve d+=${c[$b$a 0x10]}quelque chose de sexy !
F.Hauri
1
... ou peut-être d+=${c[$b$a 020]}fera le travail et aura fière allure
F. Hauri
3

Perl, 31 caractères

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

Il est difficile de rendre un programme aussi court non orthodoxe, mais je pense que cela fonctionne.

boite à pain
la source
J'aime cette réponse :) un peu plus et je pense que je pourrais m'installer si rien de mieux ne se déroule.
Quillion
Cool! Juste une unpackquestion: pouvez-vous mettre le hexadécimal a..f en majuscule, comme dans la question?
manatwork
@manatwork J'ai essayé de trouver un moyen de le faire à l'intérieur unpack, mais pas de chance. Une façon est d'utiliser sprintfau lieu de unpack, mais c'est plus long et complètement orthodoxe. L'autre façon consiste simplement à modifier la chaîne en majuscules:, map{uc unpack H2,chr}au coût de trois caractères.
boîte à pain
Merci, @breadbox. Ces petits rusés packet n'entrent unpackjamais dans mon style de codage. Donc, c'est assez peu orthodoxe pour moi.
manatwork
Mauvais compte. Cela fait 30 caractères!
F.Hauri
3

Script d'action 3 | 43 caractères

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

Production: #483D8B

Ilya Gazman
la source
Ne pouvez-vous pas laisser tomber beaucoup d'espace blanc ici? Je ne connais pas le script d'action, mais ils ne semblent pas nécessaires
Cruncher
@Cruncher ouais désolé, une de mes premières réponses ici.
Ilya Gazman
2
Tuez le point-virgule à la fin pour enregistrer un personnage
Poignée de porte
3

Perl 24 caractères

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

Désolé, ce n'est pas aussi sexy que d'utiliser unpack, mais plus court!

Version plus obscure:

Mais si vous préférez vraiment utiliser unpack, vous pouvez:

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

Par exemple, ce n'est pas la version courte, mais j'aime ça! (Notez l'utilisation de randpour randonner ceci :-)

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
la source
3

> <> 103 60

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

Utilisé l'espace blanc gaspillé et y déplacé du code

Exécuter avec des entrées de ligne de commande:

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

sortie: "# FF2448"

Cruncher
la source
Fournira des explications sur demande. Si vous pouvez le comprendre, je préfère ne pas déranger
Cruncher
2

En avant, 62 caractères

: D 0 <<# # # #> TYPE #>> ; 35 EMIT HEX SWAP ROT D D D DECIMAL
Darren Stone
la source
ne fonctionne pas pour 1 1 1 qui devrait sortir # 010101
ratchet freak
Salut @ratchetfreak. Ça marche pour moi. Je viens de tester avec gforth. Lui donner des 1 1 1sorties #010101. Toutes les autres valeurs 0-255 fonctionnent également. Quel environnement utilisez-vous?
Darren Stone
2

C (67 caractères sans passe-partout principal)

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

l'utilisation standard de tourbière printf & bit twiddler

monstre à cliquet
la source
Attends readf? N'est-ce pas scanf?
boîte à pain
@breadbox ah ouais j'ai passé trop de temps en D; de toute façon, aucune différence dans le nombre de caractères
monstre à cliquet
2

Dc: 35 32 caractères

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

Exemple d'exécution:

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 caractères

(Mais a besoin des numéros d'entrée sur des lignes distinctes.)

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

Exemple d'exécution:

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
homme au travail
la source
2
Il n'y a pas assez de dcréponses sur ce site.
boîte à pain
2

JavaScript, 89 caractères

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

Convertis 72 61 139à 256*(256*(72)+61)+139et evals il.

Casey Chu
la source
Nice one, mais échoue sur le 3ème échantillon affiché dans la question.
manatwork
Ah, bon appel. Fixé.
Casey Chu
2
En utilisant eval('(('+DEC.replace(/ /g,'<<8)+'))au lieu de eval('256*(256*('+DEC.replace(/ /g,')+'))vous permettre d'économiser 5 caractères!
F.Hauri
2

PowerShell, 45

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

Ou, s'il peut être utilisé en canalisant les données, vous pouvez simplement utiliser

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

ce qui le ramène à 42 .

Joey
la source
Bon travail! Montre que j'ai encore beaucoup à apprendre sur le golf!
Iszi
Oh, votre idée avec les variables était intelligente aussi; n'aurait jamais traversé mon esprit. Il se trouve que c'est plus long que mon préféré habituel: -splitet -join.
Joey
2

PowerShell 37

sauvé un octet grâce à 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
la source
Vous pouvez enregistrer quelques octets en vous débarrassant du [byte]car nous recevons l'entrée sous forme d'entiers, et modifiez votre sortie pour qu'elle soit "#$o"- ce qui donne 31 octets pour$args|%{$o+="{0:X2}"-f$_};"#$o"
AdmBorkBork
@TimmyD ne sait pas si la suppression de [octet] fonctionne correctement dans toutes les versions dans une version dans laquelle j'ai testé (iirc 2.0 en xp) sans [octet], il ne concaténait pas en hexadécimal mais en pouces, c'est-à-dire que 72 61 139 était # 7261139 et non # 483d8b "# $ o" entre guillemets n'est pas une chaîne littérale mais une chaîne évaluée agréable à savoir merci des commentaires sur la conversion hexadécimale seront appréciés
blabb
C'est apparemment une différence entre PowerShell v2 et v3 - doit être quelque chose dans la façon dont la version .NET correspondante gère la conversion hexadécimale, mais je ne trouve pas de documentation à ce sujet.
AdmBorkBork
2

R, 16 octets

C'est ça. Utilisez le intégré.

rgb(r,g,b,m=255)
J.Doe
la source
1

C, 67 73 caractères (65 caractères hors principal)

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

Programme Boring C - très orthodoxe.

Ian James
la source
ne fonctionne pas avec ab ou c inférieur à 16
ratchet freak
% X remplacé par% 02X.
Ian James
1

Python 2.7 (80 caractères)

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

Je cherche un meilleur moyen de gérer les valeurs hexadécimales à un chiffre. Des idées?

Will Coggins
la source
Peut-être utiliser des chaînes de format? '% 02x' semble être ce que tout le monde a fait.
jqblz
1

Befunge-98, 45 caractères

Bleh, code dupliqué. Tant pis. Juste une implémentation simple de la conversion radix.

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

Exemple d'exécution

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

(Remarque: imprime '#' avant de lire l'entrée --- la tâche ne l'interdit pas; étant donné trois chiffres sur stdin, elle produit la bonne sortie sur stdout. Elle ne dérange pas non plus avec les nouvelles lignes, et comme vous pouvez le voir, elle ne le fait pas 'ajoutez pas' # 'correctement quand il est exécuté "de manière interactive".)

Luciole
la source
1

Game Maker Language, 175 (erreur en position 81)

Invite pour RVB de 3 à 9 chiffres. Renvoie hexadécimal avec le signe hexadécimal 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

Faites-en un script. Compilez également avec des variables non initialisées traitées comme 0.

La source

Timtech
la source
1

Gema, 93 caractères

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

Exemple d'exécution:

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
homme au travail
la source
1

Burlsque, 12 octets (10 octets pour les minuscules)

Si les minuscules sont également autorisées, alors 10 octets:

psb6\['#+]

Usage:

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

Si vous avez désespérément besoin de majuscules, ajoutez ZZ:

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

Si vous ne recevez pas les entiers comme dans une chaîne, alors allez avec:

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

Explication:

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

Essayez en ligne ici .

Prime:

Pour le reconvertir, utilisez ceci:

blsq ) "#483d8b"[-2cob6
{72 61 139}
mroman
la source
1

Powershell, 28 octets

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

Script de test:

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

Production:

True: #483D8B
True: #4B0082
True: #00FF7F
mazzy
la source
0

Python3.3 @ 60 caractères

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

Impossible de résister:

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

Clojure 76 Personnages

Cela pourrait être en retard, par souci d'exhaustivité:

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

Exemples d'appels:

(hexy 0 255 127)
"#00FF7F"
Lynx Luna
la source
0

Mathematica, 40 caractères

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

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

f /@ rgbs // Column

# 483d8b

# 4b0082

# 00ff7f

Chris Degnen
la source
0

Lisp commun, 39 caractères

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

Lisez trois entiers, renvoyez une chaîne.

coredump
la source
0

Javascript ES6, 63 octets

h=>'#'+h.split` `.map(x=>(x<16?0:'')+(x*1).toString(16)).join``
Mama Fun Roll
la source
Par coïncidence, j'ai fini par écrire presque exactement la même chose que vous avant de voir la vôtre. Très bien =) Ils sont assez proches pour que je ne poste pas le mien, mais vous pouvez économiser quelques octets sur votre mappage avec ceci:x=>(x<16?0:'')+x.toString(16)
Mwr247
1
Aussi, pas besoin d'inclure r=le début. Il compte toujours comme une fonction même comme une fonction anonyme, puisque vous pouvez l'invoquer sans avoir à assigner quoi que ce soit.
Mwr247
Oups. La carte devait être: la x=>(x<16?0:'')+(x*1).toString(16)vôtre et ma première là-bas donnent actuellement des valeurs erronées x>9.
Mwr247
Cela renvoie actuellement #7261139au lieu de #483D8Bpour le premier cas de test.
Dennis
0

Python 2, 40 octets

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

Lit l'entrée sur trois lignes distinctes. Abus execet multiplication de chaînes.

Exemple d'utilisation:

$ python2 rgbint.py
72
61
139
#483D8B

$ python2 rgbint.py
75
0
130
#4B0082

$ python2 rgbint.py
0
255
127
#00FF7F
jqblz
la source
0

Python (55 caractères)

'#'+''.join([hex(int(i))[2:].upper() for i in input()])
Dhruv Ramani
la source