用我的方式阅读颜色


16

即使所有系统都在RGBA空间中讲话,不同的系统也有不同的颜色描述方式。熟悉CSS的前端开发人员可能更喜欢#RRGGBBAA。但是Android开发人员可能更喜欢#AARRGGBB。处理AAS文件格式时,#AABBGGRR是必需的。太混乱了。也许我们需要一个可以在不同颜色格式之间转换的程序。

输入:

输入包含3个部分:

  • 要转换的颜色(例如#1459AC0F),以尖锐符号#开头的字符串,后跟8个十六进制数字。
  • 给定颜色的格式(例如#RRGGBBAA),一个字符串开头,#后跟8个字母,分为4个不同的组,每个组是RR/ GG/ BB/之一AA
  • 转换成的格式。

输出:

  • 以转换后的格式输出颜色

测试用例:

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

输入/输出不区分大小写。您可以以任何可接受的方式输入/输出。

规则:

这是代码高尔夫球,每种语言的最短(以字节为单位)代码获胜


AARRGGBB是客观上最好的颜色格式。如果某些东西期望24位,RRGGBB而您给它32位AARRGGBB,那么它可以忽略高位字节并仍然可以工作。
18Me21年

2
颜色DEADBEEF看起来有点鲑鱼色。
魔术章鱼缸

1
我多年来一直是前端Web开发人员,直到今天我才听说#RRGGBBAA,希望有更多的浏览器支持它。
DasBeasto

@ 12Me21下一个问题是哪种字节序更好。
tsh

Answers:


10

APL(Dyalog Unicode),6 字节SBCS

完整程序。在STDIN上提示输入Original,然后是Target,然后是Color。将结果打印到STDOUT。

⍞[⍞⍋⍞]

在线尝试!

   提示原始

⍞⍋ 提示目标并找到原始索引,使原始索引成为目标

⍞[] 提示输入颜色,并使用以上获得的索引对颜色重新排序


8

JavaScript(ES6),53 52字节

@tsh节省了1个字节

将输入作为3个不同的参数:(Color, From, To)

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

在线尝试!


(C,F,T)=>T.replace(/\w/g,(x,i)=>C[F.search(x)-~i%2])保存一个字节
tsh

@tsh好一个。^^
Arnauld

5

Stax,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

视网膜0.8.2,33字节

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

在线尝试!链接包括测试用例。说明:

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

对于每对相同的字符,请先查看该对字符的另一个副本,然后再查找其前的第9和8个字符,然后用这些字符替换该对字符。这仅适用于目标格式的成对字符,并用所需的结果替换它们。

.*#
#

删除颜色和源格式。


3

Haskell中108 104 100 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))

在线尝试!


旧版本

感谢Laikoni通过找到更短的使用方式来缩短6个字节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个字符的开头和结尾的组(列表)来“解析”字符串。
  • (!)操作者作为输入颜色和输入格式,并返回一个函数作为参数,是以输出格式并返回转换颜色。原来,pointpoint版本较短,但是我从可读性更高的版本开始:

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

爪哇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),

@OlivierGrégoire我知道没有那个讨厌的地图是可能的。非常感谢,-74字节就在这里!
凯文·克鲁伊森

通过切换到Java 10可获得102个字节,TIO现在支持该功能。
奥利维尔·格雷戈尔

2

J,5个字节

/:i./

左边的参数是颜色。正确的参数是一个字符矩阵,其中第一行是目标格式,第二行是原始格式。在线尝试!


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

在线尝试!

ain格式i和in格式输出输入值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);}}

在线尝试!

根据格式RGBAc[]数组中创建一个值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?./))

在线尝试!

接受(颜色,原始,目标)列表作为输入。将每个输入字符串拆分为多个部分,创建一个将哈希键映射到颜色值的哈希键,按目标键顺序查找颜色值,然后格式化结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.