Đọc màu theo cách của tôi


16

Các hệ thống khác nhau có các cách khác nhau để mô tả màu sắc, ngay cả khi tất cả chúng đang nói trong không gian RGBA. Một nhà phát triển front-end quen thuộc với CSS có thể thích hơn #RRGGBBAA. Nhưng các nhà phát triển Android có thể thích #AARRGGBB. Khi xử lý định dạng tệp AAS, #AABBGGRRlà cần thiết. Điều đó quá khó hiểu. Có lẽ chúng ta cần một chương trình có thể chuyển đổi giữa các định dạng màu khác nhau.

Đầu vào:

Đầu vào chứa 3 phần:

  • Màu được chuyển đổi (ví dụ #1459AC0F), một chuỗi bắt đầu bằng dấu sắc nét #theo sau là 8 chữ số hex.
  • Định dạng của màu đã cho (ví dụ #RRGGBBAA), một chuỗi bắt đầu #bằng 8 chữ cái thuộc 4 nhóm khác nhau và mỗi nhóm là một trong RR/ GG/ BB/ AA.
  • Các định dạng để chuyển đổi sang.

Đầu ra:

  • Xuất màu ở định dạng được chuyển đổi

Các trường hợp thử nghiệm:

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

Đầu vào / đầu ra là trường hợp không nhạy cảm. Bạn có thể nhập / xuất theo bất kỳ cách nào được chấp nhận.

Quy tắc:

Đây là mã golf, mã ngắn nhất (tính bằng byte) của mỗi ngôn ngữ giành chiến thắng


AARRGGBBkhách quan là định dạng màu tốt nhất. Nếu một cái gì đó mong đợi 24 bit RRGGBBvà bạn cung cấp cho nó 32 bit AARRGGBBthay vào đó, nó chỉ có thể bỏ qua byte trên và vẫn hoạt động.
12Me21

2
Màu DEADBEEF trông hơi Salmon-y.
Bạch tuộc ma thuật Urn

1
Tôi đã là một nhà phát triển web mặt trước trong nhiều năm nay và tôi chưa bao giờ nghe nói về #RRGGBBAA cho đến ngày hôm nay, mong muốn nhiều trình duyệt hỗ trợ nó.
DasBeasto

@ 12Me21 Và câu hỏi tiếp theo là endianness nào tốt hơn.
tsh

Câu trả lời:


10

APL (Dyalog Unicode) , 6 byte SBCS

Chương trình đầy đủ. Nhắc về STDIN cho Bản gốc, rồi Nhắm mục tiêu, rồi Màu. In kết quả sang STDOUT.

⍞[⍞⍋⍞]

Hãy thử trực tuyến!

   nhắc nhở cho bản gốc

⍞⍋ nhắc nhở Target và tìm các chỉ mục thành Original sẽ biến Original thành Target

⍞[... ] nhắc cho Màu và sử dụng các chỉ số thu được ở trên để sắp xếp lại màu


8

JavaScript (ES6), 53 52 byte

Đã lưu 1 byte nhờ @tsh

Lấy đầu vào là 3 tham số riêng biệt : (Color, From, To).

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

Hãy thử trực tuyến!


(C,F,T)=>T.replace(/\w/g,(x,i)=>C[F.search(x)-~i%2])lưu một byte
tsh 22/03/18

@tsh Đẹp một cái. ^^
Arnauld

5

Stax , 8 byte

ç▼☺↔kàÅJ

Chạy và gỡ lỗi nó

Chương trình này có đầu vào ở định dạng này.

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

Đây là phiên bản đã giải nén chưa được giải thích của cùng một chương trình.

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

Chạy cái này



4

Võng mạc 0.8.2 , 33 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

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

Đối với mỗi cặp ký tự giống hệt nhau, hãy tìm lại một bản sao khác của cặp đó và sau đó là ký tự thứ 9 và thứ 8 trước đó và thay thế cặp đó bằng các ký tự đó. Điều này chỉ có thể cho các cặp ký tự ở định dạng đích và thay thế chúng bằng kết quả mong muốn.

.*#
#

Xóa màu sắc và định dạng nguồn.


3

Haskell , 108 104 100 94 87 byte

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

Hãy thử trực tuyến!


Phiên bản cũ

Cảm ơn Laikoni đã rút ngắn 6 byte bằng cách tìm cách sử dụng ngắn hơn 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

Hãy thử trực tuyến!

Giải trình:

  • các pchức năng "phân tích" một chuỗi bằng cách bỏ qua các hàng đầu #nhóm và trở về (danh sách) của 2 ký tự.
  • các (!)nhà điều hành có như là đầu vào màu sắc và định dạng đầu vào và trả về một hàm mang theo như một tham số định dạng đầu ra và trả về màu sắc chuyển đổi. Hóa ra phiên bản pointfree ngắn hơn, nhưng tôi đã bắt đầu với phiên bản dễ đọc hơn:

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

Hãy thử trực tuyến!


3

Perl 5 -p , 33 32 27 byte

Cung cấp đầu vào theo thứ tự: mục tiêu, bản gốc, số

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

Hãy thử trực tuyến!

Đối với mỗi ký tự trong đầu vào, tìm cùng một ký tự, một số chẵn các vị trí chuyển tiếp sau đó từ đó đi thêm 10 ký tự về phía trước và lấy ký tự đó làm thay thế. Nếu bạn không thể làm những bước này thay thế bằng không có gì.

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

2

05AB1E , 10 byte

2FI2ô™J}I‡

Hãy thử trực tuyến!


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.

Điều này hoạt động vì tôi thay đổi đầu vào từ:

AARRGGBB

Đến:

AaRrGgBb

Vì vậy, mỗi giá trị được ánh xạ duy nhất, sau đó tôi có thể sử dụng chuyển ngữ.

Các đối số được đảo ngược.


2

Java 10, 179 105 102 byte

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

Thu được -77 byte nhờ @ OlivierGrégoire .

Giải trình:

Hãy thử trực tuyến.

(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 Xây dựng chuỗi từ mục tiêu bằng cách tìm phần tử đích ở định dạng nguồn.
Olivier Grégoire

@ OlivierGrégoire Tôi biết điều đó sẽ khả thi nếu không có Bản đồ phiền phức đó. Cảm ơn rất nhiều, -74 byte ngay đó!
Kevin Cruijssen

102 byte bằng cách chuyển sang Java 10, hiện được hỗ trợ trên TIO.
Olivier Grégoire

2

J , 5 byte

/:i./

Đối số bên trái là màu sắc. Đối số đúng là một ma trận ký tự trong đó hàng đầu tiên là định dạng đích và hàng thứ hai là định dạng ban đầu. Hãy thử trực tuyến!


1

CJam, 14 byte

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

Hãy thử trực tuyến!

Đầu vào là một mảng theo thứ tự ngược lại.

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

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

0

SmileBASIC, 144 byte

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 (tiếng kêu) , 89 byte

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

Hãy thử trực tuyến!

Đưa giá trị đầu vào vào a, ở định dạng trong ivà ngoài định dạng o. Trả về giá trị trongb

Gian lận nhỏ: lưu trữ kết quả bthay vì in để lưu byte. Câu hỏi không cho phép nó.

C (tiếng kêu) , 100 byte

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

Hãy thử trực tuyến!

C (gcc) , 181 byte

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

Hãy thử trực tuyến!

Tạo một RGBAgiá trị trong c[]mảng dựa trên định dạng i, sau đó in ở ođịnh dạng


Đề xuất char*a,b[10],*i,*o;f(x)thay vì char *a,b[10],*i,*o;f(x,y)x+=2)bcopy(a+(long)index(i,o[x])-i,b+x,2);thay vìb[x++]=a[y=index(i,o[x])-i],b[x++]=a[y+1]);
trần mèo

0

Clojure 1.8, 156 byte

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

Bị đánh cắp

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

Dùng thử trực tuyến không có hỗ trợ Clojure 1.8. Rất lạ!


0

Perl 6 , 55 51 46 byte

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

Hãy thử trực tuyến!

Lấy danh sách (màu, bản gốc, mục tiêu) làm đầu vào. Chia từng chuỗi đầu vào thành các thành phần, tạo khóa nguồn ánh xạ Hash thành giá trị màu, tra cứu giá trị màu theo thứ tự khóa đích, sau đó định dạng kết quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.