Lies Farbe auf meine Weise


16

Verschiedene Systeme haben unterschiedliche Möglichkeiten, Farben zu beschreiben, auch wenn alle im RGBA-Raum sprechen. Ein Front-End-Entwickler, der mit CSS vertraut ist, mag es vorziehen #RRGGBBAA. Aber Android-Entwickler mögen es vorziehen #AARRGGBB. Beim Umgang mit AAS-Dateiformat #AABBGGRRwird benötigt. Das ist zu verwirrend. Vielleicht brauchen wir ein Programm, das zwischen verschiedenen Farbformaten konvertieren kann.

Eingang:

Die Eingabe enthält 3 Teile:

  • Die Farbe, die transformiert werden soll (z. B. #1459AC0Feine Zeichenfolge, die mit einem scharfen Vorzeichen #gefolgt von 8 hexadezimalen Ziffern beginnt) .
  • Das Format der angegebenen Farbe (z. B. #RRGGBBAAeine Zeichenfolge, die mit #8 Buchstaben beginnt und in 4 verschiedene Gruppen unterteilt ist. Jede Gruppe ist eine von RR/ GG/ BB/ AA.
  • Das Format, in das konvertiert werden soll.

Ausgabe:

  • Ausgabe der Farbe in konvertiertem Format

Testfälle:

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

Eingabe / Ausgabe unterscheidet nicht zwischen Groß- und Kleinschreibung. Sie können auf jede akzeptable Weise Daten eingeben / ausgeben.

Regeln:

Dies ist Code Golf, der kürzeste (in Byte) Code für jeden Sprachgewinn


AARRGGBBist objektiv das beste Farbformat. Wenn etwas 24 Bit erwartet RRGGBBund Sie AARRGGBBstattdessen 32 Bit angeben, kann es das obere Byte einfach ignorieren und trotzdem funktionieren.
12. Mai,

2
Die Farbe DEADBEEF sieht ein wenig lachsfarben aus.
Magic Octopus Urn

1
Ich bin seit Jahren ein Front-End-Web-Entwickler und hatte bis heute noch nie von #RRGGBBAA gehört. Ich wünschte, es würden mehr Browser unterstützt.
DasBeasto

@ 12Me21 Und die nächste Frage ist, welches Endianness besser ist.
Dienstag,

Antworten:


10

APL (Dyalog Unicode) , 6 Byte SBCS

Volles Programm. Fordert bei STDIN zur Eingabe von Original, Ziel und Farbe auf. Gibt das Ergebnis an STDOUT aus.

⍞[⍞⍋⍞]

Probieren Sie es online!

   Eingabeaufforderung für Original

⍞⍋ Eingabeaufforderung für Ziel und suchen Sie die Indizes in Original, die Original in Ziel machen würden

⍞[... ] fragen Sie nach Farbe und verwenden Sie die oben erhaltenen Indizes, um die Farbe neu zu ordnen


8

JavaScript (ES6), 53 52 Bytes

1 Byte dank @tsh gespeichert

Nimmt die Eingabe als 3 verschiedene Parameter: (Color, From, To).

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

Probieren Sie es online!


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

@tsh Schöne. ^^
Arnauld

5

Stax , 8 Bytes

ç▼☺↔kàÅJ

Führen Sie es aus und debuggen Sie es

Dieses Programm nimmt Eingaben in diesem Format vor.

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

Hier ist die kommentierte ungolfed entpackte Version desselben Programms.

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

Führen Sie dieses aus



4

Retina 0.8.2 , 33 Bytes

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

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

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

Suchen Sie für jedes Paar identischer Zeichen nach einer weiteren Kopie dieses Paares und danach nach dem neunten und achten Zeichen davor und ersetzen Sie das Paar durch diese Zeichen. Dies ist nur für die Zeichenpaare im Zielformat möglich und ersetzt sie durch das gewünschte Ergebnis.

.*#
#

Löschen Sie die Farbe und das Quellformat.


3

Haskell , 108 104 100 94 87 Bytes

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

Probieren Sie es online!


Alte Version

Vielen Dank an Laikoni für die Verkürzung von 6 Bytes durch die Suche nach einer kürzeren Verwendungsart 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

Probieren Sie es online!

Erläuterung:

  • Die pFunktion "analysiert" einen String, indem sie die führenden #und zurückkommenden Gruppen (Listen) von 2 Zeichen ignoriert .
  • Der (!)Bediener nimmt die Farbe und das Eingabeformat als Eingabe und gibt eine Funktion zurück, die das Ausgabeformat als Parameter nimmt und die konvertierte Farbe zurückgibt. Es stellte sich heraus, dass die pointfree-Version kürzer war, aber ich begann mit der besser lesbaren Version:

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

Probieren Sie es online!


3

Perl 5 -p , 33 32 27 Bytes

Geben Sie Eingaben in der Reihenfolge ein: Ziel, Original, Nummer

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

Probieren Sie es online!

Finden Sie für jedes Zeichen in der Eingabe dasselbe Zeichen eine gerade Anzahl von Stellen vorwärts, dann gehen Sie von dort aus 10 weitere Zeichen vorwärts und nehmen Sie dieses Zeichen als Ersatz. Wenn Sie diese Schritte nicht ausführen können, ersetzen Sie sie durch nichts.

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

2

05AB1E , 10 Bytes

2FI2ô™J}I‡

Probieren Sie es online!


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.

Das funktioniert, weil ich die Eingabe von:

AARRGGBB

Zu:

AaRrGgBb

Jeder Wert ist also eindeutig zugeordnet, dann kann ich Transkription verwenden.

Die Argumente sind umgekehrt.


2

Java 10, 179 105 102 Bytes

(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;}

Satte -77 Bytes dank @ OlivierGrégoire .

Erläuterung:

Probieren Sie es online aus.

(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 Byte Erstellt die Zeichenfolge aus dem Ziel, indem das Zielelement im Quellformat gefunden wird.
Olivier Grégoire

@Oliviergrégoire Ich wusste, dass es ohne diese lästige Map möglich wäre. Vielen Dank, -74 Bytes genau dort!
Kevin Cruijssen

102 Bytes durch Umstellung auf Java 10, das jetzt von TIO unterstützt wird.
Olivier Grégoire

2

J , 5 Bytes

/:i./

Das linke Argument ist die Farbe. Das rechte Argument ist eine Zeichenmatrix, in der die erste Zeile das Zielformat und die zweite Zeile das Originalformat ist. Probieren Sie es online!


1

CJam, 14 Bytes

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

Probieren Sie es online!

Die Eingabe ist ein Array in umgekehrter Reihenfolge.

{
 `#\      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 Bytes

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

0

SmileBASIC, 144 Bytes

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 Bytes

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

Probieren Sie es online!

Nimmt den Eingabewert in a, in das Format in iund out in das Format in auf o. Gibt den Wert in ausb

Kleiner Cheat: Ergebnis speichern bstatt drucken, um Bytes zu sparen. Frage lässt es nicht zu.

C (clang) , 100 Bytes

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

Probieren Sie es online!

C (gcc) , 181 Bytes

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

Probieren Sie es online!

Erstellt einen RGBAWert im c[]Array basierend auf dem Format iund druckt dann im oFormat


Schlagen char*a,b[10],*i,*o;f(x)statt char *a,b[10],*i,*o;f(x,y)und x+=2)bcopy(a+(long)index(i,o[x])-i,b+x,2);stattb[x++]=a[y=index(i,o[x])-i],b[x++]=a[y+1]);
Ceilingcat

0

Clojure 1.8, 156 Bytes

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

Ungolfed

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

Online ausprobieren unterstützt Clojure 1.8 nicht. Sehr eigenartig!


0

Perl 6 , 55 51 46 Bytes

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

Probieren Sie es online!

Nimmt eine (Farb-, Original-, Ziel-) Liste als Eingabe. Teilt jede Eingabezeichenfolge in Komponenten auf, erstellt eine Hash-Zuordnung von Quellschlüsseln zu Farbwerten, sucht nach Farbwerten in der Reihenfolge der Zielschlüssel und formatiert das Ergebnis.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.