Renkleri onaltılı olarak kodlama


15

Altıgen mozaikler veya düzlemin eğimleri üç renklidir - yani Kırmızı, Mavi ve Yeşil gibi sadece üç renk kullanarak, her altıgen bir rengi paylaşan bir sınır paylaşan iki altıgen olmadan renklendirilebilir. Böyle bir paterni gösteren kısmi bir örnek.

ASCII'de (STDIN aracılığıyla, bir dosyadan okuma vb.) Kısmi altıgen bir döşeme verildiğinde, karakterlerin renklerini (ANSI kodları, görüntü işleme vb. Yoluyla) bu renge uyacak şekilde değiştirin. Büküm altıgenlerin ortasıdır ( *aşağıda) üç renktir ve aradaki çizgilerin karşılık gelen iki altıgen *renginin bir karışımı olması gerekir . Çizgi dış sınırdaysa, karşılık gelenle eşleşmelidir *.

Örneğin, kısmi altıgen döşeme

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

sol üst onaltıyı *Kırmızı ve iki komşusunun Mavi ve Yeşil (saat yönünde) renklendirmeye karar verdiğimizi varsayalım . O zaman |çizginin Eflatun olması ve /çizginin Sarı olması gerekir. Renklendirmeye devam edersek, sonunda böyle bir şeyle sonuçlanacağız (netlik için büyütüldü):

Altıgen Boyama 1

Veya,

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

bu şekilde renklendirebilirsiniz (netlik için büyütülmüş):

Altıgen Boyama 2

Birkaç ek test durumu (kodunuz bunları işleyebilmelidir):

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


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



 / \
| * |
 \ /

kurallar

  • Girişin en az bir altıgen olması garanti edilir ve hiçbir girişte "delik" olmaz.
  • Üç renk kuralını koruduğunuz sürece renklendirmeye Kırmızı ile başlamanız gerekmez.
  • Kısmi döşeme iki renkli olabilirse, bunu ceza olmadan yapabilirsiniz (ikinci örnekte olduğu gibi) - kısmi döşemeyi tam bir döşemeye tahmin etmek zorunda değilsiniz.
  • Altıgen merkezler *Kırmızı, Mavi veya Yeşil ile renklendirilirken, aralarındaki çizgiler Camgöbeği, Sarı veya Macenta olmalıdır. Örneğin, Macentaya *izin verilmez ve çizimin dış sınırında Kırmızı |veya \veya /olması gerekir. Aşağıdaki Renklere bakın.
  • Konsolunuzda tam olarak bu renkler yoksa, lütfen en yakın yaklaşımı kullanın ve cevabınızda hangi yaklaşımı kullandığınızı belirtin.
  • Sondaki yeni satırlar da dahil olmak üzere, önde gelen veya arkadaki boşluklar, karakterler sıralandığı sürece kabul edilebilir.
  • Kısmi döşeme, bir dikdörtgen oluşturmak için boşluk dolgusu ile girilebilir, bu da kodunuzu kolaylaştırır.
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine döndürebilirsiniz.
  • Çıktı konsola olabilir, görüntü olarak kaydedilebilir vb.
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Renkler ve Renk Karışımları:

Mevcut üç temel renk (RGB ondalık biçimindeki renk kodlarıyla):

  • Kırmızı (255,0,0)
  • Yeşil (0,255,0)
  • Mavi (0,0,255)

Kombinasyonlar:

  • Kırmızı ve Yeşil sarı yapmak için birleştirir (255,255,0)
  • Mavi ve Yeşil birleştirmek Camgöbeği yapmak için (0,255,255)
  • Kırmızı ve Mavi bir araya getirmek için Macenta (255,0,255)

Delikli bir test çantası ekleyebilir misiniz? İlk (ek) gibi, ama orta olmadan*
H.PWiz

Eğer satırların sonunda fazla boşluk veya girişin sonunda satır sonları verilirse, bunların korunması gerekir mi?
HyperNeutrino

@ H.PWiz Böyle bir durum asla ortaya çıkmaz. Endişelenmenize gerek yok.
AdmBorkBork

@HyperNeutrino Hayır, bu tamamen senin kararın. Girdi / çıktı boşluk biçimlendirmesi bu zorluğun ilginç bir parçası değildir.
AdmBorkBork

Tamam. Teşekkürler. Ayrıca, hiç boş girdi işlemek zorunda kalacak mıyız?
HyperNeutrino

Yanıtlar:


7

JavaScript (ES6), 219 203 201 bayt

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>

Açıklama: Her karakter, fonther bir kareyi artı iki sol ve sağdaki kareleri artı dört köşeyi çapraz olarak, *s için ve eğer varsa tüm renklerin birleştirerek hesaplanan rengini ayarlamak için bir etikete sarılır. *bulundu. *Renkler sadece yatay modülo 3 koordinat alarak ve uygun bir bit maskesi kaydırılması ile seçilir. Düzenleme: Kaydedilen 2 geçiş yaparak bayt #RRGGBBiçin #RGBrenkler.


Bir fark yaratırsa iç delikleri tutmanıza gerek yoktur.
AdmBorkBork

2
@AdmBorkBork Hayır, sadece gösteriyordum.
Neil

"Renklendirebilir!" - Bunu yanlış heceledin.
OldBunny2800

3
@ OldBunny2800 Benim dilimde doğru yazılmış ...
Neil

2
@ OldBunny2800 Var olan tek yazım kümesi Amerikalı değil. Örneğin, İngiliz (İngiliz İngilizcesinin bir üst kümesi), Avustralya (bazı nedenlerden dolayı Yeni Zelanda'yı içerir - belki de Avustralyalı olarak adlandırılmalıdır) ve Kanada (ABD'nin çoğunluğunun kuzeyinde yer alan).
wizzwizz4

4

JavaScript (ES6), 210 bayt (HTML + CSS kullanarak)

Benim benzer tuval yaklaşımı ; *giriş dizesindeki tüm s'yi bulur ve sayfaya kesinlikle konumlandırılmış <pre>öğeler biçiminde altıgenler yazar . Olarak mix-blend-modeayarlandığından lighten, karakterler eklendiğinde renk ekleme otomatik olarak gerçekleştirilir.

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 bayt

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

Çevrimiçi deneyin!

User202729 sayesinde golf oynamak ve düzeltmek!
Bay Xcoder sayesinde -27 bayt
-Jonathan Frech sayesinde -24 bayt.



Ayrıca 2-abs(i)olduğu 2-(i&1)bu bağlamda, 336 bayt.
Bay Xcoder

@ Mr.Xcoder Cool, teşekkürler!
HyperNeutrino

Bence \033olabilir \33veya fiili (tek byte tasarruf) \x1b(karakteri üç bayt tasarrufu ).
Jonathan Frech

1
@ OldBunny2800 Bence bu aynı uzunlukta. Sen ikisini takas =ve bir ;iki ,ve =.
wizzwizz4

2

Python 2 , 346331 bayt

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

Çevrimiçi deneyin!


1

HTML (Tuval) + JavaScript (ES6), 13 + 251 = 264 bayt

*Giriş dizesindeki tüm s'leri bulur ve tuval üzerinde ilgili konumlarda bir ASCII altıgeni boyar. Çünkü globalCompositeOperation='lighter'karakterler çakıştığında renk ekleme otomatik olarak gerçekleştirilir.

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()Görünürlük için snippet'e bir çarpan ve ek komut eklendi.

resim açıklamasını buraya girin


Ayrıca CSS tabanlı yaklaşımımı da görün .


Bunun gerekli çıktıyı karşıladığına inanmıyorum: https://i.stack.imgur.com/Pp3J0.png . İleri ve ters eğik çizgilerin, ayırdıkları altıgenlerin renklerinin ek kombinasyonları olduğu varsayılır, ayrı değildir.
Patrick Roberts

@PatrickRoberts Hmm, tutarsız yazı tipi genişlikleriyle ilgili bir sorun gibi görünüyor (konumlar bilgisayarımda doğru). Bunu bugün daha sonra inceleyeceğim.
darrylyeo

Oh, doğru bir platform olduğunu fark etmedim. Cevabınızı bir ekran görüntüsü ile güncellerseniz oyumu geri alacağım. Yanıtların yalnızca en az bir uygulama üzerinde çalışması gerekir, çapraz platform olması gerekmez.
Patrick Roberts

1

MATLAB / Oktav , 223 bayt

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

Biraz daha temiz kod biçiminde:

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

Giriş, giriş istendiğinde aşağıdakilerin girilmesi gibi bir 2D dizi olarak alınır:

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

MATLAB, bildiğim kadarıyla, konsola renkler çıktılama yeteneğine sahip değil (indirim yaptığım kirli Java korsanları hariç). Bu nedenle çıktı bunun yerine bir şekle yazdırılır.

Renklendirme, *girişteki herkesin yeri bulunarak elde edilir ve daha sonra bir RGB renk dizisinde ( p), 5x3 kutu 1'lerin (MATLAB renk sunumunda 255) hakkında ortalanır *. Kutu, her satır boyunca mod-3 indeksine karşılık gelen renge yazılır, hatta renk indeksi olan satırlar bile bir ofset tarafından kaydırılır.

Bu, örtüşen kutuların gerekli karışık renge neden olacağı bir renk matrisi üretir. Yukarıdaki örnek, aşağıdaki renk matrisini üretir.

Renk Matrisi Örneği

Beyaz ve siyah bölgeler önemsizdir, çünkü bu yerlerde bir boşluk basılır, yani yanlış rengi görmüyoruz.

Renk matrisi oluşturulduktan sonra, textmetnin rengini renk matrisindeki karşılık gelen girişe ayarlayarak komutu kullanarak bir rakamdaki her karakteri görüntüleriz . Yukarıdaki örnek aşağıdakileri gösterecektir:

Örnek Çıktı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.