Thế hệ sinh viên RGB


18

Các thách thức

Cho hai chuỗi thập lục phân chữ hoa (dài cả 6 ký tự, XXXXXX và YYYYYY) đại diện cho các giá trị RGB (từ bao gồm 000000đến FFFFFFbao gồm) và một số nguyên N khác không dương, hiển thị chuyển đổi tuyến tính của các màu N + 2 được tạo từ XXXXXX sang YYYYYY Điều đó sẽ dẫn đến một gradient màu.

Thí dụ

Đầu vào

FF3762
F08800
9

Đầu ra

Xin lưu ý trong ví dụ của chúng tôi, tôi đã yêu cầu 9 bước tạm thời giữa hai màu, do đó 11 dòng sẽ được hiển thị từ màu ban đầu đến màu cuối cùng

FF3762
FD3F58
FC474E
FA4F44
F9573A
F75F31
F66727
F46F1D
F37713
F17F09
F08800

Hãy cẩn thận

Mặc dù tôi đã thực hiện một quy trình tuyến tính đơn giản để lấy các giá trị nguyên cho các màu tạm thời trước khi chuyển chúng trở lại thành thập lục phân, các phương thức của bạn có thể thay đổi. Vui lòng xem xét các cách khác nhau để làm tròn / giảm số của bạn cho phù hợp.

Kiểm tra

Để làm cho điều này thú vị, tôi đã cung cấp một đoạn mã để cho phép kiểm tra mã của bạn, bao gồm một nút để cung cấp cho bạn hai màu ngẫu nhiên để kiểm tra mã của bạn. Hiển thị kết quả của bạn là tùy chọn, nhưng nó được khuyến khích!

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) Bạn có thể truy cập hai màu ngẫu nhiên cho bài kiểm tra của mình bằng cách nhấp vào nút "Hai màu của bạn". 2) Số lượng các bước tạm thời sẽ giống như số lượng ký tự trong tên người dùng PPCG của bạn đã bao gồm khoảng trắng, trong trường hợp "WallyWest" sẽ là 9 (theo ví dụ của tôi ở trên). 3) Chạy mã của bạn với hai màu và số và một khi bạn có danh sách đã tạo, bạn có tùy chọn dán đầu ra của bạn vào vùng văn bản và tách ra khỏi nó để lấy gradient màu được tạo.

Ví dụ của tôi được hiển thị ở đây:

Độ dốc

Tôi phải thừa nhận, điều đó trông khá tuyệt vời!

Xin lưu ý: Như tôi đã đề cập, việc hiển thị thử nghiệm đầu ra của bạn bằng đoạn mã là tùy chọn, nhưng điều đó được khuyến khích! :)

Đầu ra

Đầu ra danh sách phải ở dạng N + 2 bộ gồm các số hex gồm 6 chữ số được phân tách bằng các nguồn cấp dữ liệu (\ n) như trong ví dụ của tôi ở trên. Đầu ra có thể ở dạng các dòng riêng biệt, danh sách được phân tách bằng dấu cách / dấu phẩy, một mảng hoặc bất cứ thứ gì phù hợp nhất với ngôn ngữ của bạn ... (Cảm ơn @nimi đã đề cập) Hãy nhớ rằng, nếu bạn có kế hoạch kiểm tra mã của mình với đoạn trích, tuy nhiên bạn tách riêng từng "màu" là tùy thuộc vào bạn.

Quy tắc

Đây là môn đánh gôn, vì vậy giải pháp ngắn nhất tính theo byte sẽ được trao cho người chiến thắng. Không có sơ hở , tự nhiên. Đầu vào phải chấp nhận hai chuỗi và một số (như tôi đã nói sẽ tương đương với số lượng chữ cái trong tên người dùng của bạn trên PPCG, do đó đầu ra kết quả của bạn sẽ luôn dài tối thiểu ba dòng.



Lưu ý và cập nhật ... Cảm ơn vì đã ngẩng cao đầu (+1)
WallyWest

Vì tò mò, các ứng dụng hình ảnh như Illustrator có sử dụng độ dốc tuyến tính hoặc độ dốc trong một số không gian màu cảm nhận không? Tôi có thể thấy các trường hợp sử dụng cho cả hai (có thể bạn đang thực hiện chuyển đổi sang nhận thức sau này, ví dụ: kết cấu cho trò chơi).
Robert Fraser

Câu trả lời:


1

MATL , 31 byte

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

Điều này sử dụng phép nội suy tuyến tính với làm tròn xuống. Định dạng đầu vào là

9
FF3762
F08800

Hãy thử trực tuyến!

Đầu ra đồ họa, 31 byte

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

Đây là kết quả cho đầu vào

5
FF3762
F08800

nhập mô tả hình ảnh ở đây

Hãy thử nó trong MATL Online ! Thông dịch viên hiện đang thử nghiệm. Nếu bạn không nhận được bất kỳ đầu ra nào, hãy làm mới trang và nhấn "Chạy" lại.


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

APL Dyalog , 44 byte

Nhắc nhở cho N , sau đó B eginning-color, sau đó là E -color-color. Nhu cầu ⎕IO←0được mặc định trên nhiều hệ thống.

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

h[... ]lập chỉ mục thành h (có giá trị khi chúng tôi hoàn thành đánh giá nội dung của khung)

N←⎕lời nhắc cho số N (4)

1+thêm một vào N (5)

(... sử dụng nó để phân chia kết quả của ...

  ⍞⍞ lời nhắc cho hai chuỗi ký tự ["7E0E7E", "FF3762"]

  (... )∘⍳¨tìm chỉ số của các ký tự của mỗi chuỗi trong ...

   ⎕D,⎕A D igits theo sau bởi A lph.us

   h←giao cho h

  bây giờ chúng tôi có "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

  E B←gán các chỉ số cho EB [[7,14,0,14,7,14], [15,15,3,7,6,2]]

  -/trừ và gửi B từ E [[-8, -1, -3,7,1,12]

  kết quả cho đến nay là [[-1,6, -0,2, -0,6,1,4,0,2,2,4]]

(... nhân số này với ...

  2+Nhai cộng N (6)

   số nguyên đầu tiên [0,1,2,3,4,5]

 điều này mang lại cho chúng tôi [[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∘+¨thêm B vào mỗi [[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], ... ]

làm tròn xuống [[15,15,3,7,6,2], [13,14,2,8,6,4], [11,14,1,9,6,6], ...]

lập danh sách các danh sách vào bảng

[[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]]

ở đây chúng tôi lập chỉ mục vào h , cho

[["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]]

giống như

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

và in như

FF3762
DE2864
BE1966
AE1B69
8E0C6B
7E0E7E

dốc

Dùng thử trực tuyến!


Công việc tốt đẹp! Quá trình chuyển đổi trông thật tuyệt!
WallyWest

@WallyWest Cảm ơn. Nó có thể là một chuyển đổi tuyến tính khác với hầu hết làm: Mỗi chữ cái được chuyển đổi riêng biệt.
Adám

2

Pyth - 35 byte

Chơi golf khủng khiếp, chỉ bỏ cuộc.

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

Hãy thử trực tuyến tại đây .

Thí dụ:

thí dụ


Tôi đếm 11 dòng gradient, mặc dù tên PPCG của bạn chỉ có 8 chữ cái ... Vì vậy, bạn không nên nhập 7cb472 93fb8a 8và chỉ nhận được 10 dòng đầu ra khi kiểm tra mã của mình?
WallyWest

@WallyWest hoàn toàn bỏ lỡ phần đó trong OP về tên người dùng, tôi mới sử dụng 9 cuz bạn đã làm, sửa.
Maltysen

@WallyWest được cập nhật
Maltysen

Xin chào @Maltysen, độ dốc có vẻ hơi kỳ lạ ... bạn đã có hai tài liệu tham khảo về 93fb8a... Mã của bạn có xuất ra hai dòng có cùng giá trị không?
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))})}

Lấy đầu vào là hai chuỗi và một số, sau đó chuyển đổi chuỗi bắt đầu thành một chuỗi các chuỗi được phân chia trên mỗi hai ký tự, lưu trữ thành chuỗi $x. Chúng tôi sau đó sản lượng $anhư phần bắt đầu của chúng tôi, và vòng lặp từ ++$nđể 1(để đảm bảo fenceposting thích hợp).

Mỗi lần lặp, đặt trình trợ giúp $jcho số hiện tại (được sử dụng sau này để đảm bảo chúng tôi có đúng số bước giữa nơi chúng tôi hiện đang đến đích) và tính bước tiếp theo dựa trên vòng lặp $x.

Mỗi vòng lặp bên trong chỉ là một nhiệm vụ. Chúng tôi đang đặt $xở vị trí thích hợp bằng với một chuỗi mới "{0:x2}"bằng cách sử dụng -ftoán tử ormat. Ở x2đây chỉ định đầu ra thập lục phân hai chữ số và đầu vào là phía bên phải của -ftoán tử. PowerShell có một toán tử thập lục phân thập phân nguyên gốc 0x, do đó biểu thức lồng nhau dài này đang sử dụng toán tử đó để chuyển đổi hex hiện tại thành các số, trừ đi để tìm sự khác biệt chưa xảy ra (được thực hiện bằng cách tách động $bở đây giống như chúng ta đã làm $a, và sử dụng modulo để chọn đúng phần tử), chia cho $jcác bước còn lại, chuyển sang một[int] (PowerShell thực hiện làm tròn số ngân hàng theo mặc định) và trừ đi số bước đó từ hex hiện tại để có được những gì hex tiếp theo của chúng ta cần phải có.

Kết quả của phép tính đó được lưu trữ lại thành $xba phần tử hex. Điều đó được gói gọn trong các parens để tạo một bản sao trên đường ống và -joinghép lại thành một chuỗi. Tất cả các chuỗi kết quả được để lại trên đường ống và đầu ra thông qua ẩn Write-Outputxảy ra khi thực hiện chương trình.


Thí dụ

Tôi đã được đưa ra 0ba7c56c0e50 cho hai màu sắc của tôi, và TimmyD có 6 nhân vật trong đó.

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

Ví dụ về Gradient


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)

ảnh chụp màn hình gradient


Cặp màu tuyệt đẹp, @AndrewEpstein ... Làm việc tốt với mã!
WallyWest

1

[Groovy] Cập nhật cuối cùng (199 byte) - Theo yêu cầu

Không chơi gôn

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

Hãy thử trận chung kết tại đây: https://groovyconsole.appspot.com/script/5130696796405760


PHIÊN BẢN OLD DƯỚI ĐÂY, TUYỆT VỜI B OPNG OP


Groovy (123 byte)

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

Không chơi gôn

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

Đầu vào

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

Ví dụ đầu ra

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

kết quả trong

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

Hãy tự mình thử: https://groovyconsole.appspot.com/script/5184465357766656

Có chuyển đổi Hex bao gồm

Đoán tôi cũng gian lận ... Đây là kịch bản sử dụng hex:

Mã mới với chuyển đổi 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 ký tự khi chơi gôn:

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

Đầu ra cho 000000 đến FFFFFF và 16 (Độ dài tên người dùng)

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

Gradient đơn sắc với 1/16 bước


Err ... hơi không hợp lệ, phiên bản gốc được sử dụng "(0 .. (1.0 / s))", nên là "(1 .. (1.0 / s))".
Bạch tuộc ma thuật Urn

1
Xin chào @carusocomputing ... Đầu vào cần phải là hai chuỗi thập lục phân và một số nguyên ... Tôi không chắc Groovy có thể lấy đầu vào theo cách này không, nhưng bạn chưa hoàn toàn tóm tắt ... Bạn có thể cập nhật mã của bạn dựa trên đầu vào được đề cập trong phần Thử thách?
WallyWest

{s-> s.split("(?<=\\G.{2})").collect{Integer.parseInt(it,16)}}('FFFFFF') Kết quả trong [255,255,255] Tôi có thể thêm 62 byte vào mã của mình bằng cách sử dụng chuyển đổi đó nếu bạn thực sự muốn tôi.
Bạch tuộc ma thuật Urn

1
Wally, tôi đã thêm một phiên bản cập nhật và tăng số byte cuối cùng của tôi lên 199 với các chuyển đổi được bao gồm.
Bạch tuộc ma thuật Urn

1

R, 68 byte

Có một hàm tích hợp nội suy hai màu:

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

Đầu vào:

d9e7a5
3ef951
15

Đầu ra: một vectơ có giá trị

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

Đặc tả màu trong R yêu cầu ký hiệu băm.

Đường dốc màu

Hãy vẽ một cái gì đó, như một hàm:

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

tội lỗi (sqrt (x * y) / 3)


Câu trả lời tuyệt vời, nhưng tóm tắt yêu cầu sử dụng bao nhiêu bước trong tên người dùng PPCG của bạn, tính không gian này tạo ra 15 ... Bạn có thể vui lòng cập nhật câu trả lời của mình dựa trên FF3762 F08800 15không?
WallyWest

@WallyWest Xin lỗi, tôi đã bỏ lỡ phần đó khi một người có được hai màu và đếm chiều dài tên người dùng của mình. Bây giờ câu trả lời phải hoàn toàn phù hợp với đặc điểm kỹ thuật!
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););}

Ung dung:

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

Cảm ơn @ h-walters đã loại bỏ 5 byte!


Nhắc tôi những gì putscú pháp làm lại?
WallyWest

Nó giống như printf(), nhưng không thực hiện bất kỳ định dạng nào, thay vào đó nó chỉ in chuỗi đã cho, và nó thêm một dòng mới.
G. Sliepen

À, vậy không có cách chơi gôn nào cả ... C hơi hạn chế như thế phải không?
WallyWest

"Vì vậy, không có cách chơi golf nào" ... Chắc chắn là có! Di chuyển puts("")vào phần thứ ba của vòng lặp for đầu tiên ( ;sau khi trở thành ,trước) ... +0 byte. Tuy nhiên, điều này cho phép bạn loại bỏ các dấu ngoặc nhọn sau vòng lặp thứ hai ... -2 byte. Bạn có thể lưu thêm 1 byte bằng cách xóa 3 byte j<3và thay thế nó bằng printfcâu lệnh của bạn (điều này thật lén lút ... printf sẽ chỉ trả về 2, nhưng nó vẫn phải đánh giá lần thứ ba).
H Walters

... hai byte hơn có thể được lưu bằng cách trừ giá trị trả lại sscanf của bạn từ mỗi khác (dẫn đến 0), và sử dụng rằng thay vì đen 0trong j=0. Khi mọi thứ ở đây được đặt đúng chỗ, chương trình của bạn sẽ ngắn hơn 5 byte và ít nhất 50% là người lạ.
H Walters

1

sh + ImageMagick, 81 byte

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

sử dụng:

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

("-depth 8" là không cần thiết nếu IM của bạn được biên dịch với 8bpp làm mặc định)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.