Cara kode warna dalam hex

15

Tessellations heksagonal , atau miring pesawat, adalah tiga-warna - yang berarti bahwa hanya menggunakan tiga warna, seperti Merah, Biru, dan Hijau, setiap segi enam dapat diwarnai tanpa dua segi enam yang berbagi perbatasan berbagi warna. Contoh parsial menunjukkan pola seperti itu.

Dengan pemberian ubin heksagonal parsial di ASCII (melalui STDIN, membaca dari file, dll.), Ubah warna karakter (melalui kode ANSI, manipulasi gambar, dll.) Agar sesuai dengan pewarnaan ini. Twist adalah bagian tengah hexagon (di *bawah) adalah tiga warna, dan garis-garis di antara keduanya harus merupakan perpaduan dari dua *warna hex yang sesuai . Jika garis berada di perbatasan luar, itu harus sesuai dengan yang sesuai *.

Misalnya, diberi ubin heksagonal parsial

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

misalkan kita memutuskan untuk mewarnai heks kiri *atas menjadi Merah, dan dua tetangganya menjadi Biru dan Hijau (searah jarum jam). Maka |garis harus Magenta dan /garis harus Kuning. Jika kita terus mewarnai, pada akhirnya kita akan berakhir dengan sesuatu seperti ini (diperbesar untuk kejelasan):

Pewarnaan Heksagonal 1

Atau, untuk input

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

Anda mungkin mewarnainya seperti itu (diperbesar untuk kejelasan):

Pewarnaan Heksagonal 2

Beberapa kasus uji tambahan (kode Anda harus dapat menangani ini):

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


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



 / \
| * |
 \ /

Aturan

  • Input dijamin memiliki setidaknya satu segi enam, dan tidak ada input yang memiliki "lubang."
  • Anda tidak perlu memulai pewarnaan dengan Merah, selama Anda mempertahankan aturan tiga warna.
  • Jika ubin parsial dapat dua warna, Anda dapat melakukannya tanpa penalti (seperti pada contoh kedua) - Anda tidak perlu mengekstrapolasi ubin parsial menjadi ubin penuh.
  • Pusat segi enam *harus diwarnai dengan Merah, Biru, atau Hijau, sedangkan garis-garis di antara harus Cyan, Kuning, atau Magenta. Misalnya, memiliki Magenta *tidak diperbolehkan, dan Merah |atau\ atau /harus berada di perbatasan luar gambar. Lihat Warna , di bawah.
  • Jika konsol Anda tidak memiliki warna-warna yang tepat ini, silakan gunakan perkiraan terdekat dan tentukan dalam jawaban Anda perkiraan apa yang Anda gunakan.
  • Memimpin atau mengikuti spasi, termasuk mengikuti baris baru, dapat diterima selama karakternya berbaris.
  • Ubin parsial dapat dimasukkan dengan spasi-padding untuk membentuk persegi panjang, jika itu membuatnya lebih mudah untuk kode Anda.
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Output bisa ke konsol, disimpan sebagai gambar, dll.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Warna dan Campuran Warna:

Tiga warna dasar yang tersedia adalah (dengan kode warna dalam format desimal RGB):

  • Merah (255,0,0)
  • hijau (0,255,0)
  • Biru (0,0,255)

Kombinasi tersebut adalah:

  • Merah dan Hijau bergabung untuk membuat Kuning (255,255,0)
  • Biru dan Hijau bergabung untuk membuat Cyan (0,255,255)
  • Merah dan Biru bergabung untuk membuat Magenta (255,0,255)
AdmBorkBork
sumber
Bisakah Anda menambahkan test case dengan lubang? Seperti yang pertama (tambahan), tetapi tanpa yang di tengah*
H.PWiz
Jika spasi tambahan diberikan di akhir baris atau baris baru di akhir input, apakah harus dipertahankan?
HyperNeutrino
@ H.PWiz Situasi seperti itu tidak akan pernah muncul. Tidak perlu khawatir.
AdmBorkBork
@HyperNeutrino Tidak, itu murni keputusan Anda. Pemformatan spasi input / output bukan bagian yang menarik dari tantangan ini.
AdmBorkBork
Baik. Terima kasih. Juga, apakah kita harus menangani input kosong?
HyperNeutrino

Jawaban:

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>

Penjelasan: Setiap karakter dibungkus dalam a font tag untuk mengatur warnanya, yang dihitung dengan memeriksa setiap kotak, ditambah dua kotak ke kiri dan kanan, ditambah empat kotak satu lagi secara diagonal, untuk *s dan jika demikian menggabungkan warna semua *ditemukan. The *warna yang dipilih hanya dengan mengambil horisontal mereka berkoordinasi modulo 3 dan pergeseran bitmask sebuah tepat. Sunting: Disimpan 2 byte dengan beralih dari #RRGGBBke #RGBwarna.

Neil
sumber
Anda tidak perlu menangani lubang dalam, jika itu membuat perbedaan.
AdmBorkBork
2
@ AdmBorkBork Tidak, saya hanya pamer.
Neil
"Warnai!" - Anda salah mengeja ini.
OldBunny2800
3
@ OldBunny2800 Dieja dengan benar dalam bahasa saya ...
Neil
2
@ OldBunny2800 Amerika bukan satu-satunya set ejaan yang ada. Ada Inggris (superset dari Inggris Inggris), Australia (yang karena beberapa alasan termasuk Selandia Baru - mungkin harus disebut Australasian) dan Kanada (yang berada di utara sebagian besar AS), misalnya.
wizzwizz4
4

JavaScript (ES6), 210 byte (menggunakan HTML + CSS)

Mirip dengan pendekatan kanvas saya ; menempatkan semua *s di string input dan menulis segi enam ke halaman dalam bentuk <pre>elemen yang benar-benar diposisikan . Karena mix-blend-modediatur ke lighten, penambahan warna dilakukan secara otomatis ketika karakter tumpang tindih.

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

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

Cobalah online!

Golf dan diperbaiki berkat pengguna202729!
-27 byte terima kasih kepada Tn. Xcoder
-24 byte terima kasih kepada Jonathan Frech

HyperNeutrino
sumber
337 byte .
Tn. Xcoder
Juga 2-abs(i)adalah 2-(i&1)dalam konteks ini, 336 byte.
Tn. Xcoder
@ Mr.Xcoder Keren, terima kasih!
HyperNeutrino
kupikir \033 bisa \33(menyimpan satu byte) atau \x1bkarakter sebenarnya ( menyimpan tiga byte ).
Jonathan Frech
1
@ OldBunny2800 Saya pikir itu sama panjangnya. Anda menukar dua =dan satu ;untuk dua, dan 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

Cobalah online!

TFeld
sumber
1

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

Temukan semua *s dalam string input dan cat hexagon ASCII pada kanvas di posisi yang sesuai. KarenaglobalCompositeOperation='lighter' , penambahan warna dilakukan secara otomatis ketika karakter tumpang tindih.

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

Perintah pengganda dan tambahan scale()ditambahkan ke snippet untuk visibilitas.

masukkan deskripsi gambar di sini


Lihat juga pendekatan berbasis CSS saya .

Darrylyeo
sumber
Saya tidak percaya ini memenuhi output yang diperlukan: https://i.stack.imgur.com/Pp3J0.png . Forward dan backslash seharusnya merupakan kombinasi aditif dari warna hexagon yang berbatasan, tidak terpisah.
Patrick Roberts
@ PatrickRoberts Hmm, sepertinya ada masalah dengan lebar font yang tidak konsisten (posisi sudah benar di komputer saya). Saya akan membahas ini hari ini juga.
darrylyeo
Oh, saya tidak menyadari ada platform yang benar. Jika Anda memperbarui jawaban Anda dengan tangkapan layar, saya akan mengembalikan suara saya. Jawaban hanya perlu bekerja pada setidaknya satu implementasi, mereka tidak perlu cross-platform.
Patrick Roberts
1

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

Dalam format kode yang sedikit lebih rapi:

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

Input diambil sebagai array 2D, seperti memasukkan berikut ini ketika diminta untuk input:

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

MATLAB sejauh yang saya tahu tidak memiliki kemampuan untuk menampilkan warna ke konsol (kecuali untuk hack Java kotor yang saya diskon). Dengan demikian, hasilnya dicetak ke angka.

Pewarnaan dicapai dengan menemukan lokasi semua *dalam input, dan kemudian dalam array warna RGB ( p), kotak 5x3 dari 1 (255 dalam representasi warna MATLAB) ditulis terpusat tentang* . Kotak ditulis dengan warna yang sesuai dengan indeks mod-3 di sepanjang setiap baris, dengan garis genap yang indeks warnanya digeser oleh offset.

Ini menghasilkan matriks warna di mana setiap kotak yang tumpang tindih akan menghasilkan warna campuran yang diperlukan. Contoh di atas menghasilkan matriks warna berikut.

Contoh Matriks Warna

Wilayah putih dan hitam tidak relevan karena di lokasi-lokasi tersebut dicetak spasi yang berarti kita tidak benar-benar melihat warna yang salah.

Setelah matriks warna dibuat, kami menampilkan setiap karakter pada gambar menggunakan textperintah, mengatur warna teks ke entri yang sesuai dalam matriks warna. Contoh di atas akan menampilkan:

Sample Output

Tom Carpenter
sumber