Generasi RGB Gradien


18

Tantangan

Mengingat dua string heksadesimal huruf besar (baik 6 karakter, XXXXXX dan YYYYYY) mewakili nilai-nilai RGB (mulai dari 000000ke FFFFFFinklusif), dan non-nol positif bilangan bulat N, menampilkan transisi linier dari N + 2 warna yang dihasilkan dari XXXXXX ke YYYYYY yang akan menghasilkan gradien warna.

Contoh

Memasukkan

FF3762
F08800
9

Keluaran

Harap perhatikan dalam contoh kami, saya telah meminta 9 langkah sementara antara dua warna, oleh karena itu 11 baris akan ditampilkan dari warna awal ke warna akhir

FF3762
FD3F58
FC474E
FA4F44
F9573A
F75F31
F66727
F46F1D
F37713
F17F09
F08800

Peringatan

Walaupun saya telah pergi dengan proses linear sederhana untuk mendapatkan nilai integer untuk warna interim sebelum mengubahnya kembali menjadi heksadesimal, metode Anda mungkin bervariasi. Harap pertimbangkan berbagai cara seseorang dapat mengumpulkan / menurunkan angka Anda .

Pengujian

Untuk membuat ini menarik, saya telah memberikan cuplikan untuk memungkinkan pengujian kode Anda, termasuk tombol untuk memberi Anda dua warna acak untuk menguji kode Anda. Menampilkan hasil Anda adalah opsional, tetapi dianjurkan!

c1=()=>('00000'+(Math.random()*(1<<24)|0).toString(16)).slice(-6);

$("#col").click(function(){
  alert("Your two colors are: "+c1()+" and "+c1()+".");
});
        
$("#colors").blur(function(){
  $("#test").empty();
	var colArr = $("#colors").val().split("\n");
	for(c in colArr){
  	$("#test").append('<div class="tester" style="background-color:#'+colArr[c]+';">'+colArr[c]+'</div>')
  }
  
});
.tester{height: 20px;
width: 60px;padding: 4px;border: 1px solid black;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="col">Your two colors</button><br />
<textarea id="colors"></textarea>
<div id="test">

</div>

1) Anda dapat mengakses dua warna acak untuk pengujian Anda dengan mengklik tombol "Dua warna Anda". 2) Jumlah langkah sementara akan sama dengan jumlah karakter dalam nama pengguna PPCG Anda termasuk spasi, dalam kasus "WallyWest" akan 9 (seperti contoh saya di atas). 3) Jalankan kode Anda dengan dua warna dan angka dan setelah Anda membuat daftar yang dihasilkan, Anda memiliki opsi untuk menempelkan output Anda ke dalam textarea dan menabraknya untuk mendapatkan gradien warna yang dihasilkan.

Contoh saya ditunjukkan di sini:

Gradien

Harus saya akui, itu terlihat sangat luar biasa!

Harap dicatat: Seperti yang saya sebutkan, menunjukkan pengujian Anda terhadap output Anda menggunakan snippet adalah opsional, tetapi dianjurkan! :)

Keluaran

Output daftar harus dalam bentuk N + 2 set 6 digit angka hex yang dipisahkan oleh feed baris (\ n) seperti yang ditunjukkan pada contoh saya di atas. Output dapat dalam bentuk baris terpisah, spasi / daftar dipisahkan koma, array atau apa pun yang paling cocok untuk bahasa Anda ... (Terima kasih @nimi untuk informasi selanjutnya) Harap diingat, bahwa jika Anda berencana untuk menguji kode Anda dengan cuplikan, namun Anda memisahkan setiap "warna" terserah Anda.

Aturan

Ini adalah kode-golf, sehingga solusi terpendek dalam byte akan dinobatkan sebagai pemenang. Tidak ada celah , secara alami. Input harus menerima dua string dan angka (yang seperti yang saya katakan akan setara dengan jumlah huruf dalam nama pengguna Anda di PPCG, sehingga output yang Anda hasilkan akan selalu minimal sepanjang tiga baris.



Tercatat, dan diperbarui ... Terima kasih atas up (+1)
WallyWest

Karena penasaran, apakah aplikasi gambar seperti Illustrator menggunakan gradien linier atau gradien di beberapa ruang warna persepsi? Saya dapat melihat kasus penggunaan untuk keduanya (mungkin Anda melakukan transformasi ke persepsi nanti misalnya tekstur untuk permainan).
Robert Fraser

Jawaban:


1

MATL , 31 byte

2+1yhjjh2e!1ZA3e!b:1&Ynk8W5Y2Za

Ini menggunakan interpolasi linier dengan pembulatan ke bawah. Format input adalah

9
FF3762
F08800

Cobalah online!

Output grafis, 31 byte

2+1yhjjh2e!1ZA3e!b:t2YG1&Ynk2ZG

Ini adalah hasil untuk input

5
FF3762
F08800

masukkan deskripsi gambar di sini

Cobalah di MATL Online ! Penerjemah saat ini sedang dalam percobaan. Jika Anda tidak mendapatkan output, segarkan halaman dan tekan "Run" lagi.


4

JavaScript (ES6), 130 byte

g=
(f,t,n)=>[...Array(++n+1)].map((_,i)=>f.replace(/../g,(e,j)=>((`0x${e}`*(n-i)+`0x${t[j]+t[j+1]}`*i)/n|256).toString(16).slice(1)))
;
p=_=>g(f.value,t.value,+n.value).map(e=>o.insertRow().insertCell().appendChild(document.createTextNode(e)).parentNode.bgColor=e);
<input id=f value=e14f09><input id=t value=9a04f6><input id=n value=4 type=number><input type=button onclick=p() value=Go!><table id=o bgcolor=black cellpadding=4>


3

Dyalog APL , 44 byte

Anjuran untuk N , maka B eginning-warna, maka E nding-warna. Kebutuhan ⎕IO←0yang standar pada banyak sistem.

h[↑⌊B∘+¨(⍳2+N)×(-/E B←(h←⎕D,⎕A)∘⍳¨⍞⍞)÷1+N←⎕]

h[... ]indeks menjadi h (yang memiliki nilai ketika kami selesai mengevaluasi konten braket)

N←⎕prompt untuk numerik N (4)

1+tambahkan satu ke N (5)

(... gunakan itu untuk membagi hasil dari ...

  ⍞⍞ prompt untuk dua string karakter ["7E0E7E", "FF3762"]

  (... )∘⍳¨temukan indeks masing-masing karakter string di ...

   ⎕D,⎕A D igits diikuti oleh A lphabet

   h←ditugaskan untuk h

  sekarang kami memiliki "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

  E B←menetapkan indeks untuk E dan B [[7,14,0,14,7,14], [15,15,3,7,6,2]]

  -/kurangi dan lampirkan B dari E [[-8, -1, -3,7,1,12]]

  hasilnya sejauh ini adalah [[-1.6, -0.2, -0.6,1.4.0.2.2.4]]

(... kalikan ini dengan ...

  2+Ndua ditambah N (6)

   bilangan bulat pertama [0,1,2,3,4,5]

 ini memberi kita [[0,0,0,0,0,0], [- 1,6, -0,2, -0,6,1,4,0,2,2,4], [- 3,2, -0,4, -1,2,2,8,0,4,4,8 ], ...]

B∘+¨tambahkan B ke masing-masing [[15,15,3,7,6,2], [13,4,14,8,2,4,8,4,6,2,4,4], [11,8,14,6,1,8,9,8,6,4,6,8], ... ]

bulat [[15,15,3,7,6,2], [13,14,2,8,6,4], [11,14,1,9,6,6], ...]

buat daftar daftar menjadi tabel

[[15,15, 3, 7, 6, 2]
 [13,14, 2, 8, 6, 4]
 [11,14, 1, 9, 6, 6]
 [10,14, 1,11, 6, 9]
 [ 8,14, 0,12, 6,11]
 [ 7,14, 0,14, 7,14]]

di sini kita indeks ke dalam h , memberi

[["F","F","3","7","6","2]
 ["D","E","2","8","6","4]
 ["B","E","1","9","6","6]
 ["A","E","1","B","6","9]
 ["8","E","0","C","6","B]
 ["7","E","0","E","7","E]]

yang sama dengan

[["FF3762"]
 ["DE2864"]
 ["BE1966"]
 ["AE1B69"]
 ["8E0C6B"]
 ["7E0E7E"]]

dan mencetak sebagai

FF3762
DE2864
BE1966
AE1B69
8E0C6B
7E0E7E

gradien

TryAPL online!


Kerja bagus! Transisi terlihat hebat!
WallyWest

@WallyWest Terima kasih. Ini mungkin merupakan transisi linear yang berbeda dari kebanyakan: Setiap huruf ditransisikan secara terpisah.
Adám

2

Pyth - 35 byte

Golfnya mengerikan, baru saja menyerah.

j++hQsMCm.HMsM:F+dc-FdvzCmiR16cd2Qe

Cobalah online di sini .

Contoh:

contoh


Saya menghitung 11 garis gradien, meskipun nama PPCG Anda hanya memiliki 8 huruf ... Jadi, bukankah Anda harus memasukkan 7cb472 93fb8a 8dan hanya menerima 10 garis output saat menguji kode Anda?
WallyWest

@WallyWest benar-benar merindukan bagian dalam OP tentang nama pengguna, saya hanya menggunakan 9 karena Anda lakukan, memperbaiki.
Maltysen

@WallyWest diperbarui
Maltysen

Hey @Maltysen, gradien sepertinya agak aneh ... Anda punya dua referensi dari 93fb8a... Apakah kode Anda menghasilkan dua baris dengan nilai yang sama?
WallyWest

2

PowerShell v2 +, 176 159 150 byte

param($a,$b,$n)$x=$a-split'(..)'-ne'';$a;++$n..1|%{$j=$_;-join($x=$x|%{"{0:x2}"-f(+"0x$_"-[int]((+"0x$_"-"0x$(($b-split'(..)'-ne'')[$i++%3])")/$j))})}

Mengambil input sebagai dua string dan angka, kemudian mengubah string awal menjadi array string yang dibagi pada setiap dua karakter, menyimpannya menjadi $x. Kami kemudian output $asebagai bagian awal kami, dan loop dari ++$nke 1(untuk memastikan fenceposting tepat).

Setiap iterasi, tetapkan helper $jke nomor saat ini (digunakan nanti untuk memastikan kami memiliki jumlah langkah yang tepat antara tempat kami saat ini ke tujuan kami) dan menghitung langkah selanjutnya berdasarkan pada perulangan $x.

Setiap loop batin hanyalah sebuah tugas. Kami menyetel $xdi tempat yang tepat sama dengan string baru "{0:x2}"menggunakan -foperator ormat. Di x2sini menentukan output heksadesimal dua digit, dan inputnya adalah sisi kanan -foperator. PowerShell memiliki operator hexadecimal-to-desimal asli 0x, jadi ungkapan parens-nested panjang ini menggunakan operator itu untuk mengubah hex saat ini menjadi angka, mengurangi untuk menemukan perbedaan yang belum pergi (dilakukan dengan memisahkan secara dinamis di $bsini seperti yang kami lakukan $a, dan menggunakan modulo untuk memilih elemen yang tepat), membaginya dengan $jlangkah yang tersisa, casting ke[int] (PowerShell melakukan pembulatan bankir secara default), dan mengurangi langkah-hitung dari hex saat ini untuk mendapatkan apa yang perlu hex berikutnya.

Hasil perhitungan itu disimpan kembali menjadi $xtiga elemen hex. Itu diringkas dalam parens untuk membuat salinan pada pipa, dan -joindiedit menjadi satu string. Semua string yang dihasilkan dibiarkan dalam pipa, dan output melalui implisit Write-Outputterjadi pada eksekusi program.


Contoh

Saya diberi 0ba7c5 dan 6c0e50 untuk dua warna saya, dan TimmyD memiliki 6 karakter di dalamnya.

PS C:\Tools\Scripts\golfing> .\rgb-gradients-generation.ps1 '0ba7c5' '6c0e50' 6
0ba7c5
1991b4
277ba3
356592
434f82
513971
5f2361
6c0e50

Contoh Gradien


1

Python 2, 189 byte

w='[int(%s[i:i+2],16)for i in range(0,6,2)]'
def f(a,b,n):
 l=lambda x,y:'%02x'%int((x*(n-i)+y*i)/n);c,d,e=eval(w%'a');f,g,h=eval(w%'b');n+=1
 for i in range(n+1):print l(c,f)+l(d,g)+l(e,h)

tangkapan layar gradien


Sepasang warna yang cantik, @AndrewEpstein ... Kerja bagus dengan kodenya!
WallyWest

1

[Groovy] Pembaruan Akhir (199 Bytes) - Sesuai permintaan

Non-golf

def g(a,b,n){
  (0..(1.0/n)).collect{
    c->
    x={s->s.split("(?<=\\G.{2})").collect{Integer.parseInt(it,16)}};
    (0..2).collect {
      (int)(x(a).get(it)*n*c+x(b).get(it)*(1-n*c))
    }.collect {
      String.format("%X", it)
    }.join()
  }
}
g('FFFFFF','000000',1/10​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​)​​​​​​​​​​​​​​

Golf

g(a,b,n){(0..(1.0/n)).collect{c->x={s->s.split("(?<=\\G.{2})").collect{Integer.parseInt(it,16)}};(0..2).collect {(int)(x(a).get(it)*n*c+x(b).get(it)*(1-n*c))}.collect{String.format("%X",it)}.join()}}

Coba yang terakhir di sini: https://groovyconsole.appspot.com/script/5130696796405760


VERSI LAMA DI BAWAH INI, DITENTUKAN OLEH OP


Groovy (123 Bytes)

Golf

def g(r,g,b,r2,g2,b2,s){(1..(1.0/s)).collect{c->[(int)(r*s*c+r2*(1-s*c)),(int)(g*s*c+g2*(1-s*c)),(int)(b*s*c+b2*(1-s*c))]}}

Non-golf

def g(r,g,b,r2,g2,b2,s){
  (1..(1.0/s)).collect {
    c ->
    [(int)(r*s*c+r2*(1-s*c)),(int)(g*s*c+g2*(1-s*c)),(int)(b*s*c+b2*(1-s*c))]
  }
}

Input

r,g,b -> Starting RGB Color
r2,g2,b2 -> Ending RGB Color
s -> Gradient step

Contoh Keluaran

(00,00,00,255,255,255,.5)

hasil dalam

[
  [255, 255, 255]
  [127, 127, 127]
  [0, 0, 0]
]

Cobalah sendiri: https://groovyconsole.appspot.com/script/5184465357766656

Dengan Termasuk Konversi Hex

Kira saya agak curang juga ... Ini skrip dengan menggunakan hex:

Kode baru dengan konversi hex:

​    def g(r,g,b,r2,g2,b2,s){
      (0..(1.0/s)).collect {
        c ->
        String.format("%X", ((int)(r*s*c+r2*(1-s*c)))) +  String.format("%X", ((int)(g*s*c+g2*(1-s*c)))) + "" +  String.format("%X", ((int)(b*s*c+b2*(1-s*c))))
      }
    }

    g(126,34,166,218,26,33,0.0625)​

188 karakter saat bermain golf:

def g(r,g,b,r2,g2,b2,s){(0..(1.0/s)).collect {c->String.format("%X",((int)(r*s*c+r2*(1-s*c))))+String.format("%X",((int)(g*s*c+g2*(1-s*c))))+String.format("%X",((int)(b*s*c+b2*(1-s*c))))}}

Output untuk 000000 hingga FFFFFF dan 16 (Panjang Nama Pengguna)

g(00,00,00,255,255,255,0.0625).each{println it}​

Gradien Monokromatik dengan 1/16 Langkah


Err ... sedikit tidak valid, versi asli yang digunakan "(0 .. (1.0 / s))", seharusnya "(1 .. (1.0 / s))".
Magic Octopus Urn

1
Hi @carusocomputing ... Input harus berupa dua string heksadesimal dan bilangan bulat ... Saya tidak yakin apakah Groovy dapat mengambil input dengan cara ini, tetapi Anda belum cukup memahaminya ... Bisakah Anda perbarui kode Anda berdasarkan input yang disebutkan di bagian Tantangan?
WallyWest

{s-> s.split("(?<=\\G.{2})").collect{Integer.parseInt(it,16)}}('FFFFFF') Hasil dalam [255.255.255] Saya dapat menambahkan 62 byte ke kode saya menggunakan konversi itu jika Anda benar-benar menginginkannya.
Magic Octopus Urn

1
Wally, saya telah menambahkan versi yang diperbarui dan meningkatkan jumlah byte terakhir saya ke 199 dengan konversi disertakan.
Magic Octopus Urn

1

R, 68 byte

Ada fungsi bawaan yang menginterpolasi dua warna:

a=scan(,'')
colorRampPalette(paste0("#",a[1:2]))(as.numeric(a[3])+2)

Memasukkan:

d9e7a5
3ef951
15

Output: vektor dengan nilai

"#D9E7A5" "#CFE89F" "#C5E99A" "#BBEA95" "#B2EB90" "#A8EC8A" "#9EED85" "#95EE80"
"#8BF07B" "#81F175" "#78F270" "#6EF36B" "#64F466" "#5BF560" "#51F65B" "#47F756"
"#3EF951"

Spesifikasi warna dalam R memerlukan simbol hash.

Ramp warna

Mari kita plot sesuatu, seperti fungsi:

filled.contour(outer(1:20, 1:20, function(x,y) sin(sqrt(x*y)/3)),
    col = colorRampPalette(paste0("#",a[1:2]))(as.numeric(a[3])+2))

sin (sqrt (x * y) / 3)


Jawaban yang bagus, tetapi briefnya meminta untuk menggunakan sebanyak mungkin langkah yang ada pada nama pengguna PPCG Anda, yang menghitung spasinya menjadi 15 ... Bisakah Anda memperbarui jawaban berdasarkan FF3762 F08800 15?
WallyWest

@WallyWest Maaf, saya telah melewatkan bagian di mana satu mendapatkan dua warna dan menghitung panjang nama pengguna sendiri. Sekarang jawabannya harus sepenuhnya sesuai dengan spesifikasi!
Andreï Kostyrka

1

C, 175 169 168 byte

i;j;x[6];f(a,b,n)char*a,*b;{char*f="%2x%2x%02x";for(n++;i<=n;i++,puts(""))for(j=sscanf(a,f,x,x+1,x+2)-sscanf(b,f,x+3,x+4,x+5);j++<printf(f+6,x[j]+(x[j+3]-x[j])*i/n););}

Tidak Disatukan:

int i, j;
int x[3], y[3];

f(char *a, char *b, int n) {
  sscanf(a, "%2x%2x%2x", &x[0], &x[1], &x[2]);
  sscanf(b, "%2x%2x%2x", &y[0], &y[1], &y[2]);

  for(i = 0, n++; i <= n; i++) {
    for(j = 0; j < 3; j++)
      printf("%02x", x[j] + (y[j] - x[j]) * i / n);
    puts("");
  }
}

Terima kasih kepada @ h-walters karena mencukur 5 byte!


Ingatkan saya apa yang dilakukan putssintaks lagi?
WallyWest

Itu seperti printf(), tetapi tidak melakukan format apa pun, melainkan hanya mencetak string yang diberikan apa adanya, dan menambahkan baris baru.
G. Sliepen

Ah, jadi tidak mungkin main golf itu ... C agak membatasi seperti itu, bukan?
WallyWest

"jadi tidak mungkin main golf itu" ... Tentu ada! Pindah puts("")ke bagian ketiga dari loop pertama ( ;setelah menjadi ,sebelum) ... +0 byte. Namun, ini memungkinkan Anda untuk menghapus kurung kurawal setelah loop kedua ... -2 byte. Anda dapat menyimpan 1 byte lainnya dengan menghapus 3 dari j<3, dan menggantinya dengan printfpernyataan Anda (ini licik ... printf hanya akan mengembalikan 2, tetapi masih harus mengevaluasi ketiga kalinya).
H Walters

... dua byte lagi dapat disimpan dengan mengurangi nilai pengembalian sscanf Anda satu sama lain (menghasilkan 0), dan menggunakannya sebagai ganti dari literal 0in j=0. Setelah semuanya ada di sini, program Anda harus lebih pendek 5 byte, dan setidaknya 50% orang asing.
H Walters

1

sh + ImageMagick, 81 byte

convert -size 1x$((2+$3)) gradient:#$1-#$2 -depth 8 txt:-|grep -o "[A-F0-9]\{6\}"

pemakaian:

> ./grad.sh FF3762 F08800 9
FF3762
FE3F58
FC474E
FB4F45
F9573B
F86031
F66827
F5701D
F37814
F2800A
F08800

("-depth 8" tidak diperlukan jika IM Anda dikompilasi dengan 8bpp sebagai default)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.