16 진수로 색상을 코딩하는 방법 코드, 이미지 조작

육각형 테셀레이션 또는 평면의 타일링은 3 가지 색상을 사용할 수 있습니다. 즉, 빨강, 파랑 및 녹색과 같은 3 가지 색상 만 사용하면 색상을 공유하는 테두리를 공유하는 두 개의 육각형없이 모든 육각형에 색상을 지정할 수 있습니다. 그러한 패턴을 보여주는 부분적인 예 .

ASCII에서 STDIN을 통한 부분 육각형 타일링 (STDIN, 파일 읽기 등)을 고려할 때이 색상에 맞게 문자 색상 (ANSI 코드, 이미지 조작 등)을 변경하십시오. 트위스트는 육각형의 중간 ( *아래)이 세 가지 색상이며 그 사이의 선은 두 개의 해당 16 진수 *색상 의 혼합이어야합니다 . 줄이 바깥 쪽 테두리에 있으면 해당 줄과 일치해야합니다 *.

예를 들어, 부분 육각형 타일링의 경우

 / \ / \ / \ / \
| * | * | * | * |
 \ / \ / \ / \ /
  | * | * | * |
   \ / \ / \ /

왼쪽 상단의 16 진수 *를 빨간색으로, 두 개의 이웃은 파란색과 녹색 (시계 방향으로) 으로 색상을 결정한다고 가정 합니다. 그런 다음 |선은 자홍색이고 /선은 노란색이어야합니다. 채색을 계속하면 결국 다음과 같이 끝납니다 (명확성을 위해 확대됨).

6 각형 채색 1

또는 입력의 경우

     / \
    | * |
   / \ /
  | * |
 / \ /
| * |
 \ /

다음과 같이 색칠 할 수 있습니다 (명확성을 위해 확대됨).

몇 가지 추가 테스트 사례 (코드에서이를 처리 할 수 ​​있어야 함) :

 / \ / \
| * | * |
 \ / \ /
  | * |
 / \ / \
| * | * |
 \ / \ /


 / \
| * |
 \ / \
  | * |
 / \ /
| * |
 \ /



 / \
| * |
 \ /

규칙

  • 입력은 최소한 하나의 육각형을 갖도록 보장되며 입력에는 “구멍”이 없습니다.
  • 3 색 규칙을 유지하는 한 빨간색으로 채색을 시작할 필요는 없습니다.
  • 부분 타일링이 두 가지 색상 일 수있는 경우 페널티없이 (두 번째 예에서와 같이) 할 수 있습니다. 부분 타일링을 전체 타일링으로 외삽 할 필요는 없습니다.
  • 육각형 중심 *은 빨강, 파랑 또는 녹색으로 색칠해야하며 그 사이의 선은 시안, 노랑 또는 마젠타 여야합니다. 예를 들어, 마젠타는 한 *허용하고, 레드되지 |\또는 /도면의 외부 경계에 있어야합니다. 아래의 색상을 참조하십시오 .
  • 본체의 색상이 정확하지 않은 경우 가장 가까운 근사값을 사용하고 사용중인 근사값을 답변에 지정하십시오.
  • 줄 바꿈 문자를 포함하여 선행 또는 후행 공백은 문자가 정렬되는 한 허용됩니다.
  • 부분 타일링은 공간 패딩과 함께 입력되어 사각형을 형성 할 수 있습니다.
  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 이미지 등으로 저장하여 콘솔에 출력 할 수 있습니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

색상 및 색상 혼합물 :

사용 가능한 3 가지 기본 색상은 다음과 같습니다 (RGB 10 진수 형식의 색상 코드 사용).

  • 빨간 (255,0,0)
  • 초록 (0,255,0)
  • 푸른 (0,0,255)

조합은 다음과 같습니다.

  • 빨강과 녹색은 노란색을 만들기 위해 결합 (255,255,0)
  • 청록색을 만들기 위해 파란색과 녹색을 결합 (0,255,255)
  • 마젠타를 만들기 위해 빨간색과 파란색이 결합되었습니다. (255,0,255)


답변

자바 스크립트 (ES6) 219 203 201 바이트

f=
s=>s.split`
`.map((b,i,a)=>b.replace(/./g,(c,j)=>`<font color=#${g=(x,y)=>((a[x+i]||``)[b=y+j]==`*`&&15<<b%3*4)|(y<0?8<<9:g(x,y-2)),(g(0,2)|g(-1,1)|g(1,1)).toString(16).slice(1)}>${c}</font>`)).join`
`
<input type=button value="Colourise!" onclick=i.innerHTML=f(i.textContent)>
<pre id=i contenteditable> / \ / \
| * | * |
 \ / \ / \
  | * | * |
 / \ / \ / \
| * |   | * |
 \ / \ / \ / \
  | * | * | * |
 / \ / \ / \ /
| * | * |
 \ / \ /</pre>

설명 : 각 문자는 font태그를 감싸서 색상을 설정합니다. 색상은 각 사각형과 왼쪽과 오른쪽의 사각형 2, 대각선의 4 개의 사각형 *과 s의 경우 모든 색상을 결합하여 계산됩니다 *찾았습니다. *색상은 단순히 수평 모듈 3 좌표 복용하고 적절하게 비트 마스크를 이동하여 선택된다. 편집 : 저장된 2에서 전환하여 바이트 #RRGGBB#RGB색상.


답변

JavaScript (ES6), 210 바이트 (HTML + CSS 사용)

캔버스 접근 방식과 비슷합니다 . *입력 문자열에서 모든 s를 찾고 절대 위치 <pre>요소 의 형태로 페이지에 육각형을 씁니다 . 왜냐하면 mix-blend-mode로 설정된 lighten캐릭터가 겹치는 경우에는, 색상 또한 자동으로 수행된다.

s=>s.split`
`.map((r,y)=>[...r].map((c,x)=>c=='*'&&document.write(`<pre style=position:fixed;mix-blend-mode:lighten;line-height:1;left:${x}ch;top:${y}em;color:${['red','lime','blue'][x%3]}> / \\
| * |
 \\ /`)))
f=

s=>s.split`
`.map((r,y)=>[...r].map((c,x)=>c=='*'&&document.write(`<pre style=position:fixed;mix-blend-mode:lighten;line-height:1;left:${x}ch;top:${y}em;color:${['red','lime','blue'][x%3]}> / \\
| * |
 \\ /`)))

f(` / \\ / \\ / \\ / \\
| * | * | * | * |
 \\ / \\ / \\ / \\ /
  | * | * | * |
   \\ / \\ / \\ /`)

답변

파이썬 2 , 279 바이트

e=enumerate
x=input()
c=[[i,j]for i,t in e(x)for j,_ in e(t)if"*"==x[i][j]]
C=[[j%3*([i,j]in c)for j,_ in e(o)]for i,o in e(x)]
for J,K in c:
	for i in-1,0,1:q=2-(i&1);_=C[i+J];_[K+q]=_[K-q]=_[K-q]|C[J][K]
for i,o in e(x):print"".join("[%dm"%(30+C[i][j])+x[i][j]for j,_ in e(o))

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

user202729 덕분에 골프와 고정!
Xcoder 덕분에 -27 바이트,
Jonathan Frech 덕분에 -24 바이트


답변

파이썬 2 , 346331 바이트

e=enumerate
C='0132645'
def f(s):
 c={(i,j):[1+(i/2%2+j/4)%3*2]for i,l in e(s)for j,x in e(l)if'*'==x}
 for i,l in e(s):
  r=''
  for j,x in e(l):a=c.get((i,j),c.get((i-(x<'|'),j+[-1,1][x>'/']+(x>'z')),[]))+c.get((i+(x<'|'),j+[1,-1][x>'/']-(x>'z')),[])if' '<x else[0];r+='\033[3'+C[[sum(a)/len(a),6][set(a)=={5,1}]]+'m'+x
  print r

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


답변

HTML (캔버스) + JavaScript (ES6), 13 + 251 = 264 바이트

*입력 문자열에서 모든 s를 찾고 해당 위치에서 캔버스에 ASCII 육각형을 그립니다. 이므로 globalCompositeOperation='lighter'문자가 겹치면 색상 추가가 자동으로 수행됩니다.

HTML

<canvas id=c>

자바 스크립트

s=>{c.width=c.height=s.length
with(c.getContext`2d`)font='1px monospace',globalCompositeOperation='lighter',s.split`
`.map((r,y)=>[...r].map((c,x)=>c=='*'&&[` / \\`,`| * |`,` \\ /`].map((t,i)=>fillText(t,x,y+i),fillStyle=['red','lime','blue'][x%3])))}

scale()가시성을 위해 스 니펫에 승수 및 추가 명령이 추가되었습니다.

// Unscaled
/*
f=
s=>{c.width=c.height=s.length
with(c.getContext`2d`)font='1px monospace',globalCompositeOperation='lighter',s.split`
`.map((r,y)=>[...r].map((c,x)=>c=='*'&&[` / \\`,`| * |`,` \\ /`].map((t,i)=>fillText(t,x,y+i),fillStyle=['red','lime','blue'][x%3])))}
*/


// Scaled
let scaleFactor = 40

f=
s=>{c.width=c.height=s.length*scaleFactor
with(c.getContext`2d`)scale(scaleFactor,scaleFactor),font='1px monospace',globalCompositeOperation='lighter',s.split`
`.map((r,y)=>[...r].map((c,x)=>c=='*'&&[` / \\`,`| * |`,` \\ /`].map((t,i)=>fillText(t,x,y+i),fillStyle=['red','lime','blue'][x%3])))}


// Test
f(` / \\ / \\ / \\ / \\
| * | * | * | * |
 \\ / \\ / \\ / \\ /
  | * | * | * |
   \\ / \\ / \\ /`)
<canvas id=c>


또한 CSS 기반 접근 방식을 참조하십시오 .


답변

MATLAB / 옥타브 , 223 바이트

a=input('')';s=size(a);p=zeros([s 3]);[i,j]=ind2sub(s,find(a=='*'));
for f=1:nnz(i)
p((-2:2)+i(f),(-1:1)+j(f),mod(f+~mod(j(f)/2,2),3)+1)=1;end
for f=1:nnz(a)
[i,j]=ind2sub(s,f);text(i/s(1),1-j/s(2),a(i,j),'Co',p(i,j,:));end

약간 더 깔끔한 코드 형식으로 :

a=input('')';                  %Grab input as 2D array
s=size(a);                     %Get input size
p=zeros([s 3]);                %Make empty colour matrix of matching size with RGB
[i,j]=ind2sub(s,find(a=='*')); %Find all *'s
for f=1:nnz(i)                 %For each *
    %Fill a 5x3 box centred at the * on the colour channel for this box
    %Overlapping regions between boxes will result in the correct mix.
    p((-2:2)+i(f),(-1:1)+j(f),mod(f+~mod(j(f)/2,2),3)+1)=1;
end
%Display as text on a figure
for f=1:nnz(a)
    [i,j]=ind2sub(s,f);
    text(i/s(1),1-j/s(2),a(i,j),'Co',p(i,j,:))
end

입력 프롬프트가 표시되면 다음을 입력하는 것과 같이 입력이 2D 배열로 사용됩니다.

[' / \ / \ / \ / \ ';'| * | * | * | * |';' \ / \ / \ / \ / ';'  | * | * | * |  ';'   \ / \ / \ /   ']

내가 아는 한 MATLAB은 콘솔에 색상을 출력하는 기능이 없습니다 (내가 할인하는 더러운 Java 해킹 제외). 따라서 출력은 대신 그림으로 인쇄됩니다.

*입력에서 모든의 위치를 ​​찾아서 색을 입힌 다음 RGB 색상 배열 ( p)에서 1의 5×3 상자 (MATLAB 색상 표현에서 255)를 중심으로 씁니다 *. 박스는 각 라인을 따라 mod-3 인덱스에 해당하는 컬러로 기록되며, 짝수 라인은 컬러 인덱스가 오프셋만큼 이동합니다.

이렇게하면 겹치는 상자가 필요한 혼합 색상이되는 색상 매트릭스가 생성됩니다. 위의 예제는 다음과 같은 컬러 매트릭스를 생성합니다.

흰색과 검은 색 영역은 해당 위치에 공간이 인쇄되어 실제로 잘못된 색상이 표시되지 않기 때문에 관련이 없습니다.

색상 매트릭스가 생성되면 text명령을 사용하여 그림에 각 문자를 표시 하고 텍스트 색상을 색상 매트릭스의 해당 항목으로 설정합니다. 위의 예는 다음과 같이 표시됩니다.