16 진수로 색상을 코딩하는 방법


15

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

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

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

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

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

6 각형 채색 1

또는 입력의 경우

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

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

6 각형 채색 2

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

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


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



 / \
| * |
 \ /

규칙

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

색상 및 색상 혼합물 :

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

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

조합은 다음과 같습니다.

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

구멍이있는 테스트 케이스를 추가 할 수 있습니까? 첫 번째 (추가) 같은,하지만 중간없는*
H.PWiz

입력 끝에 줄 끝이나 줄 바꿈에 공백이 추가로 유지되어야합니까?
HyperNeutrino

@ H.PWiz 그런 상황은 결코 일어나지 않을 것입니다. 걱정할 필요가 없습니다.
AdmBorkBork

@HyperNeutrino 아니오, 전적으로 귀하의 결정입니다. 입 / 출력 공백 형식은이 도전에서 흥미로운 부분이 아닙니다.
AdmBorkBork

괜찮아. 감사. 또한 빈 입력을 처리해야합니까?
HyperNeutrino

답변:


7

자바 스크립트 (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색상.


차이가있는 경우 내부 구멍을 처리 할 필요가 없습니다.
AdmBorkBork

2
@AdmBorkBork 아니요, 방금 과시했습니다.

"Colourise!" -철자가 틀렸어.
OldBunny2800

3
@ OldBunny2800 내 언어로 철자가 정확합니다 ...
Neil

2
@ OldBunny2800 American은 존재하는 유일한 철자 세트가 아닙니다. 예를 들어 영국 (영어 영어의 상위 집합), 호주 (어떤 이유로 뉴질랜드를 포함해야 함) 및 캐나다 (미국 대부분의 북쪽에 위치)가 있습니다.
wizzwizz4

4

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]}> / \\
| * |
 \\ /`)))


3

파이썬 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-abs(i)입니다 2-(i&1)이러한 맥락에서, 336 바이트.
Mr. Xcoder

@ Mr.Xcoder Cool 감사합니다!
HyperNeutrino

나는 (1 바이트 절약) 또는 실제 문자 ( 3 바이트 절약 ) 일 \033수 있다고 생각 합니다. \33\x1b
Jonathan Frech

1
@ OldBunny2800 길이가 같다고 생각합니다. 2 =와 a ;를 2 ,와 a로 바꿉니다 =.
wizzwizz4

2

파이썬 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

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


1

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()가시성을 위해 스 니펫에 승수 및 추가 명령이 추가되었습니다.

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


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


https://i.stack.imgur.com/Pp3J0.png 필요한 출력을 충족한다고 생각하지 않습니다 . 슬래시와 백 슬래시는 경계가 아닌 육각형 색상의 추가 조합으로 간주됩니다.
패트릭 로버츠

@PatrickRoberts Hmm, 글꼴 너비가 일치하지 않는 것으로 보입니다 (컴퓨터의 위치가 정확합니다). 오늘 나중에 이것에 대해 살펴 보겠습니다.
darrylyeo

아, 나는 올바른 플랫폼이 있다는 것을 몰랐다. 스크린 샷으로 답변을 업데이트하면 투표를 되돌립니다. 답변은 적어도 하나의 구현에서만 작동해야하며, 크로스 플랫폼 일 필요는 없습니다.
패트릭 로버츠

1

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의 5x3 상자 (MATLAB 색상 표현에서 255)를 중심으로 씁니다 *. 박스는 각 라인을 따라 mod-3 인덱스에 해당하는 컬러로 기록되며, 짝수 라인은 컬러 인덱스가 오프셋만큼 이동합니다.

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

컬러 매트릭스 예

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

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

샘플 출력

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