วิธีการรหัสสีในฐานสิบหก


15

Tessellations หกเหลี่ยมหรือ tilings ของเครื่องบินมีสามสี - หมายถึงการใช้เพียงสามสีเช่นสีแดงสีน้ำเงินและสีเขียวหกเหลี่ยมทุกคนสามารถสีโดยไม่มีรูปหกเหลี่ยมสองที่แบ่งปันเส้นขอบสีใด ๆ ตัวอย่างบางส่วนแสดงรูปแบบดังกล่าว

ให้เรียงตัวหกเหลี่ยมบางส่วนใน ASCII (ผ่าน STDIN, อ่านจากไฟล์, ฯลฯ ) เปลี่ยนสีของตัวละคร (ผ่านรหัส ANSI, การปรับภาพ ฯลฯ ) เพื่อให้เข้ากับสีนี้ การบิดคือจุดกึ่งกลางของรูปหกเหลี่ยม ( *ด้านล่าง) คือสามสีและเส้นแบ่งระหว่างความต้องการในการผสมของ*สีฐานสิบหกที่สอดคล้องกัน *ถ้าบรรทัดที่อยู่บนเส้นขอบนอกก็ควรตรงตาม

ตัวอย่างเช่นกำหนดหกเหลี่ยมกระเบื้องบางส่วนของ

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

สมมติว่าเราตัดสินใจให้สีฐานสิบหกบนซ้าย*เป็นสีแดงและเพื่อนบ้านทั้งสองของมันคือสีน้ำเงินและเขียว (หมุนตามเข็มนาฬิกา) จากนั้น|เส้นจะต้องเป็นสีม่วงแดงและ/เส้นจะต้องเป็นสีเหลือง หากเรายังคงระบายสีในที่สุดเราก็จะจบลงด้วยสิ่งนี้ (ขยายเพื่อความชัดเจน):

สีหกเหลี่ยม 1

หรือสำหรับอินพุตของ

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

คุณอาจสีมันเช่นนั้น (ขยายเพื่อความชัดเจน):

สีหกเหลี่ยม 2

กรณีทดสอบเพิ่มเติมอีกสองสามข้อ (รหัสของคุณควรจะสามารถจัดการกับสิ่งเหล่านี้ได้):

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


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



 / \
| * |
 \ /

กฎระเบียบ

  • ข้อมูลเข้ารับประกันว่าจะมีรูปหกเหลี่ยมอย่างน้อยหนึ่งรูปและจะไม่มีรูป "ช่อง"
  • คุณไม่จำเป็นต้องเริ่มการระบายสีด้วยสีแดงตราบใดที่คุณยังคงกฎสามสี
  • หากการเรียงสีบางส่วนสามารถเป็นสองสีคุณสามารถทำได้โดยไม่มีการลงโทษ (เช่นในตัวอย่างที่สอง) - คุณไม่จำเป็นต้องประเมินการเรียงต่อกันบางส่วนในการเรียงแบบเต็ม
  • จุดศูนย์กลางหกเหลี่ยม*จะต้องเป็นสีแดงน้ำเงินหรือเขียวในขณะที่เส้นแบ่งระหว่างต้องเป็นสีฟ้าสีเหลืองหรือสีม่วงแดง ตัวอย่างเช่นมีสีม่วงแดง*ไม่ได้รับอนุญาตและสีแดง|หรือ\หรือ/จะต้องอยู่ในชายแดนด้านนอกของการวาดภาพ ดูสีด้านล่าง
  • หากคอนโซลของคุณไม่มีสีที่แน่นอนเหล่านี้โปรดใช้การประมาณที่ใกล้เคียงที่สุดและระบุคำตอบของคุณว่าคุณกำลังใช้การประมาณแบบใด
  • ช่องว่างนำหน้าหรือต่อท้ายรวมถึงบรรทัดใหม่ต่อท้ายเป็นที่ยอมรับตราบใดที่อักขระเรียงขึ้น
  • การปูกระเบื้องบางส่วนสามารถป้อนด้วยการเว้นวรรคเพื่อสร้างรูปสี่เหลี่ยมผืนผ้าถ้ามันทำให้รหัสของคุณง่ายขึ้น
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • เอาต์พุตสามารถไปที่คอนโซลบันทึกเป็นรูปภาพและอื่น ๆ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการตีกอล์ฟตามปกติและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

สีและสีผสม:

สีพื้นฐานที่มีอยู่สามสีคือ (พร้อมรหัสสีในรูปแบบทศนิยม RGB):

  • สีแดง (255,0,0)
  • สีเขียว (0,255,0)
  • สีน้ำเงิน (0,0,255)

การรวมกันคือ:

  • สีแดงและสีเขียวรวมกันเพื่อทำให้สีเหลือง (255,255,0)
  • สีน้ำเงินและสีเขียวรวมกันเพื่อทำให้สีฟ้า (0,255,255)
  • สีแดงและสีน้ำเงินรวมกันเพื่อทำให้ Magenta (255,0,255)

คุณสามารถเพิ่มกรณีทดสอบที่มีรูได้ไหม? เหมือนคนแรก (เพิ่มเติม) แต่ไม่มีคนอยู่ตรงกลาง*
H.PWiz

หากมีการเพิ่มช่องว่างพิเศษที่ส่วนท้ายของบรรทัดหรือบรรทัดใหม่ที่ส่วนท้ายของอินพุตพวกเขาจะต้องได้รับการเก็บรักษาไว้หรือไม่?
HyperNeutrino

@ H.PWiz สถานการณ์ดังกล่าวจะไม่เกิดขึ้น ไม่จำเป็นต้องกังวลเกี่ยวกับมัน
AdmBorkBork

@HyperNeutrino ไม่นั่นเป็นการตัดสินใจของคุณอย่างแท้จริง การจัดรูปแบบช่องว่างของอินพุต / เอาต์พุตไม่ใช่ส่วนที่น่าสนใจของความท้าทายนี้
AdmBorkBork

ตกลง. ขอบคุณ นอกจากนี้เราจะต้องจัดการกับอินพุตว่างหรือไม่
HyperNeutrino

คำตอบ:


7

JavaScript (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แท็กเพื่อกำหนดสีของมันซึ่งคำนวณโดยการตรวจสอบแต่ละสแควร์บวกสแควร์สสองจากด้านซ้ายและขวารวมทั้งสี่สแควร์สหนึ่งห่างตามแนวทแยงมุมสำหรับ*s และถ้ารวมสีของทั้งหมด*พบ การ*เลือกสีทำได้ง่าย ๆ โดยการปรับโมดูโลพิกัด 3 ตามแนวนอน แก้ไข: บันทึก 2 ไบต์โดยเปลี่ยนจาก#RRGGBBเป็น#RGBสี


คุณไม่จำเป็นต้องจัดการกับรูในถ้ามันสร้างความแตกต่าง
AdmBorkBork

2
@AdmBorkBork ไม่ฉันเพิ่งแสดงออกมา
Neil

"Colourise!" - คุณสะกดผิด
OldBunny2800

3
@ OldBunny2800 มันสะกดอย่างถูกต้องในภาษาของฉัน ...
Neil

2
@ OldBunny2800 American ไม่ใช่ชุดการสะกดคำเท่านั้นที่มีอยู่ มีภาษาอังกฤษ (ภาษาอังกฤษแบบซูเปอร์เซ็ตภาษาอังกฤษ), ออสเตรเลีย (ซึ่งด้วยเหตุผลบางอย่างรวมถึงนิวซีแลนด์ - บางทีมันควรจะเรียกว่าออสตราเลเซียน) และแคนาดา (ซึ่งอยู่ทางตอนเหนือของประเทศสหรัฐอเมริกา
wizzwizz4

4

JavaScript (ES6), 210 ไบต์ (โดยใช้ HTML + CSS)

คล้ายกับฉันวิธีผ้าใบ ; หาตำแหน่งทั้งหมด*ในสตริงอินพุตและเขียนรูปหกเหลี่ยมไปยังหน้าในรูปแบบของ<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

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

ลองออนไลน์!

Golfed และคงที่ต้องขอบคุณ user202729!
-27 ไบต์ขอบคุณ Mr. Xcoder
-24 ไบต์ขอบคุณ Jonathan Frech


337 ไบต์
Mr. Xcoder

ยัง2-abs(i)อยู่2-(i&1)ในบริบทนี้ 336 ไบต์
Mr. Xcoder

@ Mr.Xcoder Cool ขอบคุณ!
HyperNeutrino

ฉันคิดว่า\033สามารถ\33(บันทึกหนึ่งไบต์) หรือ\x1bอักขระจริง( บันทึกสามไบต์ )
Jonathan Frech

1
@ OldBunny2800 ฉันคิดว่านั่นคือความยาวเท่ากัน คุณสลับสอง=และ;สองและ, =
wizzwizz4

2

Python 2 , 346 331 ไบต์

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 (Canvas) + JavaScript (ES6), 13 + 251 = 264 ไบต์

หาตำแหน่งทั้งหมด*ในสตริงอินพุตและวาดรูปหกเหลี่ยม ASCII บนผืนผ้าใบที่ตำแหน่งที่สอดคล้องกัน เนื่องจากการglobalCompositeOperation='lighter'เติมสีจะดำเนินการโดยอัตโนมัติเมื่ออักขระทับซ้อนกัน

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

scale()คำสั่งตัวคูณและคำสั่งเพิ่มเติมถูกเพิ่มเข้าไปในตัวอย่างเพื่อให้สามารถมองเห็นได้

ป้อนคำอธิบายรูปภาพที่นี่


ดูวิธีใช้ CSSของฉันด้วย


ผมไม่เชื่อว่านี้เป็นไปตามการส่งออกที่ต้องการ: https://i.stack.imgur.com/Pp3J0.png ไปข้างหน้าและแบ็กสแลชควรจะเป็นการรวมกันเพิ่มเติมของสีของรูปหกเหลี่ยมที่ชายแดนไม่แยกกัน
Patrick Roberts

@PatrickRoberts อืมดูเหมือนว่าจะมีปัญหากับความกว้างของตัวอักษรที่ไม่สอดคล้องกัน (ตำแหน่งที่ถูกต้องในคอมพิวเตอร์ของฉัน) ฉันจะตรวจสอบเรื่องนี้ในวันนี้
darrylyeo

โอ้ฉันไม่ได้ตระหนักว่ามีแพลตฟอร์มที่ถูกต้อง หากคุณอัปเดตคำตอบของคุณด้วยภาพหน้าจอฉันจะคืนคะแนนของฉัน รู้รอบจำเป็นต้องทำงานอย่างน้อยหนึ่งการติดตั้ง แต่ไม่จำเป็นต้องข้ามแพลตฟอร์ม
Patrick Roberts

1

MATLAB / Octave , 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

ในรูปแบบรหัส neater เล็กน้อย:

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

อินพุตถูกนำมาเป็นอาร์เรย์ 2 มิติเช่นการป้อนข้อมูลต่อไปนี้เมื่อได้รับพร้อมต์สำหรับอินพุต:

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

MATLAB เท่าที่ฉันทราบไม่มีความสามารถในการแสดงสีไปยังคอนโซล (ยกเว้นแฮ็ก Java ที่สกปรกซึ่งฉันลดราคา) ดังนั้นเอาต์พุตดังกล่าวจะถูกพิมพ์ไปยังรูปภาพแทน

การระบายสีทำได้โดยการค้นหาตำแหน่งของทุกคน*ในอินพุตและจากนั้นในอาร์เรย์สี RGB (p ) กล่อง 5x3 ของ 1 (255 ในการแทนสี MATLAB) จะถูกเขียนเป็นศูนย์กลางเกี่ยวกับ*จะเขียนเกี่ยวกับการเป็นศูนย์กลาง กล่องถูกเขียนลงในสีที่สอดคล้องกับดัชนี mod-3 ตามแต่ละบรรทัดโดยที่เส้นคู่ที่มีดัชนีสีจะถูกเลื่อนโดยออฟเซ็ต

สิ่งนี้จะสร้างเมทริกซ์สีโดยที่กล่องใด ๆ ที่ทับซ้อนกันจะส่งผลให้เกิดสีผสมที่ต้องการ ตัวอย่างข้างต้นสร้างเมทริกซ์สีต่อไปนี้

ตัวอย่างเมทริกซ์สี

พื้นที่สีขาวและสีดำนั้นไม่เกี่ยวข้องเนื่องจากพื้นที่เหล่านั้นมีการพิมพ์พื้นที่ซึ่งหมายความว่าเราไม่เห็นสีที่ไม่ถูกต้อง

เมื่อสร้างเมทริกซ์สีแล้วเราจะแสดงอักขระแต่ละตัวในรูปโดยใช้textคำสั่งตั้งค่าสีของข้อความเป็นรายการที่เกี่ยวข้องในเมทริกซ์สี ตัวอย่างด้านบนจะแสดง:

ตัวอย่างผลลัพธ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.