Nasıl HEX2 RGBA dönüştürmek için?


11

Sanat dünyası renklerle doludur, ancak ağın dünyası farklı renklerin sanat dünyasından ve renderlarından bile daha doludur. Bu nedenle, bir tür renk biçimini diğerine nasıl dönüştüreceğimizi bilmemiz gerekir.

Sorun açıktır:

Belirli bir HEX kodunu ( #00ff0080örneğin) RGBA'ya (gibi rgba(0, 255, 0, 0.5)) dönüştürmektense bir program / işlev yazın .

Kurallar:

  • HEX'i RGBA'ya dönüştürmek için harici kütüphanelere / yerleşiklere izin verilmez. Ancak, bunun gibi jQuery ve sözdizimi değiştiricileri kabul edilebilir.
  • Standart Giriş / Çıkış kuralları geçerlidir.
  • Alfa biçimi (1 ==% 100) veya diğer (100 ==% 100) arasında çok önemli olmayabilir.
  • Çıktı , dönüştürülmüş 4 değeri döndürdüğü sürece esnektir (bir String, Array, List, seçiminiz gibi).
  • Girişi #başlangıçta almayı seçebilirsiniz . Bu nedenle, girdiyi #RRGGBBAAveya olarak alabilirsiniz RRGGBBAA. Onaltılık kodun (hariç #) her zaman 8 karakter uzunluğunda olacağını varsayabilirsiniz .
  • Alfa dahil tüm değerleri 255'e bölmelisiniz. Minimum ondalık duyarlık (alfa için 2 ondalık basamak olacaktır).

Test Durumları

Input:  00ff0080
Output: 0, 255, 0, 0.5

puanlama

, en az baytlık kod kazanır.


Yorumlar uzun tartışmalar için değildir; bu görüşme sohbete taşındı .
Dennis

1
"Hex kodunu" dize olarak almamız gerekiyor mu? Bunu öncü olmadan alabileceğimizi söylüyorsunuz, #bu durumda sadece 32 bitlik bir tamsayı değeri olurdu. Bu şekilde almak yasal mı?
Cody Gray

Yanıtlar:


4

JavaScript (ES6), 73 54 50 bayt

(@LeakyNun, düzenlenen zorluk ve @CraigAyre sayesinde bazı baytlar kaydetti.)

s=>s.match(/../g).map((c,i)=>('0x'+c)/(i-3?1:255))

let f=

s=>s.match(/../g).map((c,i)=>('0x'+c)/(i-3?1:255))

console.log(f('00ff0080'));


Rick, görünüşe göre bunun için son spesifikasyona sahibiz, böylece cevabınızı güncelleyebilirsiniz.
Shaggy

İyi Shaggy yorumun @ gibi kullanarak birkaç byte kaydedebilirsiniz gibi evalyerine parseInt:s=>s.match(/../g).map((x,i)=>eval('0x'+x)/(i-3?1:255))
Craig Ayre

@CraigAyre, golf için evalharika bir alternatif parseInt, teşekkürler!
Rick Hitchcock

@ RickHitchcock, endişelenme! Ayrıca regex'ten birkaç bayt tıraş edebilirsiniz /../g. replaceOver match/ kullanarak daha da azaltabilirsiniz /map
Craig Ayre

Oh, kuralların değiştiğini görüyorum, bu yüzden ilk pound işareti artık gerekli değil.
Rick Hitchcock

3

Japt , 13 bayt

Öncü olmadan bir dize olarak girdi alır #. Rgba değerini bir dizi olarak çıktılar.

ò ®nG
pUo /#ÿ

Dene


açıklama

Dizeyi dolaylı olarak değişken yoluyla girdi olarak alırız U.
"00ff0080"

ò

Dizeyi 2 uzunluktaki bir dizi öğeye ayırın.
["00","ff","00","80"]

®nG

Dizi üzerinde eşleyin ve her bir öğeyi temel 16 dizeden ondalık sayıya dönüştürün. Aşağıdaki satırsonu nedeniyle, bu dizi dolaylı olarak değişkene atanır U.
[0,255,0,128]

Uo

Dizideki son öğeyi açar.
128

/#ÿ

255'e bölün.
0.5019607843137255

p

Sonucu geri Uaktarın ve son diziyi örtük olarak çıkarın.
[0,255,0,0.5019607843137255]





1

Jöle , 15 14 bayt

Øhi$€’s2ḅ⁴÷4¦⁹

Çevrimiçi deneyin!

Nasıl çalışır

Øhi$€’s2ḅ⁴÷4¦⁹ - main link, takes input without # and all lowercase
   $€             - to each input character:
  i               - return its 1-based index in
Øh                - the string "0123456789abcdef"
     ’            - decrement (otherwise 0 is mapped to 1 and f to 16)
      s2          - split the characters into groups of two
        ḅ⁴        - convert from base 16 to decimal
           4¦     - on the fourth element:
          ÷       - divide by
             ⁹    - 256

@EricTheOutgolfer sayesinde -1 bayt


1

PHP, 72 bayt

Jörg'in dizi çıktı sürümü rakipsizdir; ancak başka seçenekler de vardır:

<?=($a=hexdec($argn))>>24,",",255&$a>>16,",",255&$a>>8,",",(255&$a)>256;

İle boru olarak çalıştırın -F. #önemli değil, düz csv çıkışı

veya 73 bayt (ile çalıştır -R):

for($a=hexdec($argn);$i++<4;)echo(255&$a>>32-8*$i)/($i<4?:256),","[$i>3];

Boşluklarla birlikte 74 bayt :

<?=($a=hexdec($argn))>>24,$c=", ",255&$a>>16,$c,255&$a>>8,$c,(255&$a)>256;

çok basit değil, 81 bayt :

rgba(<?=($a=hexdec($argn))>>24,$c=", ",255&$a>>16,$c,255&$a>>8,$c,(255&$a)/256?>)


1

Excel, 99 bayt

=HEX2DEC(LEFT(A1,2))&","&HEX2DEC(MID(A1,3,2))&","&HEX2DEC(MID(A1,5,2))&","&HEX2DEC(RIGHT(A1,2))/256

1

SmileBASIC, 50 bayt

INPUT H$RGBREAD VAL("&H"+H$)OUT R,G,B,A?R,G,B,A/#L

Onaltılık dize VAL () kullanılarak bir sayıya dönüştürülür, ardından RGBREAD her baytı ayıklar. #L, 256 değerine sahip bir sabittir.

RGBREAD, kanalları bir ARGB renginden çıkarmak için tasarlanmıştır, ancak gerçekten sadece 4 baytlık bir tamsayıyı 4 ayrı bayta böler, böylece sipariş önemli değildir.


Her zaman temel yanıtları görmeyi severim , ancak onaltılık değeri rgba'ya dönüştürmek için yerleşik olarak kullandığından, bu yanıtın geçersiz olabileceğinden korkuyorum
Taylor Scott

Ben bir hex-> rgba yerleşik olarak sayılmaz düşünüyorum çünkü hex tamsayı dönüştürmek için ekstra bir adım gerektirir.
12Me21

Aslında, tekrar bakarsak, haklı olduğunu düşünüyorum, hex'den int'e yapılan açık dönüşüm bunu geçerli kılar.
Taylor Scott


0

JS ES2015, 84 bayt

$=>{a=[1,3,5,7].map(b=>eval("0x"+$.substr(b,2)));a[3]=(a[3]/256);return a.join(",")}

bu bir işlevdir. Kullanarak çalıştırın

( CODE )("#00ff0080")


0

q / kdb +, 43 bayt

Çözüm:

{(16 sv'(.Q.n,6#.Q.a)?/:2 cut x)%1 1 1 256}

Misal:

q){(16 sv'(.Q.n,6#.Q.a)?/:2 cut x)%1 1 1 256}"00ff0080"
0 255 0 0.5

Açıklama:

{                                         } / anonymous lambda function
                        2 cut x             / split input into 2-char length lists
                     ?/:                    / returns index where (each-right) item is found in 'the list'
        (           )                       / 'the list'
              6#.Q.a                        / Q.a is lowercase alphabet, 6# takes first 6 chars
         .Q.n,                              / Q.n is "012..89", so prepend this onto the "abcdef"                         
  16 sv'                                    / converts each index from base 16 to base 10
 (                            )%1 1 1 256   / divide this output by 1,1,1,256 to get alpha in 0..1 range 

0

APL (Dyalog) , 24 bayt

⎕IO←0Birçok sistemde varsayılan olanı gerektirir . Olmadan büyük harf olarak girilmesini ister #.

256÷⍨@316⊥⍉4 2⍴⍞⍳⍨⎕D,⎕A

Çevrimiçi deneyin!

⎕D,⎕AD igits ardından A lphabet

⍞⍳⍨ metin girişi istemi (anımsatıcı: alıntı içeren konsol) ve içindeki her harfin nd ndex'ini bulun

4 2⍴r dört sıra iki sütun matris olarak r

 devrik (temel dönüşüm sütun şeklinde çalıştığı için)

16⊥temel on altı  olarak değerlendir

 verim (3 ve 16'yı ayırmaya yarar)

256÷⍨@3 4 bölmek inci 256 elemanının



0

Yabasik , 96 bayt

Yine başka bir cevap; Girişi dize olarak alır ve konsola çıktılar.

Input""a$
For i=1To 7Step 2
?Dec(Mid$(a$,i,2))/(j+1);
If i=5Then j=255Fi
If i<7Then?", ";Fi
Next

Çevrimiçi deneyin!


Daha önce satır sonunu kaldırarak bir bayt kaydedebilirsiniz ?.
12Me21

0

Excel VBA, 90 bayt

Aralıktan giriş [A1]ve VBE anında penceresine çıkış sağlayan anonim bir VBE anında pencere işlevi .

For i=1To 7Step 2:[B1]=i:?[Hex2Dec(Mid(A1,B1,2))]/IIf(i=7,256,1)&""+IIf(i<7,", ","");:Next

0

Vim, 46 bayt

:s/../$((16#&)) /g␊iecho ␛$hhi*100/255␛:w !sh␊

Olmadan girişi #alır ve ekrana yazdırarak geri döner.

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.