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


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

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

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$

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

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


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.


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


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

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"


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

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


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

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.


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 .


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

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)

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.


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?


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


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


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

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}

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

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

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"

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


0

Lisp commun, 39 caractères

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

Lisez trois entiers, renvoyez une chaîne.


0

Javascript ES6, 63 octets

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

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

0

Python (55 caractères)

'#'+''.join([hex(int(i))[2:].upper() for i in input()])
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.