Baca warna dengan cara saya

16

Sistem yang berbeda memiliki cara yang berbeda untuk menggambarkan warna, bahkan jika semuanya berbicara dalam ruang RGBA. Pengembang front-end yang terbiasa dengan CSS mungkin lebih suka #RRGGBBAA. Tetapi pengembang Android mungkin lebih suka #AARRGGBB. Saat menangani format file AAS, #AABBGGRRdiperlukan. Itu terlalu membingungkan. Mungkin kita memerlukan program yang dapat mengkonversi antara berbagai format warna.

Memasukkan:

Input berisi 3 bagian:

  • Warna yang akan diubah (misalnya #1459AC0F), sebuah string dimulai dengan tanda tajam #diikuti oleh 8 digit hex.
  • Format warna yang diberikan (misalnya #RRGGBBAA), sebuah string yang dimulai dengan #diikuti oleh 8 huruf yang terbagi dalam 4 grup yang berbeda dan masing-masing grup adalah salah satu dari RR/ GG/ BB/ AA.
  • Format untuk dikonversi menjadi.

Keluaran:

  • Keluarkan warna dalam format yang dikonversi

Kasus uji:

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

Input / output tidak sensitif huruf. Anda dapat input / output dengan cara apa pun yang dapat diterima.

Aturan:

Ini adalah kode golf, kode terpendek (dalam byte) dari setiap bahasa yang menang

tsh
sumber
AARRGGBBsecara objektif adalah format warna terbaik. Jika sesuatu mengharapkan 24 bit RRGGBBdan Anda memberikannya 32 bit AARRGGBB, ia dapat mengabaikan byte atas dan masih berfungsi.
12Me21
2
Warna DEADBEEF terlihat sedikit Salmon-y.
Magic Octopus Urn
1
Saya telah menjadi web dev ujung depan selama bertahun-tahun sekarang dan saya belum pernah mendengar tentang #RRGGBBAA hingga hari ini, berharap lebih banyak browser mendukungnya.
DasBeasto
@ 12Me21 Dan pertanyaan berikutnya adalah endianness mana yang lebih baik.
tsh

Jawaban:

10

APL (Dyalog Unicode) , 6 byte SBCS

program penuh. Anjuran pada STDIN untuk Asli, lalu Target, lalu Warna. Mencetak Hasil ke STDOUT.

⍞[⍞⍋⍞]

Cobalah online!

   meminta untuk Asli

⍞⍋ meminta Target dan menemukan indeks menjadi Asli yang akan membuat Asli menjadi Target

⍞[] Meminta Warna dan menggunakan indeks yang diperoleh di atas untuk menyusun ulang Warna

Adám
sumber
8

JavaScript (ES6), 53 52 byte

Disimpan 1 byte berkat @tsh

Mengambil input sebagai 3 parameter yang berbeda: (Color, From, To).

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

Cobalah online!

Arnauld
sumber
(C,F,T)=>T.replace(/\w/g,(x,i)=>C[F.search(x)-~i%2])simpan satu byte
tsh
@ Bagus sekali. ^^
Arnauld
5

Stax , 8 byte

ç▼☺↔kàÅJ

Jalankan dan debug itu

Program ini mengambil input dalam format ini.

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

Inilah versi unpacked yang belum dikomentari yang dikomentari dari program yang sama.

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

Jalankan yang ini

rekursif
sumber
4

Python 2 , 59 byte

lambda c,o,t:'#'+''.join(c[o.find(v):][:2]for v in t[1::2])

Cobalah online!

TFeld
sumber
4

Retina 0.8.2 , 33 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

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

Untuk setiap pasangan karakter identik, lihat kembali untuk salinan pasangan itu, dan kemudian karakter ke-9 dan ke-8 sebelum itu, dan ganti pasangan dengan karakter tersebut. Ini hanya mungkin untuk pasangan karakter dalam format target, dan menggantinya dengan hasil yang diinginkan.

.*#
#

Hapus warna dan format sumber.

Neil
sumber
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))

Cobalah online!


Versi lama

Terima kasih kepada Laikoni untuk mempersingkat 6 byte dengan menemukan cara yang lebih singkat untuk digunakan 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

Cobalah online!

Penjelasan:

  • yang pfungsi "mem-parsing" string dengan mengabaikan terkemuka #kelompok dan kembali (daftar) dari 2 chars.
  • yang (!)Operator mengambil sebagai masukan warna dan format input dan mengembalikan fungsi yang mengambil sebagai parameter format output dan mengembalikan warna dikonversi. Ternyata versi pointfree lebih pendek, tetapi saya mulai dengan versi yang lebih mudah dibaca:

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

Cobalah online!

Cristian Lupascu
sumber
3

Perl 5 -p , 33 32 27 byte

Berikan input dalam urutan: target, asli, nomor

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

Cobalah online!

Untuk setiap karakter dalam input temukan karakter yang sama sejumlah tempat maju kemudian dari sana pergi 10 karakter lebih maju dan mengambil karakter itu sebagai pengganti. Jika Anda tidak dapat melakukan langkah-langkah ini, ganti dengan nol.

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

05AB1E , 10 byte

2FI2ô™J}I‡

Cobalah 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.

Ini berfungsi karena saya mengubah input dari:

AARRGGBB

Untuk:

AaRrGgBb

Jadi setiap nilai dipetakan secara unik, maka saya bisa menggunakan transliterate.

Argumen dibalik.

Guci Gurita Ajaib
sumber
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;}

Kekalahan -77 byte berkat @ OlivierGrégoire .

Penjelasan:

Cobalah online.

(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
Kevin Cruijssen
sumber
1
105 byte Membuat string dari target dengan menemukan elemen target dalam format sumber.
Olivier Grégoire
@ OlivierGrégoire Saya tahu ini akan mungkin tanpa Peta sial itu. Terima kasih banyak, -74 byte di sana!
Kevin Cruijssen
102 byte dengan beralih ke Java 10, yang sekarang didukung pada TIO.
Olivier Grégoire
2

J , 5 byte

/:i./

Argumen kiri adalah warna. Argumen yang tepat adalah matriks karakter di mana baris pertama adalah format target dan baris kedua adalah format asli. Cobalah online!

FrownyFrog
sumber
1

CJam, 14 byte

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

Cobalah secara Online!

Input adalah array dalam urutan terbalik.

{
 `#\      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
}     
geokavel
sumber
0

Python 2, 62 byte

lambda c,s,e:[c[s.index(e[i]):][:2]for i in range(1,len(e),2)]
sonrad10
sumber
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
12Me21
sumber
0

Merah , 154 120 114 byte

func[c o t][g: func[q][parse q[skip collect 4 keep 2 skip]]
prin"#"foreach p g t[prin pick g c index? find g o p]]

Cobalah online!

Galen Ivanov
sumber
0

Python 3 , 102 byte

lambda x,a,b:['#']+[[x[i:i+2]for i in range(1,len(x),2)][i]for i in[a[1::2].index(i)for i in b[1::2]]]

Cobalah online!

Dat
sumber
0

Jelly , 6 byte

ẹЀQị⁵

Cobalah online!

program penuh.

Argumen 1:
Argumen Asli 2:
Argumen Target 3: Warna

Erik the Outgolfer
sumber
0

C (dentang) , 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]);}

Cobalah online!

Membawa nilai input dalam a, format ikeluar dan masuk format o. Mengembalikan nilai dalamb

Cheat minor: menyimpan hasil balih-alih mencetak untuk menghemat byte. Pertanyaan tidak melarangnya.

C (dentang) , 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);}

Cobalah online!

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

Cobalah online!

Menciptakan RGBAnilai dalam c[]array berdasarkan format i, lalu mencetak dalam oformat

GPS
sumber
Sarankan char*a,b[10],*i,*o;f(x)alih-alih char *a,b[10],*i,*o;f(x,y)dan x+=2)bcopy(a+(long)index(i,o[x])-i,b+x,2);bukannyab[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)))))

Tidak disatukan

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

Cobalah secara online tidak memiliki dukungan Clojure 1.8. Sangat aneh!

Joshua
sumber
0

Perl 6 , 55 51 46 byte

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

Cobalah online!

Mengambil daftar (warna, asli, target) sebagai input. Pisahkan setiap string input menjadi komponen, buat kunci sumber pemetaan Hash ke nilai warna, cari nilai warna dalam urutan kunci target, lalu format hasilnya.

nwellnhof
sumber