Lisez la couleur à ma façon


16

Différents systèmes ont différentes manières de décrire les couleurs, même si tous parlent dans l'espace RGBA. Un développeur frontal familier avec CSS peut préférer #RRGGBBAA. Mais les développeurs Android peuvent préférer #AARRGGBB. Lors de la gestion du format de fichier AAS, #AABBGGRRest nécessaire. C'est trop déroutant. Peut-être que nous avons besoin d'un programme qui peut convertir entre différents formats de couleurs.

Contribution:

L'entrée contient 3 parties:

  • La couleur à transformer (par exemple #1459AC0F), une chaîne commençant par un signe pointu #suivi de 8 chiffres hexadécimaux.
  • Le format de la couleur donnée (par exemple #RRGGBBAA), une chaîne commençant par #suivie de 8 lettres qui se répartissent en 4 groupes différents et chaque groupe est l'un des RR/ GG/ BB/ AA.
  • Format de conversion.

Production:

  • Sortie de la couleur au format converti

Cas de test:

Color, OriginalFormat, TargetFormat -> Result
#12345678, #RRGGBBAA, #AARRGGBB -> #78123456
#1A2B3C4D, #RRGGBBAA, #AABBGGRR -> #4D3C2B1A
#DEADBEEF, #AARRGGBB, #GGBBAARR -> #BEEFDEAD

Les entrées / sorties ne sont pas sensibles à la casse. Vous pouvez entrer / sortir de n'importe quelle manière acceptable.

Règles:

Il s'agit du code golf, les codes les plus courts (en octets) de chaque langue gagnent


AARRGGBBest objectivement le meilleur format de couleur. Si quelque chose attend 24 bits RRGGBBet que vous lui donnez 32 bits à la AARRGGBBplace, il peut simplement ignorer l'octet supérieur et continuer à fonctionner.
12Me21

2
La couleur DEADBEEF ressemble un peu au saumon.
Urne de poulpe magique

1
Je suis un développeur Web frontal depuis des années maintenant et je n'avais jamais entendu parler de #RRGGBBAA jusqu'à aujourd'hui, j'aimerais que plus de navigateurs le prennent en charge.
DasBeasto

@ 12Me21 Et la question suivante est de savoir quelle endianité est la meilleure.
tsh

Réponses:


10

APL (Dyalog Unicode) , 6 octets SBCS

Programme complet. Invite sur STDIN pour Original, puis Target, puis Color. Imprime le résultat sur STDOUT.

⍞[⍞⍋⍞]

Essayez-le en ligne!

   invite pour l'original

⍞⍋ demander Target et trouver les indices dans Original qui feraient de Original dans Target

⍞[] Demander Color et utiliser les indices obtenus ci-dessus pour réorganiser Color


8

JavaScript (ES6), 53 52 octets

1 octet enregistré grâce à @tsh

Prend comme entrée 3 paramètres distincts: (Color, From, To).

(C,F,T)=>T.replace(/\w/g,(x,i)=>C[F.search(x)-~i%2])

Essayez-le en ligne!


(C,F,T)=>T.replace(/\w/g,(x,i)=>C[F.search(x)-~i%2])enregistrer un octet
tsh

@tsh Nice one. ^^
Arnauld

5

Stax , 8 octets

ç▼☺↔kàÅJ

Exécuter et déboguer

Ce programme accepte les entrées dans ce format.

"{Color}" "{OriginalFormat}" "{TargetFormat}"

Voici la version non compressée non compressée commentée du même programme.

u       drop duplicated characters from target format
{       for each character remaining in target format, map using block...
  [     duplicate original format at second position in stack
  |I    get all indices of target character in original format
  xs@   retrieve characters from those indices from the color string
m       perform map
        output implicitly when complete

Exécutez celui-ci



4

Retina 0.8.2 , 33 octets

(.)(?<=(..).{7}\1\1.*)\1
$2
.*#
#

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

(.)(?<=(..).{7}\1\1.*)\1
$2

Pour chaque paire de caractères identiques, regardez en arrière pour une autre copie de cette paire, puis les 9e et 8e caractères avant cela, et remplacez la paire par ces caractères. Cela n'est possible que pour les paires de caractères dans le format cible et les remplace par le résultat souhaité.

.*#
#

Supprimez la couleur et le format source.


3

Haskell , 108104100 94 87 octets

(s,(r@(x,y):z))!c|x==c=(s++[y],z)|(p,q)<-(s,z)!c=(p,r:q)
c%i=fst.(foldl(!)("",zip i c))

Essayez-le en ligne!


Ancienne version

Merci à Laikoni d'avoir raccourci 6 octets en trouvant une façon plus courte d'utiliser lookup!

f(Just x)=x
p('#':z)=p z
p(x:y:z)=[x,y]:p z
p e=[]
c!i=('#':).(f.(`lookup`zip(p i)(p c))=<<).p

Essayez-le en ligne!

Explication:

  • la pfonction "analyse" une chaîne en ignorant les #groupes (listes) de début et de retour de 2 caractères.
  • l' (!)opérateur prend en entrée la couleur et le format d'entrée et renvoie une fonction qui prend en paramètre le format de sortie et renvoie la couleur convertie. Il s'est avéré que la version sans point était plus courte, mais j'ai commencé avec la version plus lisible:

f c i o='#':concat[x#zip(p<$>[i,c])|x<-p o]

Essayez-le en ligne!


3

Perl 5 -p , 33 32 27 octets

Donnez une entrée dans l'ordre: cible, original, nombre

#!/usr/bin/perl -p
s%.%$2x/(..)+$&(.){10}/g%eg

Essayez-le en ligne!

Pour chaque caractère dans l'entrée, trouvez le même caractère un nombre pair de places en avant puis à partir de là, avancez de 10 caractères supplémentaires et prenez ce caractère en remplacement. Si vous ne pouvez pas faire ces étapes, remplacez-les par rien.

    +--even-+----10---+   
    |       |         |
#AARRGGBB #RRGGBBAA #12345678
    |    >-will get removed-<
    v
    2

2

05AB1E , 10 octets

2FI2ô™J}I‡

Essayez-le en ligne!


2F     }   # Loop twice...
  I        # First 2 inputs.
   2ô™     # Title case in pairs of 2.
      J    # Rejoin together.
        I  # Last input (The color).
         ‡ # Transliterate, put color in pattern from a into pattern from b.

Cela fonctionne parce que je change l'entrée de:

AARRGGBB

À:

AaRrGgBb

Donc, chaque valeur est mappée de manière unique, alors je peux utiliser translittération.

Les arguments sont inversés.


2

Java 10, 179 105 102 octets

(a,b,c)->{var r="#";for(int i=1,t;i<9;)r+=a.substring(t=b.indexOf(c.substring(i,i+=2)),t+2);return r;}

Soit -77 octets grâce à @ OlivierGrégoire .

Explication:

Essayez-le en ligne.

(a,b,c)->{            // Method with String as three parameters and return-type
  var r="#";          //  Result-String, starting at "#"
  for(int i=1,t;i<9;  //  Loop `i` from 1 to 9 (exclusive)
    r+=               //   Append the result with:
       a.substring(   //    A substring from the first input,
        t=b.indexOf(  //    where an index is determined in the second input
           c.substring(i,i+=2)),t+2);
                      //    based on a substring of the third input
    return r;}        //  Return the result-String

1
105 octets Construit la chaîne à partir de la cible en recherchant l'élément cible au format source.
Olivier Grégoire

@ OlivierGrégoire Je savais que ce serait possible sans cette satanée carte. Merci beaucoup, -74 octets juste là!
Kevin Cruijssen du

102 octets en passant à Java 10, désormais pris en charge sur TIO.
Olivier Grégoire

2

J , 5 octets

/:i./

L'argument de gauche est la couleur. L'argument de droite est une matrice de caractères où la première ligne est le format cible et la deuxième ligne est le format d'origine. Essayez-le en ligne!


1

CJam, 14 octets

{'#\1f>2f/~er}

Essayez-le en ligne!

L'entrée est un tableau dans l'ordre inverse.

{
 `#\      e# Push '#'+[input array] on to stack
  1f>     e# Remove the '#' symbol from each input string
  2f/     e# Split each input string into an array of substrings of length 2.
  ~       e# Dump the substring-arrays from the container array onto the stack
  er      e# Perform a string replace operation
}     

0

Python 2, 62 octets

lambda c,s,e:[c[s.index(e[i]):][:2]for i in range(1,len(e),2)]

0

SmileBASIC, 144 octets

DEF R C,I,O
C[0]="&H
A=R+G+B
RGBREAD VAL(C)OUT VAR(I[1]),VAR(I[3]),VAR(I[5]),VAR(I[7])?"#";RGB(VAR(O[1]),VAR(O[3]),VAR(O[5]),VAR(O[7]))END




0

C (clang) , 89 octets

char *a,b[10],*i,*o;f(x,y){*b=*a;for(x=1;x<8;b[x++]=a[y=index(i,o[x])-i],b[x++]=a[y+1]);}

Essayez-le en ligne!

Prend la valeur d'entrée dans a, au format dans iet hors format o. Renvoie la valeur dansb

Triche mineure: stocker le résultat au blieu d'imprimer pour économiser des octets. La question ne l'interdit pas.

C (clang) , 100 octets

char *a,b[10],*i,*o;f(x,y){*b=*a;for(x=1;x<8;b[x]=a[y=index(i,o[x])-i],b[x+1]=a[y+1],x+=2);puts(b);}

Essayez-le en ligne!

C (gcc) , 181 octets

char *a,*i,*o;c[4],x,y,z;g(x){x=x==82?0:x==71?1:x==66?2:3;}f(){a++;for(;z<2;z++){i=(z?o:i)+1;for(y=0;y<7;z?printf("%s%2X","#"+!!y,c[g(i[y])]):sscanf(a+y,"%2X",&c[g(i[y])]),y+=2);}}

Essayez-le en ligne!

Crée une RGBAvaleur dans un c[]tableau en fonction du format i, puis imprime au oformat


Suggérer à la char*a,b[10],*i,*o;f(x)place de char *a,b[10],*i,*o;f(x,y)et x+=2)bcopy(a+(long)index(i,o[x])-i,b+x,2);au lieu deb[x++]=a[y=index(i,o[x])-i],b[x++]=a[y+1]);
plafondcat

0

Clojure 1.8, 156 octets

(fn[c o t](reduce #(str %(val %2))""(sort-by key(reduce-kv #(let[s(clojure.string/index-of t(nth o %2))](assoc %(if(contains? % s)(inc s)s)%3)){}(vec c)))))

Non golfé

  (fn [c o t]
    (reduce
     #(str % (val %2))
     ""
     (sort-by key
              (reduce-kv
               #(let [s (clojure.string/index-of t (nth o %2))]
                  (assoc %
                         (if (contains? % s) (inc s) s)
                         %3))
               {}
               (vec c)))))

L'essayer en ligne ne prend pas en charge Clojure 1.8. Très étrange!


0

Perl 6 , 55 51 46 octets

{[~] %(@^b Z=>@^a){@^c}}o*.map(*.comb(/\w?./))

Essayez-le en ligne!

Prend une liste (couleur, original, cible) en entrée. Fractionne chaque chaîne d'entrée en composants, crée un hachage mappant les clés source aux valeurs de couleur, recherche les valeurs de couleur dans l'ordre de clé cible, puis formate le résultat.

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.