Як кодувати кольори в шістнадцятковий


15

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

З огляду на часткове шестикутне облицювання в ASCII (через STDIN, зчитування з файлу тощо), змініть кольори символів (за допомогою ANSI-кодів, маніпулювання зображеннями тощо), щоб відповідати цьому фарбуванню. Скрутка - середина шестикутників ( *внизу) - це три кольори, а лінії між ними повинні бути сумішшю двох відповідних шестикутних *кольорів. Якщо лінія знаходиться на зовнішній межі, вона повинна відповідати відповідній *.

Наприклад, враховуючи часткову шестикутну плитку

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

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

Шестикутне забарвлення 1

Або для введення

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

ви можете розфарбувати його так (збільшено для наочності):

Шестикутне забарвлення 2

Кілька додаткових тестових випадків (ваш код повинен мати змогу впоратися з ними):

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


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



 / \
| * |
 \ /

Правила

  • Гарантоване вхід має принаймні один шестикутник, і жоден вхід не матиме «дірку».
  • Вам не потрібно починати фарбування червоним кольором, поки ви дотримуєтесь правила триколірного.
  • Якщо часткова плитка може бути двоколірною, ви можете зробити це без штрафних санкцій (як, наприклад, у другому прикладі) - не обов'язково екстраполювати часткову плитку на повну плитку.
  • Центри шестикутника *повинні бути пофарбовані червоним, блакитним або зеленим кольором, а лінії між ними повинні бути або синім, жовтим, або пурпуровим. Наприклад, має Magenta *не допускається, а червоний |або \або /повинні знаходитися на зовнішньому кордоні малюнка. Дивіться Кольори нижче.
  • Якщо ваша консоль не має цих точних кольорів, скористайтеся найближчим наближенням та вкажіть у своїй відповіді, яке наближення ви використовуєте.
  • Простір провідних або кінцевих пробілів, включаючи прокладки нових рядків, є прийнятними до тих пір, поки символи не вирівнюються.
  • Часткова плитка може бути введена за допомогою пробілу для формування прямокутника, якщо це полегшить ваш код.
  • Прийнятна або повна програма, або функція. Якщо функція, ви можете повернути вихід, а не надрукувати його.
  • Вихід може бути на консолі, зберегти у вигляді зображення тощо.
  • Стандартні лазівки заборонені.
  • Це тому застосовуються всі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Кольори та кольорові суміші:

Три доступні базові кольори (з кольоровими кодами у десятковому форматі 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 і зміщення бітової маски відповідним чином . Редагувати: збережено 2 байти шляхом переходу #RRGGBBдо #RGBкольорів.


Вам не потрібно обробляти внутрішні отвори, якщо це має значення.
AdmBorkBork

2
@AdmBorkBork Ні, я просто демонструвався.
Ніл

"Кольоровий!" - Ви написали це неправильно.
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))

Спробуйте в Інтернеті!

Завдяки користувачеві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 (полотно) + 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.