16進数で色をコーディングする方法


15

六角形のテッセレーション、または平面のタイルは3色です-つまり、赤、青、緑などの3色のみを使用すると、色を共有する境界線を共有する2つの六角形がなくても、すべての六角形を着色できます。そのようなパターンを示す部分的な例

ASCIIでの部分的な六角形のタイル(STDIN、ファイルからの読み取りなど)が与えられた場合、この色に合うように文字の色(ANSIコード、画像操作など)を変更します。ねじれは六角形の中央(*下の)は3色であり、その間の線は、対応する2つのヘックスの*色の混合である必要があります。線が外側の境界線にある場合、対応すると一致する必要があり*ます。

たとえば、

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

左上のヘックス*を赤に、その隣の2つを青と緑(時計回り)に色付けするとします。次に、|線はマゼンタで、/線は黄色である必要があります。色付けを続けると、最終的には次のようなものになります(わかりやすくするために拡大します)。

六角形の着色1

または、の入力に対して

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

次のように色を付けることができます(わかりやすくするために拡大しています)。

六角形の着色2

いくつかの追加のテストケース(コードでこれらを処理できる必要があります):

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


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



 / \
| * |
 \ /

ルール

  • 入力には少なくとも1つの六角形があることが保証されており、「穴」のある入力はありません。
  • 3色ルールを維持している限り、赤で色付けを開始する必要はありません。
  • 部分タイリングを2色にすることができる場合、ペナルティなしで行うことができます(2番目の例のように)-部分タイリングを完全なタイリングに外挿する必要は必ずしもありません。
  • 六角形の中心*は赤、青、または緑で色付けする必要があり、その間の線はシアン、黄色、またはマゼンタでなければなりません。たとえば、マゼンタを使用する*ことは許可されておらず、赤|または\または/は図面の外側の境界線上になければなりません。以下の色を参照してください。
  • コンソールにこれらの正確な色がない場合は、最も近い近似値を使用し、使用する近似値を回答に指定してください。
  • 文字が並んでいる限り、末尾の改行を含む先頭または末尾の空白は許容されます。
  • コードを簡単にするために、部分的なタイルをスペースパディングで入力して長方形を形成できます。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 出力はコンソールに出力したり、画像として保存したりできます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

色と色の混合物:

利用可能な3つの基本色は次のとおりです(RGB 10進形式のカラーコードを使用)。

  • (255,0,0)
  • (0,255,0)
  • 青い (0,0,255)

組み合わせは次のとおりです。

  • 赤と緑が組み合わさって黄色になります (255,255,0)
  • 青と緑を組み合わせてシアンを作ります (0,255,255)
  • 赤と青を組み合わせてマゼンタを作ります (255,0,255)

穴のあるテストケースを追加してください。最初の(追加の)ものと同様ですが、中間なし*
-H.PWiz

行末に余分な空白が入力された場合、または入力の最後に改行が追加された場合、それらを保持する必要がありますか?
ハイパーニュートリノ

@ H.PWizこのような状況は決して発生しません。心配する必要はありません。
AdmBorkBork

@HyperNeutrinoいいえ、それは純粋にあなたの決定です。入出力の空白の書式設定は、この課題の興味深い部分ではありません。
AdmBorkBork

はい。ありがとう。また、空の入力を処理する必要がありますか?
ハイパーニュートリノ

回答:


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タグでラップして色を設定します。これは、各正方形と、左右に2つずつの正方形と、斜めに1つ離れた4つの正方形をチェックすることで計算され*ます。*が見つかりました。*色は、単に、それらの水平モジュロ3座標を取り、適切にビットマスクをシフトすることによって選択されます。編集:色から切り替えて2バイトを保存し#RRGGBBました#RGB


それが違いを生む場合は、内側の穴を処理する必要はありません。
AdmBorkBork

2
@AdmBorkBorkいいえ、見せびらかすだけでした。
ニール

「Colourise!」-あなたはこれを間違ってつづりました。
OldBunny2800

3
@ OldBunny2800それは私の言語で正しく綴られています...
ニール

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

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

オンラインでお試しください!

user202729のおかげでゴルフと修理ができました!
Mr. Xcoderのおかげで-27バイト
ジョナサンフレッチのおかげで-24バイト



また2-abs(i)ある2-(i&1)、この文脈では336バイト。
ミスターXcoder

@ Mr.Xcoderクール、ありがとう!
ハイパーニュートリノ

(1バイトを節約する)または実際の文字(3バイトを節約する)に\033できると思います\33\x1b
ジョナサンフレッチ

1
@ OldBunny2800同じ長さだと思います。2 =とa ;を2 ,とaに交換し=ます。
-wizzwizz4

2

パイソン2346の 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(キャンバス)+ JavaScript(ES6)、13 + 251 = 264バイト

*入力文字列内のすべてのsを見つけて、キャンバス上の対応する位置に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を満たしているとは思わない 。フォワードスラッシュとバックスラッシュは、境界ではない六角形の色の加算的な組み合わせであると想定されており、別々ではありません。
パトリックロバーツ

@PatrickRobertsうーん、一貫性のないフォント幅の問題のようです(私のコンピューターでの位置は正しいです)。これについては本日後ほど説明します。
-darrylyeo

ああ、正しいプラットフォームがあるとは知りませんでした。スクリーンショットで回答を更新すると、投票が取り消されます。回答は少なくとも1つの実装で動作する必要があるだけで、クロスプラットフォームである必要はありません。
パトリックロバーツ

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コマンドを使用してFigureに各文字を表示し、テキストの色をカラーマトリックスの対応するエントリに設定します。上記の例は以下を表示します:

サンプル出力

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.