Cách mã màu trong hex


15

Các hình lục giác , hoặc nghiêng của mặt phẳng, có ba màu - có nghĩa là chỉ sử dụng ba màu, như Đỏ, Xanh lam và Xanh lục, mọi hình lục giác đều có thể được tô màu mà không có bất kỳ hai hình lục giác nào có chung đường viền chia sẻ một màu. Một ví dụ một phần cho thấy một mô hình như vậy.

Đưa ra một lát hình lục giác một phần trong ASCII (thông qua STDIN, đọc từ tệp, v.v.), thay đổi màu của các ký tự (thông qua mã ANSI, thao tác hình ảnh, v.v.) để phù hợp với màu này. Vòng xoắn là giữa các hình lục giác ( *bên dưới) là ba màu và các đường giữa cần phải là sự pha trộn của hai *màu lục giác tương ứng của chúng. Nếu dòng nằm ở viền bên ngoài, nó phải khớp với tương ứng *.

Ví dụ, cho lát gạch lục giác một phần của

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

giả sử chúng ta quyết định tô màu cho hình lục giác trên cùng bên trái *thành màu Đỏ và hai hàng xóm của nó là Màu xanh lam và Màu xanh lá cây (đi theo chiều kim đồng hồ). Sau đó, |dòng cần phải là Magenta và /dòng cần phải có màu Vàng. Nếu chúng ta tiếp tục tô màu, cuối cùng chúng ta sẽ kết thúc với một cái gì đó như thế này (mở rộng cho rõ ràng):

Tô màu lục giác 1

Hoặc, cho một đầu vào của

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

bạn có thể tô màu nó như vậy (phóng to cho rõ ràng):

Tô màu lục giác 2

Một vài trường hợp thử nghiệm bổ sung (mã của bạn sẽ có thể xử lý những trường hợp này):

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


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



 / \
| * |
 \ /

Quy tắc

  • Đầu vào được đảm bảo có ít nhất một hình lục giác và không có đầu vào nào có "lỗ".
  • Bạn không cần bắt đầu tô màu bằng Đỏ, miễn là bạn duy trì quy tắc ba màu.
  • Nếu ốp lát một phần có thể có hai màu, bạn có thể làm như vậy mà không bị phạt (chẳng hạn như trong ví dụ thứ hai) - bạn không nhất thiết phải ngoại suy ốp lát một phần thành ốp lát hoàn chỉnh.
  • Các tâm hình lục giác *phải được tô màu Đỏ, Xanh lam hoặc Xanh lục, trong khi các đường giữa phải là Cyan, Vàng hoặc Đỏ tươi. Ví dụ: không có Magenta *và Red |hoặc \hoặc /phải ở viền ngoài của bản vẽ. Xem màu sắc , bên dưới.
  • Nếu bảng điều khiển của bạn không có các màu chính xác này, vui lòng sử dụng xấp xỉ gần nhất và chỉ định trong câu trả lời của bạn về việc sử dụng xấp xỉ nào.
  • Khoảng trắng hàng đầu hoặc dấu, bao gồm cả dòng mới, được chấp nhận miễn là các ký tự xếp hàng.
  • Ốp lát một phần có thể được nhập bằng đệm không gian để tạo thành hình chữ nhật, nếu điều đó giúp mã của bạn dễ dàng hơn.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Đầu ra có thể vào bàn điều khiển, được lưu dưới dạng hình ảnh, v.v.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Màu sắc và hỗn hợp màu:

Ba màu cơ bản khả dụng là (với mã màu ở định dạng thập phân RGB):

  • Màu đỏ (255,0,0)
  • màu xanh lá (0,255,0)
  • Màu xanh da trời (0,0,255)

Các kết hợp là:

  • Màu đỏ và màu xanh lá cây kết hợp để tạo thành màu vàng (255,255,0)
  • Màu xanh và màu xanh lá cây kết hợp để tạo ra Cyan (0,255,255)
  • Màu đỏ và màu xanh kết hợp để tạo thành màu đỏ tươi (255,0,255)

Bạn có thể thêm một trường hợp thử nghiệm với một lỗ xin vui lòng? Giống như cái đầu tiên (bổ sung), nhưng không có phần giữa*
H.PWiz

Nếu khoảng trắng thêm được đưa ra ở cuối dòng hoặc dòng mới ở cuối đầu vào, chúng có phải được bảo tồn không?
HyperNeutrino

@ H.PWiz Một tình huống như vậy sẽ không bao giờ phát sinh. Không cần phải lo lắng về nó.
admBorkBork

@HyperNeutrino Không, đó hoàn toàn là quyết định của bạn. Định dạng khoảng trắng đầu vào / đầu ra không phải là phần thú vị của thử thách này.
admBorkBork

Được chứ. Cảm ơn. Ngoài ra, chúng ta sẽ bao giờ phải xử lý đầu vào trống?
HyperNeutrino

Câu trả lời:


7

JavaScript (ES6), 219 203 201 byte

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>

Giải thích: Mỗi ký tự được bọc trong một fontthẻ để đặt màu của nó, được tính bằng cách kiểm tra từng ô vuông, cộng với các ô vuông hai bên trái và phải, cộng với bốn ô vuông một đường chéo, cho *s và nếu vậy kết hợp các màu của tất cả *Tìm thấy. Các *màu được chọn đơn giản bằng cách lấy modulo 3 tọa độ ngang của chúng và dịch chuyển bitmask một cách thích hợp. Chỉnh sửa: Saved 2 byte bằng cách chuyển từ #RRGGBBđến #RGBmàu sắc.


Bạn không cần phải xử lý các lỗ bên trong, nếu điều đó tạo ra sự khác biệt.
admBorkBork

2
@AdmBorkBork Không, tôi chỉ thể hiện.
Neil

"Màu sắc!" - Bạn đánh vần sai.
OldBunny2800

3
@ OldBunny2800 Nó được viết đúng chính tả trong ngôn ngữ của tôi ...
Neil

2
@ OldBunny2800 American không phải là bộ chính tả duy nhất tồn tại. Ví dụ như tiếng Anh (tiếng Anh là tiếng Anh), tiếng Úc (vì một số lý do bao gồm New Zealand - có lẽ nên được gọi là Australasian) và Canada (nơi nằm ở phía bắc của phần lớn Hoa Kỳ).
wizzwizz4

4

JavaScript (ES6), 210 byte (sử dụng HTML + CSS)

Tương tự như cách tiếp cận canvas của tôi ; định vị tất cả các *s trong chuỗi đầu vào và ghi các hình lục giác vào trang dưới dạng các <pre>phần tử được định vị tuyệt đối . Vì mix-blend-modeđược đặt thành lighten, việc thêm màu được thực hiện tự động khi các ký tự trùng nhau.

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

Python 2 , 279 byte

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

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

Chơi golf và sửa lỗi nhờ người dùng202729!
-27 byte nhờ ông Xcoder
-24 byte nhờ Jonathan Frech



Cũng 2-abs(i)2-(i&1)trong bối cảnh này, 336 byte.
Ông Xcoder

@ Mr.Xcoder Tuyệt, cảm ơn!
HyperNeutrino

Tôi nghĩ \033có thể \33(lưu một byte) hoặc \x1bký tự thực tế ( lưu ba byte ).
Jonathan Frech

1
@ OldBunny2800 Tôi nghĩ đó là cùng một chiều dài. Bạn trao đổi hai =và một ;cho hai ,và a =.
wizzwizz4

2

Python 2 , 346 331 byte

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

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


1

HTML (Canvas) + JavaScript (ES6), 13 + 251 = 264 byte

Định vị tất cả các *s trong chuỗi đầu vào và vẽ một hình lục giác ASCII trên khung vẽ ở các vị trí tương ứng. Bởi vìglobalCompositeOperation='lighter' , bổ sung màu được thực hiện tự động khi các ký tự chồng lên nhau.

HTML

<canvas id=c>

JavaScript

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

Một số nhân và scale()lệnh bổ sung đã được thêm vào đoạn mã để hiển thị.

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


Cũng xem cách tiếp cận dựa trên CSS của tôi .


Tôi không tin rằng điều này đáp ứng đầu ra cần thiết: https://i.stack.imgur.com/Pp3J0.png . Dấu gạch chéo phía trước và dấu gạch chéo ngược được cho là sự kết hợp phụ gia của màu sắc của các hình lục giác mà chúng viền, không tách rời.
Patrick Roberts

@PatrickRoberts Hmm, có vẻ là một vấn đề với độ rộng phông chữ không nhất quán (các vị trí là chính xác trên máy tính của tôi). Tôi sẽ xem xét điều này sau ngày hôm nay.
darrylyeo

Ồ, tôi đã không nhận ra có một nền tảng chính xác. Nếu bạn cập nhật câu trả lời của mình bằng ảnh chụp màn hình, tôi sẽ hoàn nguyên phiếu bầu của mình. Câu trả lời chỉ cần hoạt động trên ít nhất một triển khai, chúng không cần phải đa nền tảng.
Patrick Roberts

1

MATLAB / Octave , 223 byte

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

Trong định dạng mã gọn hơn một chút:

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

Đầu vào được lấy dưới dạng mảng 2D, chẳng hạn như nhập thông tin sau khi được nhắc nhập:

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

MATLAB cho đến nay tôi biết không có khả năng xuất màu ra bảng điều khiển (ngoại trừ các bản hack Java bẩn mà tôi đang giảm giá). Vì vậy, đầu ra thay vào đó được in ra một hình.

Việc tô màu đạt được bằng cách tìm vị trí của tất cả *các đầu vào, và sau đó trong mảng màu RGB ( p), một hộp 5x3 của 1 (đại diện màu MATLAB 255) được viết tập trung vào *. Hộp được ghi theo màu tương ứng với chỉ số mod-3 dọc theo mỗi dòng, với các dòng chẵn có chỉ số màu được dịch chuyển bởi một offset.

Điều này tạo ra một ma trận màu trong đó bất kỳ hộp nào trùng nhau sẽ dẫn đến màu hỗn hợp cần thiết. Ví dụ trên tạo ra ma trận màu sau.

Ví dụ ma trận màu

Các vùng trắng và đen không liên quan vì tại các vị trí đó, một khoảng trắng được in có nghĩa là chúng ta không thực sự nhìn thấy màu không chính xác.

Khi ma trận màu được tạo, chúng tôi hiển thị từng ký tự trên một hình bằng cách sử dụng textlệnh, đặt màu của văn bản thành mục tương ứng trong ma trận màu. Ví dụ trên sẽ hiển thị:

Đầu ra mẫu

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.