Gerçek renk kodu


12

Wikipedia'daki gerçek renk (24 bit), ilgili bölümde şu şekilde tanımlanır:

24 bit neredeyse her zaman R, G, B'den 8 bit kullanır. 2018'den itibaren 24 bit renk derinliği hemen hemen her bilgisayar ve telefon ekranı ve görüntü depolama formatlarının büyük çoğunluğu tarafından kullanılır. Piksel başına 32 bit olan hemen hemen tüm durumlar, renk için 24'ün kullanıldığı ve geri kalan 8'in alfa kanalı veya kullanılmadığı anlamına gelir.

2 24 , 16.777.216 renk varyasyonu verir. İnsan gözü on milyon renge kadar ayrım yapabilir [10] ve bir ekranın gamı ​​insan vizyonu aralığından daha küçük olduğu için, bu, bu aralığı algılanabileceğinden daha fazla ayrıntıyla kaplaması gerektiği anlamına gelir. ...

...

Macintosh sistemleri 24 bit renge "milyonlarca renk" denir. "Gerçek renk" terimi, bazen bu makalenin "Doğrudan renk" olarak adlandırdığı anlamında kullanılır. [13] Ayrıca 24'ten büyük veya eşit tüm renk derinliklerini belirtmek için de kullanılır.

16.777.216 rengin tümünü içeren bir resim

Tüm 16,777,216 renk

Görev

Bir dizi içindeki tüm 16.777.216 renk varyasyonunu CSS rgb()işlevinde dize olarak üreten ve döndüren bir program yazın

5.1. RGB fonksiyonları: rgb()vergba()

rgb()Fonksiyon doğrudan kırmızı, yeşil ve mavi kanallar belirterek bir RGB renk tanımlar. Sözdizimi:

rgb() = rgb( <percentage>{3} [ / <alpha-value> ]? ) |
        rgb( <number>{3} [ / <alpha-value> ]? )
<alpha-value> = <number> | <percentage>

İlk üç argüman sırasıyla rengin kırmızı, yeşil ve mavi kanallarını belirtir. 0%sRGB gamındaki o renk kanalı için minimum değeri 100%ve maksimum değeri temsil eder. A <number>, a'ya eşdeğerdir <percentage>, ancak farklı bir aralığa sahiptir: 0yine renk kanalı için minimum değeri gösterir, ancak255maksimumu temsil eder. Bu değerler, birçok grafik motorunun renk kanallarını dahili olarak tek bir bayt olarak sakladığı gerçeğinden kaynaklanır ve bu, 0 ile 255 arasında tamsayıları tutabilir. Uygulamalar, kanalın kesinliğini, mümkün olduğu kadar yazıldığı veya hesaplandığı şekilde onurlandırmalıdır. Bu mümkün değilse, kanal kullanılan en yüksek hassasiyette en yakın değere yuvarlanmalı ve iki değer eşit derecede yakınsa yuvarlanmalıdır.

Son argüman <alpha-value>olan rengin alfa'sını belirtir. A olarak verilirse <number>, değerin yararlı aralığı 0 (tamamen şeffaf bir rengi 1temsil eder ) ila (tamamen opak bir rengi temsil eder) şeklindedir. A olarak verilirse, 0%tamamen saydam bir rengi 100%temsil ederken, tamamen opak bir rengi temsil eder. Atlanırsa, varsayılan olarak kullanılır 100%.

Bu aralıkların dışındaki değerler geçersiz değildir, ancak burada hesaplanan değer zamanında tanımlanan aralıklara kenetlenir.

Eski nedenlerden dolayı, rgb()tüm argümanlarını virgülle ayıran alternatif bir sözdizimini de destekler:

rgb() = rgb( <percentage>#{3} , <alpha-value>? ) |
        rgb( <number>#{3} , <alpha-value>? )

Ayrıca eski nedenlerden dolayı, rgba()aynı dilbilgisi ve davranışa sahip bir işlev de vardır rgb().

veya RGB onaltılık gösterim #RRGGBBbiçimi

5.2. RGB onaltılık gösterimleri:#RRGGBB

CSS onaltılık renk gösterimi, renklerin onaltılık sayılarla renklerin belirtilmesine izin verir, bu da renklerin genellikle doğrudan bilgisayar koduna nasıl yazıldığına benzer. Aynı rengi rgb()gösterimde yazmaktan daha kısadır .

A'nın sözdizimi , değeri 3, 4, 6 veya 8 onaltılık basamaktan oluşan <hex-color>bir <hash-token>simgedir. Başka bir deyişle, onaltılık renk karma karakter olarak "#" yazılır, ardından 0-9 arasındaki rakamlar veya af harfleri gelir (harflerin durumu önemli değildir - #00ff00aynıdır #00FF00).

Verilen onaltılık basamak sayısı, onaltılık yazımın bir RGB rengine nasıl kodlanacağını belirler:

6 hane

Onaltılı sayı olarak yorumlanan ilk basamak çifti rengin kırmızı kanalını belirtir; burada 00minimum değeri ve ff(ondalık olarak 255) maksimum değeri temsil eder. Aynı şekilde yorumlanan bir sonraki basamak çifti yeşil kanalı, son çift ise maviyi belirtir. Rengin alfa kanalı tamamen opaktır.

ÖRNEK 2
Başka bir deyişle, (kireç yeşili) ile #00ff00aynı rengi temsil eder rgb(0 255 0).

Bkz. Editör'ün CSS Renk Modülü Seviye 4 Taslağı

Örnekler

CSS rgb()işlevi ( boşluk karakteri virgül karakteriyle değiştirilebilir, örn. rgb(0 255 0))

// `rgb()` `<percentage>` as strings in resulting array
['rgb(0%,0%,0%)', ...,'rgb(0%,255%,0)', ...'rgb(255,255,255)']

// `rgb()` `<number>` as strings in resulting array
['rgb(0,0,0)', ...,'rgb(0,255,0)', ...'rgb(255,255,255)']

CSS RGB onaltılık gösterim RRGGBB

// RGB hexadecimal notation as strings in resulting array
['#000000', ...,'#00ff00', ...'#ffffff']

Kazanma kriterleri

Programı yazmak için en az kullanılan bayt sayısı.


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

Yanıtlar:


8

R , 25 bayt

sprintf("#%06X",1:2^24-1)

Çevrimiçi deneyin!


R'ye aşina değilim, ancak bu # 000000 çıktısı almıyor mu?
nyanpasu64

2
Hayır, # 000000 çıktı. TIO bağlantısına bakın
J.Doe

@ jimbo1qaz a:b-cbir vektör sağlar a-ciçin b-c, dahil (bu bir vektör sağlar aiçin b, daha sonra çıkarır cher girdi).
Arthur

2
Ahh, bu yüzden R, aritmetikten daha sıkı önceliğe sahip iki nokta üst üste belirtir ... Python dilimlerinin aksine.
nyanpasu64

7

Python 2 , 77 40 39 37 bayt

print['#%06X'%c for c in range(8**8)]

Çevrimiçi deneyin!

Dijital Travma sayesinde -1 bayt

Dylnan sayesinde -2 bayt


2
Neden lambdaya ihtiyacın var? Liste kavramanın kendisi geçerli bir cevap, değil mi?
Adirio

2
Bir bayt kaydetmek 8**8yerine deneyin1<<24
Digital Trauma

2
nasıl olurprint['...
dylnan

1
@Adirio Tek başına bir değer, bir zorluğun uygulanması olarak sayılmaz.
Jonathan Frech

2
@Adirio Siz kendiniz bir Python terminaline [...] yazdınız [...] - böylece gönderiniz Python 2'ye değil Python 2 REPL'e yazılır .
Jonathan Frech

6

PowerShell , 28 26 bayt

1..16mb|%{"#{0:x6}"-f--$_}

Çevrimiçi deneyin!

1- 16mb(16777216) arası döngüler . Her bir yinelemede, dizeye karşı -fönceden azaltılmış geçerli sayıya etki eden ormat operatörünü kullanırız . Burada, rakamlarla doldurulmuş , önünde bir karma olan değerleri belirtiyoruz . TIO'da, 60 saniye / 128KiB çıkışla sınırlıdır. Nasıl biteceğini görmek için öğesini değiştirin .--$_"#{0:x6}"x6#1(16mb-5)


6

JavaScript (ES7), 65 62 61 bayt

Kaydedilen 3 4 @tsh sayesinde bayt

Bir #RRGGBBdizgi dizisi döndürür .

_=>[...Array(n=8**8)].map(_=>'#'+(n++).toString(16).slice(1))

Çevrimiçi deneyin! (kesik çıktı)


Geçerli Python çözümü 8**8yerine kullanın 1<<24. JS üzerinde de çalışır.
tsh


4

Japt, 14 bayt

Çıkışları #rrggbb.

G²³ÇsG ùT6 i'#

Deneyin (İlk 4096 elementle sınırlı)


açıklama

G                  :16
 ²                 :Squared
  ³                :Cubed
   Ç               :Map the range [0,result)
    sG             :  Convert to base-16 string
       ù           :  Left pad
        T          :   With 0
         6         :   To length 6
           i'#     :  Prepend "#"

İlginç bir dil. T harfinin neden "0" için kullanıldığı hakkında bir fikrin var mı? Bir bayt kaydetmek için 16 -> G alıyorum, ancak T -> 0 da aynı şeyi yapmıyor.
Alec

@Alec Çünkü T'yi 0 ile değiştirirseniz, 6 ile birleşir ve 06 olur.
geokavel

Ah, yakaladım. Önceki / sonraki rakamla birleştirilmesini istemediğiniz durumlar için rakam başına bir harf var mı?
Alec

@Alec, geokavel'in dediği gibi, bu özel durumda, bana aktarılan 2 argümanı sınırlamak için virgül kullanmak zorunda kalmamı sağlar ù. Bunun için bir başka tipik kullanım örneği, örneğin bir dizi üzerinde eşleme yaparken bir değişkeni artırmanız gerektiğinde bunu sayaç olarak kullanmaktır. Ve elbette, bir değişken olduğu için, gerekirse ona da bir değer atayabilirsiniz. 0kendi değişkenine sahip tek tek tamsayıdır, ancak - teknik olarak, U-Zvarsayılan olarak 6 giriş değişkeni olarak 7'dir 0. Japt değişkenlere atanan diğer tamsayılar şunlardır: -1, 10-16, 32, 64 & 100.
Shaggy

Japt hakkında daha fazla bilgi edinmek isterseniz, sohbet odamızda bana ping atabilirsiniz .
Shaggy


3

05AB1E , 15 14 10 bayt

15Ýh6ãJ'#ì

Çevrimiçi deneyin.

Açıklama:

15Ý           # Create a list in the range [0, 15]
   h          # Convert each to a hexadecimal value
    6ã        # Create each possible sextuple combination of the list
      J       # Join them together to a single string
       '#ì    # And prepend a "#" before each of them

3

Toplu, 87 bayt

@set s= in (0,1,255)do @
@for /l %%r%s%for /l %%g%s%for /l %%b%s%echo rgb(%%r,%%g,%%b)

CSS formatında çıktılar. Değişken ikamesi for, gerçek kod aşağıdaki gibi olacak şekilde ifade ayrıştırılmadan önce gerçekleşir :

@for /l %%r in (0,1,255)do @for /l %%g in (0,1,255)do @for /l %%b in (0,1,255)do @echo rgb(%%r,%%g,%%b)



2

K (oK) , 19 bayt

Çözüm:

$(3#256)\'!16777216

Çevrimiçi deneyin! (ilk 500 sayı ile sınırlıdır)

Açıklama:

RGB dizelerini boşaltın. 0 ile 16777216 arasındaki her sayıyı 256 tabanına dönüştürün, sonra dizelere dönüştürün ...

$(3#256)\'!16777216 / the solution
          !16777216 / range 0..16777215
 (     )\'          / split each both
  3#256             / 256 256 256
$                   / string

2

MATL , 17 15 bayt

10W:q'#%06X,'YD

Çevrimiçi deneyin!

TIO sürümü ilk 2 ^ 10'u yalnızca zaman aşımına uğramayacak şekilde görüntüler. Gerçekten de sona erdiğini göstermek için altbilgiye son yinelemeyi dahil ettim #FFFFFF. Dizeyi fprintfelle birleştirmek yerine olarak değiştirerek bir bayt kaydedildi . Virgülle ayrılmış bir liste çıkarır.

açıklama

24W:q            % Range from 0 to 2^24-1
     '#%06X,'    % fprintf format spec (# followed by hexadecimal, zero-padded, fixed-width, followed by newline)
             YD  % Call fprintf. Internally loops over range.

2

APL (Dyalog Unicode) , 47 43 20 bayt

'#',(⎕D,⎕A)[↑,⍳616]

Çevrimiçi deneyin!

22416⍴4⍴

23 byte için @Dzaima ve @ ngn'a teşekkürler.

Kullanır ⎕IO←0.

Nasıl:

'#',(⎕D,⎕A)[↑,⍳616]  Main function
               616   Generate every possible 6 digit hex number in a matrix format
              ,        Ravel the matrix (from a 16x16x16x16x16x16 matrix to a 16^6x2 list)
                      Mix; (turns the list into a 16^6x2 matrix)
    (⎕D,⎕A)[       ]  Use that matrix to index the vector of the digits 0-9 concatenated with the alphabet.
'#',                   Then prepend a '#' to each.

1

Ruby , 31 bayt

$><<("#%06x\n"*d=2**24)%[*0..d]

Çevrimiçi deneyin!


%Bu kadar uzun bir dizi ve bu kadar uzun bir dizi alır hayret ediyorum . Bilginize, yerine bir satır sonu kullanarak bir bayt kaydedebilirsiniz \n.
Ürdün

1

V , 25 bayt

8É00lrx16777215ñÄ<C-a>ñ0<C-v>Gls#

Çevrimiçi deneyin! (ikame 16777215ile 31)

açıklama

8É0                                " insert 8 zeroes
   0l                              " move cursor to the second character
     rx                            " replace by x
       16777215ñ      ñ            " 16777215 times do ..
                Ä                  " .. duplicate line
                 <C-a>             " .. increment (leading 0x makes sure it uses hexadecimals)
                       0<C-v>      " move cursor to beginning of line and start selection
                             Gl    " select the column with 0x
                               s#  " replace by #

1

Parti, 69 + 4 = 73

g.cmd, 69

for /L %%A in (0,1,16777215)do cmd/kexit %%A&set #%%A=#!=exitcode:~2!

Onaltılık değeri formla #RRGGBBbirlikte bir 'Dizi'ye kaydeder .

g.cmdkullanılarak çağrılmalıdır cmd /V/Q/K g.cmd. Bu, + 4'ün geldiği yerdir, /V/Qsadece ile karşılaştırıldığında 4 ek karakter olarak sayılır cmd /K g.cmd. Bu, bellekte 'Dizi' bulunan bir ortam oluşturur. Çalışması da sonsuza dek sürer, bu nedenle kullanarak yürütmeyi denemek veya kırmak için çok düşük değerler kullanınCtrl+C


Yıkmak

invokation

  • /Vgecikmeli genişlemeyi etkinleştirir, ancak daha kısadır setlocal EnableDelayedExpansion, bu yüzden cmdilk etapta aramaya ihtiyacımız var
  • /Q çıktıyı atlar ve @echo off
  • /Kbir ifade çalıştırmanıza izin verir (bu durumda g.cmd) ve daha sonra çıkmaz, böylece 'Dizi' seçeneğini kullanarakset #

g.cmd

for /L %%A IN (0,1,16777215) DO (
    cmd /k exit %%A
    set #%%A=#!=exitcode:~2!
)

Bu bit, normal bir sayıyı onaltılık biçime dönüştürmek için burada belgelenen bir hile kullanır ve bu değeri bir 'Dizi'ye kaydeder.


Bu depolama yapısını 'Dizi' olarak adlandırıyorum ama gerçek Diziler Batch'de mevcut olmadığı için aslında doğru değil. ANCAK değişkenleri dizi benzeri isimlere sahip olacak şekilde isimlendirebilirsiniz, şöyle:

set elem[1]=First element
set elem[2]=Second one

veya bu durumda olduğu gibi:

set #1=First element
set #2=Second one

Bunlara yine de şu adresten erişebilirsiniz: !#%position%!


Emin değilim. Ama belki /V/Q/Kde tercüman için "argüman" olarak iddia edilebilir ve "3 + 69 = 72" olarak sayılabilir. meta
tsh

Bunu bilmiyordum ve cevabımı buna göre güncelleyeceğim. Thx @tsh

0

Groovy , 53 bayt

c={a=[];(1<<24).times{a.add "".format("#%06x",it)};a}

İşlev tanımı. c () bir ArrayList döndürür (Sorunun bir dizi sorar bile iyi olduğunu varsayalım).

Ungolfed, örtük türlerle:

ArrayList<String> c = {
    ArrayList<String> a = []
    (1 << 24).times { 
        a.add("".format("#%06x", it)) // add the hex-formatted number to the list.
    }
    return a
}

Çevrimiçi deneyin!


0

Java 10, 87 84 bayt

v->{int i=1<<24;var r=new String[i];for(;i-->0;)r[i]="".format("#%06X",i);return r;}

@ Archangel.mjj sayesinde -3 bayt .

Çevrimiçi deneyin (ilk 4,096öğelerle sınırlı ).

Açıklama:

v->{                       // Method with empty unused parameter & String-array return-type
  int i=1<<24;             //  Integer `i`, starting at 16,777,216
  var r=new String[i];     //  Result String-array of that size
  for(;i-->0;)             //  Loop `i` in the range (16777216, 0]
    r[i]=                  //   Set the `i`'th item in the array to:
      "".format("#%06X",i);//   `i` converted to a hexadecimal value (of size 6)
  return r;}               //  Return the result-array

Mesajımı yazarken bunu siz yayınladınız, bu yüzden çok benzer cevaplarımız var. r[i]="".format("#%06X",i);
Archangel.mjj

@ archangel.mjj Ah, ben bir aptalım. Teşekkürler! Aslında "".format("#%06X",i)Python cevabında gördüğümden beri daha önce vardı , ama cevabı bıraktım çünkü TIO için yeterince hızlı çalışamadım. Sonra herkesin sadece TIO'daki ilk 4,096ürünleri çıkardığını gördüm , bu yüzden cevabı tekrar yazdım, unutuyorum "#%06X"...>. <
Kevin Cruijssen

@KevinCruijssen var rJava ile yapabileceğinizi hiç bilmiyordum ..
FireCubez

@FireCubez Java 10'dan beri yeni. :) Buradavar
Kevin Cruijssen

0

PHP, 68 62 bayt

Bunun bir dosyanın içine yerleştirilmesi gerekir, dizi kullanılabilir şekilde kullanılabilir.

<?foreach(range(0,1<<24)as$i)$a[]=sprintf('#%06x',$i);return$a;

Diziye erişebilmek için, $a = include 'xyz.php';bir değişkene include (örneğin:) sonucunu vermeniz yeterlidir .


@Manatwork'e 6 bayt kurtarıp bir aptallığı düzelttiğiniz için teşekkürler .


1
Bunun %1$06dbiçim dizesi ile onaltılık basamaklar çıkardığından emin misiniz ? Ve kullanmak için hiçbir neden göremiyorum 1$. Uzunluğu, ":" biçim dizesine ekleyerek azaltabilirsiniz #%06x. Şu anda 16777216 = # 1000000'e kadar sayıldığı için aralığı düzeltmek için ekstra karakterler eklerken kullanışlı olur.
manatwork

Eh, .... ben unuttum olmadıysa değiştirmek istiyorum %diçin %x. Ve çağrının #içini hareket ettirmeyi tamamen unuttum sprintf(). Beni 6 bayt kurtardın. Teşekkür ederim
Ismael Miguel

0

MATL , 11 bayt

'#'5Y26Z^Yc

Çevrimiçi deneyin! (altı yerine yalnızca üç onaltılık basamak ile)

açıklama

'#'   % Push this character
5Y2   % Push '01234567890ABCDEF'
6     % Push 6
Z^    % Cartesian power. Gives a (16^6)×6 char matrix
Yc    % String concatenation. '#' is implicitly replicated
      % Implicitly display




0

T-SQL, 122 117 bayt

16,777,216 satırlık bir #RRGGBBdize tablosu döndürür . Satır sonu yalnızca okunabilirlik içindir:

WITH t AS(SELECT 0n UNION ALL SELECT n+1FROM t WHERE n<16777215)
SELECT'#'+FORMAT(n,'X6')FROM t option(maxrecursion 0)

0 ile 2 ^ 24-1 arasındaki bir sayı tablosu için özyinelemeli bir CTE kullanır, ardından 6 basamaklı onaltılık bir dizeyeFORMAT dönüştürmek için yerleşik komutu (SQL 2012 veya sonraki sürümlerde kullanılabilir) kullanır . #Ön tarafa takın, işimiz bitti.

Düzenleme 1: Kaldırılan POWER()işlev, sayı daha kısaydı: P



0

Jöle , 8 bayt

ØHṗ6”#;Ɱ

Çevrimiçi deneyin! (not: olarak 2değil 6,6 TIO dışarı kez)

İşlev gönderme (çünkü Jelly tam programları varsayılan olarak, aralarında sınırlayıcı olmayan dizelerin listelerini yazdırır, böylece sınırları görmeyi zorlaştırır). TIO bağlantısı, ayırmak için yeni satırlar kullanarak dizelerin bir listesini yazdırmak için bir sarıcı içerir.

açıklama

ØHṗ6”#;Ɱ
ØH         All hex digits (“0123456789ABCDEF”)
  ṗ6       Find all strings of 6 of them (order relevant, repeats allowed)
    ”#;    Prepend “#”
       Ɱ     to each of the resulting strings

1
İlgisiz - neden cevabınızı bir topluluk wiki'si yaptınız?
Jonathan Frech

@JonathanFrech: Bunu tüm gönderilerim için yapıyorum çünkü a) insanların itibar sistemini oynama teşvikini azaltır (gönderi itibar vermediğinden), b) Yayınlarımı düzenlemekten ve topluluktan - wiki işaretleyici bunu göstermenin bir yoludur. Stack Exchange'in itibar sistemi aşağı yukarı tamamen kırılmış: geçmiş bir hesapta, sistemin oyunun ne kadar kolay olduğunu göstermek için bir hafta boyunca her gün kasıtlı olarak her gün tekrar kapadım. Günümüzde hemen hemen hiç bir parçası istemiyorum, özellikle de daha yüksek itibar sadece sitenin onu yönetmeye ikna etmeye çalışmasını sağlıyor.
ais523

Sadece merak ediyorum - itibar sistemini oynamak için hangi destede başardınız?
Jonathan Frech

@JonathanFrech: Bu. 20 bin kullanıcıydım, ancak sonunda hesabımı sildim çünkü hayatımı biraz karıştırıyordu ve itibar sistemi beni daha iyi değil, siteyi daha da kötüleştiren içerik yapmaya itiyordu.
ais523



0

Perl 6 , 26 bayt

{map *.fmt("#%06X"),^8**8}

Çevrimiçi deneyin!

Herkesle aynı formatı kullanır. TIO'da zaman aşımına uğradı.

Veya, rgb biçiminde:

31 bayt

{map {"rgb($_)"},[X] ^256 xx 3}

Çevrimiçi deneyin!


Ben rgb çıktı rgb(0, 0, 0)dize dahil olması gerektiğini düşünüyorum rgb.
nwellnhof

@nwellnhof Güncellendi (onaltılık yapmak daha kısa sürdü)
Jo King
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.