Comment coder les couleurs en hexadécimal

15

Les pavages hexagonaux , ou pavages de l'avion, sont tricolores - ce qui signifie qu'en utilisant seulement trois couleurs, comme le rouge, le bleu et le vert, chaque hexagone peut être coloré sans que deux hexagones partagent une bordure partageant une couleur. Un exemple partiel montrant un tel modèle.

Étant donné un pavage hexagonal partiel en ASCII (via STDIN, lecture à partir d'un fichier, etc.), changez les couleurs des caractères (via les codes ANSI, manipulation d'image, etc.) pour s'adapter à cette coloration. La torsion est le milieu des hexagones (les *ci-dessous) sont les trois couleurs, et les lignes entre doivent être un mélange de leurs deux *couleurs hexagones correspondantes . Si la ligne est sur la bordure extérieure, elle doit correspondre à la ligne correspondante *.

Par exemple, étant donné le pavage hexagonal partiel de

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

supposons que nous décidions de colorier l'hex en haut à gauche *pour être rouge, et ses deux voisins pour être bleu et vert (dans le sens horaire). Ensuite, la |ligne doit être magenta et la /ligne doit être jaune. Si nous continuons à colorier, nous finirons par arriver à quelque chose comme ça (agrandi pour plus de clarté):

Coloration hexagonale 1

Ou, pour une entrée de

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

vous pouvez le colorer ainsi (agrandi pour plus de clarté):

Coloration hexagonale 2

Quelques cas de test supplémentaires (votre code devrait être capable de les gérer):

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


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



 / \
| * |
 \ /

Règles

  • L'entrée est garantie d'avoir au moins un hexagone, et aucune entrée n'aura de "trou".
  • Vous n'avez pas besoin de commencer votre coloration avec du rouge, tant que vous maintenez la règle des trois couleurs.
  • Si le pavage partiel peut être bicolore, vous pouvez le faire sans pénalité (comme dans le deuxième exemple) - vous n'avez pas nécessairement besoin d'extrapoler le pavage partiel à un pavage complet.
  • Les centres hexagonaux *doivent être colorés en rouge, bleu ou vert, tandis que les lignes entre doivent être cyan, jaune ou magenta. Par exemple, avoir un Magenta *n'est pas autorisé et un Rouge| ou \ou /doit être sur la bordure extérieure du dessin. Voir Couleurs ci-dessous.
  • Si votre console n'a pas ces couleurs exactes, veuillez utiliser l'approximation la plus proche et spécifier dans votre réponse l'approximation que vous utilisez.
  • Les espaces blancs de début ou de fin, y compris les retours à la ligne de fin, sont acceptables tant que les caractères s'alignent.
  • Le pavage partiel peut être saisi avec un espace pour former un rectangle, si cela facilite la tâche de votre code.
  • Un programme complet ou une fonction sont acceptables. S'il s'agit d'une fonction, vous pouvez renvoyer la sortie plutôt que de l'imprimer.
  • La sortie peut être vers la console, enregistrée en tant qu'image, etc.
  • Les failles standard sont interdites.
  • Il s'agit de donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.

Couleurs et mélanges de couleurs:

Les trois couleurs de base disponibles sont (avec des codes de couleur au format décimal RVB):

  • rouge (255,0,0)
  • vert (0,255,0)
  • Bleu (0,0,255)

Les combinaisons sont:

  • Le rouge et le vert se combinent pour faire du jaune (255,255,0)
  • Le bleu et le vert se combinent pour faire du cyan (0,255,255)
  • Le rouge et le bleu se combinent pour faire du magenta (255,0,255)
AdmBorkBork
la source
Pouvez-vous ajouter un cas de test avec un trou s'il vous plaît? Comme le premier (supplémentaire), mais sans le milieu*
H.PWiz
Si des espaces supplémentaires sont donnés à la fin des lignes ou des sauts de ligne à la fin de l'entrée, doivent-ils être conservés?
HyperNeutrino
@ H.PWiz Une telle situation ne se présenterait jamais. Pas besoin de s'inquiéter à ce sujet.
AdmBorkBork
@HyperNeutrino Non, c'est purement votre décision. Le formatage des espaces blancs d'entrée / sortie n'est pas la partie intéressante de ce défi.
AdmBorkBork
D'accord. Merci. De plus, devrons-nous jamais gérer des entrées vides?
HyperNeutrino

Réponses:

7

JavaScript (ES6), 219 203 201 octets

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>

Explication: Chaque caractère est enveloppé dans une fontbalise pour définir sa couleur, qui est calculée en vérifiant chaque carré, plus les carrés deux à gauche et à droite, plus les quatre carrés un en diagonale, pour *s et si c'est le cas en combinant les couleurs de tous *s trouvé. Les *couleurs sont choisies simplement en prenant leur coordonnée horizontale modulo 3 et en déplaçant un masque de bits de manière appropriée. Modifier: enregistré 2 octets en passant de #RRGGBBaux #RGBcouleurs.

Neil
la source
Vous n'avez pas besoin de gérer les trous intérieurs, si cela fait une différence.
AdmBorkBork
2
@AdmBorkBork Non, je venais juste de me montrer.
Neil
"Colorise!" - Vous avez mal orthographié.
OldBunny2800
3
@ OldBunny2800 Il est correctement orthographié dans ma langue ...
Neil
2
@ OldBunny2800 American n'est pas le seul ensemble d'orthographe qui existe. Il y a le britannique (un surensemble de l'anglais anglais), australien (qui pour une raison quelconque inclut la Nouvelle-Zélande - il faudrait peut-être l'appeler australasien) et canadien (cet endroit au nord de la majorité des États-Unis), par exemple.
wizzwizz4
4

JavaScript (ES6), 210 octets (en utilisant HTML + CSS)

Similaire à mon approche de la toile ; localise tous les *s dans la chaîne d'entrée et écrit des hexagones dans la page sous la forme d' <pre>éléments absolument positionnés . Parce que mix-blend-modeest défini sur lighten, l'ajout de couleur est effectué automatiquement lorsque les caractères se chevauchent.

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
la source
3

Python 2 , 279 octets

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

Essayez-le en ligne!

Golfé et réparé grâce à user202729!
-27 octets grâce à M. Xcoder
-24 octets grâce à Jonathan Frech

HyperNeutrino
la source
337 octets .
M. Xcoder
Aussi 2-abs(i)est 2-(i&1)dans ce contexte, 336 octets.
M. Xcoder
@ Mr.Xcoder Cool, merci!
HyperNeutrino
Je pense que \033peut être \33(enregistrer un octet) ou le \x1bcaractère réel ( enregistrer trois octets ).
Jonathan Frech
1
@ OldBunny2800 Je pense que c'est la même longueur. Vous échangez deux =et un ;pour deux ,et un =.
wizzwizz4
2

Python 2 , 346 331 octets

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

Essayez-le en ligne!

TFeld
la source
1

HTML (Canvas) + JavaScript (ES6), 13 + 251 = 264 octets

Localise tous les *s dans la chaîne d'entrée et peint un hexagone ASCII sur le canevas aux positions correspondantes. CarglobalCompositeOperation='lighter' ajout de couleur est effectué automatiquement lorsque les caractères se chevauchent.

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

Un multiplicateur et une scale()commande supplémentaire ont été ajoutés à l'extrait de code pour plus de visibilité.

entrez la description de l'image ici


Voir également mon approche basée sur CSS .

darrylyeo
la source
Je ne crois pas que cela réponde à la sortie requise: https://i.stack.imgur.com/Pp3J0.png . Les barres obliques avant et arrière sont censées être les combinaisons additives des couleurs des hexagones qu'elles bordent, pas séparées.
Patrick Roberts
@PatrickRoberts Hmm, semble être un problème avec des largeurs de police incohérentes (les positions sont correctes sur mon ordinateur). J'examinerai cela plus tard aujourd'hui.
darrylyeo
Oh, je ne savais pas qu'il y avait une plateforme qui était correcte. Si vous mettez à jour votre réponse avec une capture d'écran, je reviendrai sur mon vote. Les réponses doivent uniquement fonctionner sur au moins une implémentation, elles n'ont pas besoin d'être multiplateforme.
Patrick Roberts
1

MATLAB / Octave , 223 octets

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

Au format de code légèrement plus net:

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

L'entrée est prise comme un tableau 2D, par exemple en entrant ce qui suit lorsque vous y êtes invité:

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

Pour autant que je sache, MATLAB n'a pas la possibilité de sortir des couleurs sur la console (à l'exception des hacks Java sales que je remets en cause). En tant que tel, la sortie est imprimée à la place sur une figure.

La coloration est obtenue en trouvant l'emplacement de tous *dans l'entrée, puis dans un tableau de couleurs RVB ( p), une boîte 5x3 de 1 (255 dans la représentation des couleurs MATLAB) est écrite centrée sur le* . La boîte est écrite dans la couleur correspondant à l'index mod-3 le long de chaque ligne, les lignes paires ayant l'indice de couleur décalé d'un décalage.

Cela produit une matrice de couleurs où toutes les cases qui se chevauchent entraîneront la couleur mélangée requise. L'exemple ci-dessus produit la matrice de couleurs suivante.

Exemple de matrice de couleurs

Les régions blanches et noires ne sont pas pertinentes car à ces endroits, un espace est imprimé, ce qui signifie que nous ne voyons pas la couleur incorrecte.

Une fois la matrice de couleurs créée, nous affichons chaque caractère sur une figure à l'aide de la textcommande, en définissant la couleur du texte sur l'entrée correspondante dans la matrice de couleurs. L'exemple ci-dessus affichera:

Exemple de sortie

Tom Carpenter
la source