Renkleri yolumda oku


16

Hepsi RGBA alanında konuşuyor olsalar bile, farklı sistemlerin renkleri tanımlamanın farklı yolları vardır. CSS'yi bilen bir ön uç geliştirici tercih edebilir #RRGGBBAA. Ancak Android geliştiricileri tercih edebilir #AARRGGBB. AAS dosya formatı işlenirken #AABBGGRRgereklidir. Bu çok kafa karıştırıcı. Belki de farklı renk formatları arasında dönüştürme yapabilen bir programa ihtiyacımız var.

Giriş:

Giriş 3 bölümden oluşur:

  • Dönüştürülecek renk (ör. #1459AC0F), Keskin işaretle başlayan ve #ardından 8 onaltılık basamaktan oluşan bir dize .
  • Verilen rengin formatı (örn. #RRGGBBAA), Dördü ile başlayan ve #4 farklı gruba giren ve her bir grup RR/ GG/ BB/ 'dan biri olan 8 harf AA.
  • Dönüştürülecek biçim.

Çıktı:

  • Rengi dönüştürülmüş biçimde çıktılar

Test Durumları:

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

Giriş / çıkış büyük / küçük harfe duyarlı değildir. Kabul edilebilir herhangi bir şekilde giriş / çıkış yapabilirsiniz.

Kurallar:

Bu kod golf, her dil kazanmak en kısa (bayt cinsinden) kodları


AARRGGBBobjektif olarak en iyi renk formatıdır. Bir şey 24 bit bekliyorsa RRGGBBve AARRGGBBbunun yerine 32 bit verirseniz , üst baytı görmezden gelebilir ve yine de çalışabilir.
12Me21

2
DEADBEEF rengi biraz Salmon-y'ye benziyor.
Sihirli Ahtapot Urn

1
Yıllardır bir ön uç web geliştiriciyim ve bugüne kadar #RRGGBBAA'yı hiç duymamıştım, daha fazla tarayıcı destekleseydi.
DasBeasto

12Me21 Ve sonraki soruya @ hangi endian daha iyidir.
tsh

Yanıtlar:


10

APL (Dyalog Unicode) , 6 bayt SBCS

Tam program. STDIN'de Orijinal, ardından Hedef, ardından Renk için bilgi istemleri. Sonucu STDOUT olarak yazdırır.

⍞[⍞⍋⍞]

Çevrimiçi deneyin!

   Orijinal istemi

⍞⍋ Hedef isteminde bulunun ve Orijinali Hedefe dönüştürecek endeksleri bulun

⍞[] Renk istemi ve Rengi yeniden sıralamak için yukarıda elde edilen endeksleri kullanma


8

JavaScript (ES6), 53 52 bayt

@Tsh sayesinde 1 bayt kaydedildi

3 ayrı parametre olarak girdi Alır: (Color, From, To).

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

Çevrimiçi deneyin!


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

@tsh Güzel biri. ^^
Arnauld

5

Stax , 8 bayt

ç▼☺↔kàÅJ

Çalıştır ve hata ayıkla

Bu program girişi bu formatta alır.

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

İşte aynı programın yorumlanmamış paketsiz sürümü.

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

Bunu çalıştır



4

Retina 0.8.2 , 33 bayt

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

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Açıklama:

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

Her bir özdeş karakter çifti için, o çiftin başka bir kopyasını ve ardından ondan önceki 9. ve 8. karakterleri arayın ve çifti bu karakterlerle değiştirin. Bu yalnızca hedef formattaki karakter çiftleri için mümkündür ve bunları istenen sonuçla değiştirir.

.*#
#

Renk ve kaynak biçimini silin.


3

Haskell , 108104100 94 87 bayt

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

Çevrimiçi deneyin!


Eski versiyon

Kullanmanın daha kısa bir yolunu bularak 6 baytı kısalttığı için Laikoni'ye teşekkürler 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

Çevrimiçi deneyin!

Açıklama:

  • pfonksiyon "ayrıştırır" lider gözardı ederek bir dizi #2 karakter ve geri dönen gruplar (listeler).
  • (!)Operatör girdi olarak renk ve giriş biçimi alır ve parametre olarak çıkış biçimini alır ve dönüştürülmüş renk döndüren bir işlev verir. Pointfree sürümünün daha kısa olduğu ortaya çıktı, ancak daha okunabilir sürümle başladım:

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

Çevrimiçi deneyin!


3

Perl 5 -p , 33 32 27 bayt

Sırayla girdi verin: hedef, orijinal, sayı

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

Çevrimiçi deneyin!

Girişteki her karakter için aynı karakteri çift sayıda ileriye doğru bul ve oradan 10 karakter daha ileri git ve bu karakteri yerine koy. Bu adımları gerçekleştiremezseniz, hiçbir şeyi değiştirmeyin.

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

2

05AB1E , 10 bayt

2FI2ô™J}I‡

Çevrimiçi deneyin!


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.

Ben çünkü giriş değiştirmek için çalışır:

AARRGGBB

Kime:

AaRrGgBb

Bu yüzden her değer benzersiz bir şekilde eşleştirilir, sonra transliterat kullanabilirim.

Argümanlar tersine çevrilir.


2

Java 10, 179 105 102 bayt

(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 sayesinde -77 bayt .

Açıklama:

Çevrimiçi deneyin.

(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 bayt Hedef öğeyi kaynak biçiminde bularak dizeden hedef oluşturur.
Olivier Grégoire

@ OlivierGrégoire Bu sinir bozucu Harita olmadan mümkün olacağını biliyordum. Çok teşekkürler, -74 bayt orada!
Kevin Cruijssen

102 bayt , şimdi TIO'da desteklenen Java 10'a geçerek.
Olivier Grégoire

2

J , 5 bayt

/:i./

Sol argüman renktir. Sağ argüman, ilk satırın hedef format ve ikinci satırın orijinal format olduğu bir karakter matrisidir. Çevrimiçi deneyin!


1

CJam, 14 bayt

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

Çevrimiçi deneyin!

Girdi, ters sırada bir dizidir.

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

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

0

SmileBASIC, 144 bayt

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 bayt

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

Çevrimiçi deneyin!

Girdi değerini giriş a, içıkış ve çıkış formatında alır o. İçindeki değeri verirb

Küçük hile: bbayt tasarrufu için baskı yerine sonucu saklama . Soru buna izin vermiyor.

C (clang) , 100 bayt

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

Çevrimiçi deneyin!

C (gcc) , 181 bayt

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

Çevrimiçi deneyin!

Biçime göre dizide bir RGBAdeğer oluşturur , sonra biçiminde yazdırırc[]io


Öner char*a,b[10],*i,*o;f(x)yerine char *a,b[10],*i,*o;f(x,y)ve x+=2)bcopy(a+(long)index(i,o[x])-i,b+x,2);yerineb[x++]=a[y=index(i,o[x])-i],b[x++]=a[y+1]);
ceilingcat

0

Clojure 1.8, 156 bayt

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

Çevrimiçi deneyin Clojure 1.8 desteği yok. Çok ilginç!


0

Perl 6 , 55 51 46 bayt

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

Çevrimiçi deneyin!

Girdi olarak bir (renkli, orijinal, hedef) liste alır. Her giriş dizesini bileşenlere böler, renk değerlerine Hash eşleme kaynak anahtarları oluşturur, renk değerlerini hedef anahtar sırasında arar, sonra sonucu biçimlendirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.