Как кодировать цвета в шестнадцатеричном виде


15

Гексагональные тесселяции , или наклоны плоскости, имеют три цвета - это означает, что при использовании только трех цветов, таких как красный, синий и зеленый, каждый шестиугольник может быть окрашен без каких-либо двух шестиугольников, имеющих общую границу. Частичный пример, показывающий такой шаблон.

Учитывая частичное шестиугольное разбиение на листы в ASCII (через STDIN, чтение из файла и т. Д.), Измените цвета символов (с помощью кодов ANSI, обработки изображений и т. Д.), Чтобы соответствовать этой окраске. Поворот - середина шестиугольников ( *ниже) - три цвета, и линии между ними должны быть смесью их двух соответствующих *цветов гексагона . Если линия находится на внешней границе, она должна соответствовать соответствующей *.

Например, с учетом частичного шестиугольного мозаичного

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

предположим, что мы решили закрасить верхний левый гекс *красным, а два его соседа - синим и зеленым (по часовой стрелке). Тогда |линия должна быть пурпурной, а /линия - желтой. Если мы продолжим раскрашивать, мы в итоге получим что-то вроде этого (увеличено для ясности):

Гексагональная раскраска 1

Или для ввода

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

Вы можете покрасить его так (увеличено для ясности):

Шестиугольная раскраска 2

Несколько дополнительных тестовых случаев (ваш код должен уметь их обрабатывать):

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


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



 / \
| * |
 \ /

правила

  • На входе гарантированно будет хотя бы один шестиугольник, а на входе не будет «дыры».
  • Вам не нужно начинать красить с красного, если вы соблюдаете правило трех цветов.
  • Если частичный лист может быть двухцветным, вы можете сделать это без штрафа (как во втором примере) - вам не обязательно экстраполировать частичный лист на полный лист.
  • Шестиугольные центры *должны быть окрашены красным, синим или зеленым, а линии между ними должны быть голубым, желтым или пурпурным. Например, наличие пурпурного цвета *не допускается, а красный |или \или /должен находиться на внешней границе рисунка. Смотрите Цвета ниже.
  • Если ваша консоль не имеет этих точных цветов, пожалуйста, используйте ближайшее приближение и укажите в своем ответе, какое приближение вы используете.
  • Начальные или конечные пробелы, включая завершающие символы новой строки, допустимы, если символы выстраиваются в линию.
  • Частичная мозаика может быть введена с пробелом, чтобы сформировать прямоугольник, если это облегчает ваш код.
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Вывод может быть на консоль, сохранен как изображение и т. Д.
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Цвета и цветовые смеси:

Доступны три основных цвета (с цветовыми кодами в десятичном формате RGB):

  • красный (255,0,0)
  • зеленый (0,255,0)
  • синий (0,0,255)

Комбинации:

  • Красный и Зеленый объединяются, чтобы сделать Желтый (255,255,0)
  • Синий и зеленый объединяются, чтобы сделать голубой (0,255,255)
  • Красный и синий объединяются, чтобы сделать пурпурный (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 и смещение битовой маски соответствующим образом . Edit: Сохраненный 2 байта, переключаясь от #RRGGBBдо #RGBцветов.


Вам не нужно обрабатывать внутренние отверстия, если это имеет значение.
AdmBorkBork

2
@AdmBorkBork Нет, я просто хвастался.
Нил

"Colourise!" - Вы написали это неправильно.
OldBunny2800

3
@ OldBunny2800 Это правильно написано на моем языке ...
Нил

2
@ OldBunny2800 Американский не единственный набор орфографии, который существует. Например, есть британский (расширенный набор английского английского), австралийский (который по некоторым причинам включает в себя Новую Зеландию - возможно, его следует называть австралийским) и канадский (это место к северу от большинства США).
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))

Попробуйте онлайн!

Гольф и исправлено благодаря пользователю 202729!
-27 байт благодаря мистеру Xcoder
-24 байт благодаря Джонатану Фреху



И 2-abs(i)находится 2-(i&1)в этом контексте 336 байт.
г-н Xcoder

@ Mr.Xcoder Круто, спасибо!
HyperNeutrino

Я думаю, что \033может быть \33(сохранение одного байта) или фактический \x1bсимвол ( сохранение трех байтов ).
Джонатан Фрех

1
@ OldBunny2800 Я думаю, что это такая же длина. Вы меняете два =и a ;на два ,и a =.
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 байта

Находит все *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

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

В более аккуратном формате кода:

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

Ввод принимается как двумерный массив, например, вводит следующее при запросе ввода:

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

Насколько мне известно, у MATLAB нет возможности выводить цвета на консоль (за исключением грязных взломов Java, которые я игнорирую). Таким образом, вывод вместо этого печатается на рисунке.

Раскраска достигается путем нахождения местоположения всех *входных данных, а затем в массиве цветов RGB ( p) поле 5х3 из 1 (255 в представлении цвета MATLAB) пишется по центру относительно* . Коробка записывается в цвет, соответствующий индексу mod-3 вдоль каждой строки, причем четные строки, имеющие индекс цвета, смещены на смещение.

Это создает цветовую матрицу, где любые блоки, которые перекрываются, приведут к требуемому смешанному цвету. В приведенном выше примере получается следующая цветовая матрица.

Пример цветовой матрицы

Белые и черные области не имеют значения, потому что в этих местах печатается пробел, означающий, что мы на самом деле не видим неправильный цвет.

Как только цветовая матрица создана, мы отображаем каждый символ на рисунке, используя textкоманду, устанавливая цвет текста для соответствующей записи в цветовой матрице. Приведенный выше пример будет отображать:

Пример вывода

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.