RGB 그라디언트 생성


18

도전

두 대문자 진수 문자열이 주어 (모두 6 자, XXXXXX 및 YYYYYY) (에서부터 RGB 값을 표현 000000FFFFFF포함) 및 0이 아닌 양의 N 정수는 XXXXXX에서 YYYYYY하여 발생하는 N + 2 색의 선형 전이를 표시 색상 그라디언트가 발생합니다.

입력

FF3762
F08800
9

산출

이 예에서 두 색상 사이에 9 개의 중간 단계를 요청 했으므로 초기 색상에서 최종 색상까지 11 개의 라인이 표시됩니다.

FF3762
FD3F58
FC474E
FA4F44
F9573A
F75F31
F66727
F46F1D
F37713
F17F09
F08800

경고

중간 색상의 정수 값을 16 진수로 다시 변환하기 전에 파생하는 간단한 선형 프로세스를 사용했지만 방법이 다를 수 있습니다. 숫자를 올림 / 내림하는 다양한 방법을 고려 하십시오 .

테스팅

이를 흥미롭게하기 위해 코드를 테스트 할 수있는 두 가지 임의의 색상을 제공하는 버튼을 포함하여 코드를 테스트 할 수있는 스 니펫을 제공했습니다. 결과를 표시하는 것은 선택 사항이지만 권장됩니다!

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) "두 가지 색"버튼을 클릭하여 테스트를위한 두 가지 임의의 색을 이용할 수 있습니다. 2) 중간 단계 수는 공백을 포함하여 PPCG 사용자 이름의 문자 수와 동일하며 "WallyWest"의 경우 9입니다 (위의 예에 따라). 3) 두 가지 색상과 숫자로 코드를 실행하고 생성 된 목록이 있으면 출력을 텍스트 영역에 붙여 넣고 생성 된 색상 그라디언트를 얻기 위해 텍스트 영역을 탭핑 할 수 있습니다.

내 예는 다음과 같습니다.

그라디언트

나는 인정해야한다, 그것은 꽤 굉장해 보인다!

참고 : 언급했듯이 스 니펫을 사용하여 출력 테스트를 표시하는 것은 선택 사항이지만 권장됩니다! :)

산출

목록 출력은 위의 예와 같이 줄 바꿈 (\ n)으로 구분 된 6 자리 16 진수의 N + 2 세트 형식이어야합니다. 출력은 별도의 라인의 형태 일 수있다, 공간 / 쉼표 목록, 가장 언어에 적합 어떤 배열이나 ... 분리 (최대 머리에 대한 감사 @nimi)를 기억하세요 당신은 당신의 코드를 테스트 계획이라면 스 니펫, 그러나 당신은 각 "색상"을 분리합니다.

규칙

이것은 코드 골프이므로 바이트 단위의 최단 솔루션이 승자가됩니다. 허점 없음 , 자연스럽게. 입력은 두 개의 문자열과 숫자를 허용해야합니다 (PPCG의 사용자 이름에있는 문자 수와 동일하므로 결과 출력은 항상 최소 3 줄입니다.



주목하고 업데이트했습니다 ... 헤드 업 주셔서 감사합니다 (+1)
WallyWest

호기심에서 Illustrator와 같은 이미지 앱은 인식 가능한 색상 공간에서 선형 그라디언트 또는 그라디언트를 사용합니까? 둘 다에 대한 유스 케이스를 볼 수 있습니다 (나중에 게임의 텍스처와 같이 지각 적으로 변환하는 중일 수 있습니다).
로버트 프레이저

답변:


1

MATL , 31 바이트

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

반올림과 함께 선형 보간을 사용합니다. 입력 형식은

9
FF3762
F08800

온라인으로 사용해보십시오!

그래픽 출력, 31 바이트

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

이것은 입력 결과입니다

5
FF3762
F08800

여기에 이미지 설명을 입력하십시오

MATL Online 에서 사용해보십시오 ! 통역사는 현재 실험 중입니다. 출력을 얻지 못하면 페이지를 새로 고치고 "실행"을 다시 누르십시오.


4

자바 스크립트 (ES6), 130 바이트

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 바이트

프롬프트에 대한 N은 다음 B 후, eginning 색을 E 웍 컬러한다. ⎕IO←0많은 시스템에서 기본값이 필요 합니다.

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

h[... h] 로 색인 (괄호의 내용 평가가 끝나면 값이 있음)

N←⎕숫자 N에 대한 프롬프트 (4)

1+N 에 1을 더하다 (5)

(... 의 결과를 나누는 데 사용하십시오 ...

  ⍞⍞ 두 개의 문자열에 대한 프롬프트 [ "7E0E7E", "FF3762"]

  (... )∘⍳¨에서 각 문자열의 문자 색인을 찾습니다 ...

   ⎕D,⎕A D igits 다음에 A lphabet

   h←h에 할당

  이제 우리는 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

  E B←지수를 EB에 할당 [[7,14,0,14,7,14], [15,15,3,7,6,2]]

  -/E 에서 B 를 빼고 묶음 [[-8, -1, -3,7,1,12]]

  지금까지의 결과는 [[-1.6, -0.2, -0.6,1.4,0.2,2.4]]입니다.

(... 곱하기에 ...

  2+N2 더하기 N (6)

   첫 번째 정수 [0,1,2,3,4,5]

 [[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∘+¨각 [[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] 에 B 를 더하고 ... ]

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

목록을 표로 만들다

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

로 우리에게 인덱스에 여기 시간 , 제공

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

이것은 같은

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

로 인쇄

FF3762
DE2864
BE1966
AE1B69
8E0C6B
7E0E7E

구배

TryAPL 온라인!


잘 했어! 전환이 좋아 보인다!
WallyWest

@WallyWest 감사합니다. 대부분의 경우와 다른 선형 전환 일 수 있습니다. 각 문자는 개별적으로 전환됩니다.
Adám

2

Pyth-35 바이트

끔찍한 골프, 그냥 포기.

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

여기에서 온라인으로 사용해보십시오 .

예:

예


11 줄의 그라디언트를 계산하지만 PPCG 이름에는 8 자만 있습니다 ... 7cb472 93fb8a 8코드를 테스트 할 때 10 줄의 출력 만 입력 하면 안됩니까?
WallyWest

@WallyWest는 OP에서 사용자 이름에 대한 부분을 완전히 놓쳤습니다. 방금 9 cuz를 사용하여 수정했습니다.
Maltysen

@WallyWest 업데이트
Maltysen

안녕하세요 @Maltysen, 그라디언트는 조금 이상해 보입니다 ... 두 개의 참조가 있습니다 93fb8a... 코드가 같은 값의 두 줄을 출력 했습니까?
WallyWest

2

PowerShell을 V2 +, 176 (159) 150 바이트

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

입력을 두 개의 문자열과 숫자로 취한 다음 시작 문자열을 두 문자마다 분할 된 문자열 배열로 변환하여에 저장합니다 $x. 그런 다음 $a시작 섹션으로 출력 ++$n하고 1(올바른 펜스 포스팅을 보장하기 위해) 에서 반복 합니다.

각 반복은 도우미 $j를 현재 수로 설정하고 (나중에 현재 목적지에있는 단계 사이에 올바른 단계 수를 확보하기 위해 사용됨) 루프 스루를 기반으로 다음 단계를 계산합니다 $x.

각 내부 루프는 단지 할당입니다. ormat 연산자를 사용하여 $x새 문자열과 같은 적절한 위치에 설정 하고 있습니다. 여기에는 두 자리 16 진수 출력을 특정하고, 상기 입력이 오른쪽의 인 연산자. PowerShell을 기본 16 진수로 진수 연산자를 가지고 이 긴 괄호 중첩 표현 가고 아직 차이를 찾을 뺀 숫자에 현재의 진수를 변환하는 연산자를 사용되도록 (동적 분할에 의해 수행, 여기에 우리가 그랬던 것처럼 , 모듈로를 사용하여 올바른 요소를 선택), 남은 단계로 나눠서"{0:x2}"-fx2-f0x$b$a$j[int] PowerShell은 기본적으로 은행가 반올림을 수행하고 현재 16 진에서 해당 단계 수를 빼서 다음 16 진이 필요한 것을 얻습니다.

이 계산 결과는 $x3 개의 16 진 요소로 다시 저장됩니다 . 파이프 라인에 사본을 작성하기 위해 parens로 캡슐화되어 -join단일 문자열로 묶입니다. 결과 문자열은 모두 파이프 라인에 남아 있으며 암시 적 출력 Write-Output은 프로그램 실행시 발생합니다.


두 가지 색상 에 대해 0ba7c56c0e50 이 주어 졌으며 TimmyD 에는 6 개의 문자가 있습니다.

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

그라디언트 예


1

파이썬 2, 189 바이트

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)

그라디언트 스크린 샷


화려한 색상 쌍, @AndrewEpstein ... 코드와 함께 좋은 일!
WallyWest

1

[Groovy] 최종 업데이트 (199 바이트)-요청에 따라

비 골프

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

골프

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

여기에서 마지막을 시도하십시오 : https://groovyconsole.appspot.com/script/5130696796405760


이전 버전 (OP에 의해 거부 됨)


그루비 (123 바이트)

골프

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

비 골프

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

입력

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

출력 예

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

결과

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

직접 해보십시오. https://groovyconsole.appspot.com/script/5184465357766656

16 진 변환 포함

내가 속이는 것 같아 ... 16 진수를 사용하는 스크립트는 다음과 같습니다.

16 진 변환이 포함 된 새 코드 :

​    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 자 :

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

000000 ~ FFFFFF 및 16 (사용자 이름 길이)에 대한 출력

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

1/16 단계의 단색 그라디언트


오류 ... 약간 유효하지 않은 원래 버전 "(0 .. (1.0 / s))"는 "(1 .. (1.0 / s))"여야합니다.
Magic Octopus Urn

1
안녕하세요 @carusocomputing ... 입력은 두 개의 16 진 문자열과 정수 여야합니다. Groovy가이 방식으로 입력을받을 수 있는지 잘 모르겠지만, 요약을 못 이해하고 있습니다 ... 업데이트 해 주시겠습니까? 챌린지 섹션에 언급 된 입력을 기반으로하는 코드?
WallyWest

{s-> s.split("(?<=\\G.{2})").collect{Integer.parseInt(it,16)}}('FFFFFF') [255,255,255] 결과 원하는 경우 변환을 사용하여 코드에 62 바이트를 추가 할 수 있습니다.
Magic Octopus Urn

1
월리, 나는 업데이트 된 버전을 추가하고 변환을 포함하여 최종 바이트 수를 199로 올렸습니다.
Magic Octopus Urn

1

R, 68 바이트

두 가지 색상을 보간하는 내장 기능이 있습니다.

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

입력:

d9e7a5
3ef951
15

출력 : 값이있는 벡터

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

R의 색상 사양에는 해시 기호가 필요합니다.

컬러 램프

함수처럼 무언가를 그려 봅시다 :

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)


좋은 대답이지만 간단한 내용은 PPCG 사용자 이름에있는만큼의 단계를 사용하여 공간을 계산하면 15가되는 단계를 사용하도록 요청합니다 FF3762 F08800 15.
WallyWest

@WallyWest 죄송합니다, 두 가지 색상을 얻고 자신의 사용자 이름 길이를 세는 부분을 놓쳤습니다. 이제 답변이 사양을 완전히 준수해야합니다!
Andreï Kostyrka

1

C, 175 (169) 168 바이트

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

언 골프 드 :

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

5 바이트를 줄인 @ h-walters에게 감사합니다!


puts구문이 다시 무엇을하는지 알려 주세요.
WallyWest

그것은 비슷 printf()하지만 서식을 지정하지 않고 주어진 문자열을 그대로 인쇄하고 개행을 추가합니다.
G. Sliepen

아, 골프를 할 방법이 없어요 ... C는 그렇게 제한적이지 않나요?
WallyWest

"그래서 골프를 치는 방법은 없습니다"... 물론입니다! 이동 puts("")루프의 첫 번째의 세 번째 부분 (에 ;되고 이후 ,전) ... 바이트 +0. 그러나 이렇게하면 두 번째 루프 후 중괄호를 제거 할 수 있습니다 ... -2 바이트. 에서 3을 제거 j<3하고 printf명령문으로 바꾸어 다른 1 바이트를 저장할 수 있습니다 (이것은 열악합니다 ... printf는 2 만 반환하지만 여전히 세 번째로 평가해야합니다).
H Walters

... 두개 이상의 바이트 (0의 결과)이 서로로부터 sscanf를 반환 값을 감산하고, 대신에 문자의 사용으로 저장 될 수 0에서 j=0. 여기에 모든 것이 준비되면 프로그램은 5 바이트 더 짧아야하며 적어도 50 % 이상이어야합니다.
H Walters

1

sh + ImageMagick, 81 바이트

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

용법:

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

(IM이 기본값으로 8bpp로 컴파일 된 경우 "깊이 8"은 필요하지 않습니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.