私のやり方で色を読む


16

すべてのシステムがRGBA空間で話している場合でも、システムごとに色を記述する方法が異なります。CSSに精通しているフロントエンド開発者はを好むかもしれません#RRGGBBAA。しかし、Android開発者はを好むかもしれません#AARRGGBB。AASファイル形式を処理する場合に#AABBGGRR必要です。それはわかりにくいです。おそらく、異なる色形式の間で変換できるプログラムが必要です。

入力:

入力には3つの部分が含まれます。

  • 変換される色(例#1459AC0F:)、シャープ記号で始まり#8桁の16進数が続く文字列。
  • 指定された色の形式(例#RRGGBBAA:)で始まり、#4つの異なるグループに属する8文字が続く文字列。各グループはRR/ GG/ BB/のいずれかAAです。
  • 変換後の形式。

出力:

  • 変換された形式で色を出力します

テストケース:

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

入力/出力は大文字と小文字を区別しません。受け入れ可能な方法で入力/出力できます。

ルール:

これはコードゴルフで、各言語の最短(バイト単位)コードが勝ちます


AARRGGBB客観的には最適なカラー形式です。何かが24ビットRRGGBBを想定していてAARRGGBB、代わりに32ビットを指定した場合、上位バイトを無視して動作します。
12Me21

2
DEADBEEFの色は少しSal色に見えます。
魔法のタコ

1
私はもう何年もフロントエンドのウェブ開発者であり、今日まで#RRGGBBAAについて聞いたことはありませんでした。
DasBeasto

@ 12Me21そして、次の質問はどちらのエンディアンが良いかです。
tsh

回答:


10

APL(Dyalog Unicode)、6 バイトSBCS

完全なプログラム。STDINで、Original、Target、Colorの順にプロンプ​​トを表示します。結果をSTDOUTに出力します。

⍞[⍞⍋⍞]

オンラインでお試しください!

   オリジナルのプロンプト

⍞⍋ Targetを要求し、OriginalをTargetにするインデックスを見つけます

⍞[] Colorの入力を求め、上記で取得したインデックスを使用してColorの順序を変更します



5

スタックス、8 バイト

ç▼☺↔kàÅJ

実行してデバッグする

このプログラムは、この形式で入力を受け取ります。

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

以下は、同じプログラムのコメントなしのアンゴルフされたアンパックバージョンです。

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

これを実行する



4

Retina 0.8.2、33バイト

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

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

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

同一の文字のペアごとに、そのペアの別のコピーを探し、その前の9番目と8番目の文字を探し、そのペアをそれらの文字で置き換えます。これは、ターゲット形式の文字のペアに対してのみ可能であり、それらを目的の結果に置き換えます。

.*#
#

色とソース形式を削除します。


3

Haskell108104100 94 87バイト

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

オンラインでお試しください!


古いバージョン

より短い使用方法を見つけて6バイトを短縮してくれたLaikoniに感謝します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

オンラインでお試しください!

説明:

  • このp関数は#、2文字の先頭および戻りグループ(リスト)を無視して、文字列を「解析」します。
  • (!)オペレータは、入力として、色と入力フォーマットを取り、パラメータとして出力形式を取り、変換された色を返す関数を返します。ポイントフリーバージョンのほうが短いことがわかりましたが、読みやすいバージョンから始めました。

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

オンラインでお試しください!


3

Perl 5の -p33の 32 27バイト

ターゲット、オリジナル、番号の順に入力します

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

オンラインでお試しください!

入力の各文字について、同じ文字を偶数桁前方に見つけ、そこからさらに10文字前方に移動し、その文字を置換として使用します。これらの手順を実行できない場合は、何も置き換えないでください。

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

2

05AB1E、10バイト

2FI2ô™J}I‡

オンラインでお試しください!


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.

これは、入力を次から変更するために機能します。

AARRGGBB

に:

AaRrGgBb

したがって、各値は一意にマッピングされるため、音訳を使用できます。

引数は逆になります。


2

Java 10、179 105 102バイト

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

@OlivierGrégoireのおかげでなんと-77バイトです

説明:

オンラインでお試しください。

(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バイトソース形式でターゲット要素を見つけることにより、ターゲットから文字列を構築します。
オリビエグレゴワール

@OlivierGrégoireその厄介なマップなしでそれが可能であることを私は知っていました。本当にありがとう、すぐそこに-74バイト!
ケビンクルーッセン

TIOでサポートされるようになったJava 10に切り替えることで102バイト
オリビエグレゴワール


1

CJam、14バイト

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

オンラインでお試しください!

入力は逆順の配列です。

{
 `#\      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バイト

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

0

SmileBASIC、144バイト

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バイト

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

オンラインでお試しください!

入力値を入力、入力a形式で入力i、出力形式で出力しますo。値を返しますb

軽微なチート:bバイトを節約するために、印刷の代わりに結果を保存します。質問はそれを禁止していません。

C(clang)、100バイト

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

オンラインでお試しください!

C(gcc)、181バイト

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

オンラインでお試しください!

format に基づいて配列にRGBA値を作成し、c[]format iで出力しoます


提案char*a,b[10],*i,*o;f(x)の代わりchar *a,b[10],*i,*o;f(x,y)x+=2)bcopy(a+(long)index(i,o[x])-i,b+x,2);代わりにb[x++]=a[y=index(i,o[x])-i],b[x++]=a[y+1]);
ceilingcat

0

Clojure 1.8、156バイト

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

非ゴルフ

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

Clojure 1.8をサポートしていないオンラインで試してみてください。非常に奇妙な!


0

Perl 6の55の 51 46バイト

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

オンラインでお試しください!

(カラー、オリジナル、ターゲット)リストを入力として受け取ります。各入力文字列をコンポーネントに分割し、ソースキーをカラー値にマッピングするハッシュを作成し、ターゲットキーの順序でカラー値を検索し、結果をフォーマットします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.