Les terminaux sont tellement ennuyeux de nos jours. Ils ressemblaient à ceci:
Maintenant, ils sont juste fades et ternes et en noir et blanc. Je veux que vous m'écriviez un programme qui rendra mon terminal tout de nouveau coloré!
La description
Prenez cet exemple de code Ruby:
La plupart des terminaux Linux prennent en charge ces séquences d'échappement ( \e
signifie le caractère d'échappement), et Windows peut les prendre en charge avec ANSICON . Voici la syntaxe de la séquence d'échappement spécifique qui peut changer la couleur du texte ou de l'arrière-plan d'une chaîne:
\e[{{COLOR}}m
où \e
représente le caractère d'échappement ( 0x1B
en ASCII) et {{COLOR}}
est remplacé par le numéro de la couleur que vous souhaitez utiliser (plus de détails à ce sujet plus tard). Le texte qui vient après cette séquence d'échappement sera formaté comme indiqué et une valeur de 0
réinitialisera tout le formatage.
Votre défi consiste à prendre une chaîne spécifiant du texte pouvant contenir de la couleur et à en produire une version colorée.
Entrée sortie
Le texte normal fonctionne comme d'habitude et est imprimé littéralement. Par exemple, l'entrée waffles
donne la même sortie, sans couleur spéciale.
La syntaxe pour spécifier une couleur est similaire à la syntaxe de Wikipedia . Par exemple, pour colorer les mots "la couleur rouge" en rouge dans la phrase This is the color red!
, l'entrée serait:
This is {{red|the color red}}!
Les couleurs d'arrière-plan fonctionnent également. Si vous vouliez des lettres noires sur fond blanc, vous utiliseriez ceci:
{{black|white|This text is black on white}}
Pour obtenir uniquement une couleur d'arrière-plan, omettez le premier plan:
{{|red|This text has a red background}}
spécification
Deux accolades ouvertes indiquent toujours le début d'une directive de couleur . Deux accolades fermantes indiquent la fin. Les parenthèses correspondront toujours; il n'y aura jamais de {{
sans correspondant }}
, et un }}
ne viendra jamais avant son correspondant {{
. Ces directives de couleur ne seront pas imbriquées et a {{
n'apparaîtra jamais dans une directive de couleur.
Dans une directive couleur, il y aura toujours un ou deux |
symboles. S'il y en a un, le texte avant c'est la couleur de premier plan et le texte après est la chaîne à afficher dans cette couleur. S'il y en a deux, le texte avant le premier est la couleur de premier plan, le texte après le premier mais avant le second est la couleur d'arrière-plan et le texte après le second est la chaîne à afficher. Ces barres verticales peuvent exister en dehors d'une directive de couleur et doivent être imprimées littéralement.
La couleur de premier plan ou d'arrière-plan (mais pas les deux) peut être vide, auquel cas vous devez les laisser par défaut. La chaîne finale (celle à afficher) ne sera jamais vide.
Voici les instructions pour sortir du texte d'une certaine couleur:
Une séquence de couleurs est définie dans la section "Description". Par exemple, une séquence de couleurs de 42 serait
"\e[42m"
.Pour définir une couleur, imprimez la séquence de couleurs du nombre déterminé ci-dessous:
Color name | Color sequence number (foreground / background) --------------+---------- black | 30 / 40 red | 31 / 41 green | 32 / 42 yellow | 33 / 43 blue | 34 / 44 magenta | 35 / 45 cyan | 36 / 46 lightgray | 37 / 47 darkgray | 90 / 100 lightred | 91 / 101 lightgreen | 92 / 102 lightyellow | 93 / 103 lightblue | 94 / 104 lightmagenta | 95 / 105 lightcyan | 96 / 106 white | 97 / 107
Les noms de couleur sont sensibles à la casse et un nom de couleur non valide ne sera jamais fourni. Vous n'avez pas à gérer des choses comme
RED
oulightgrey
(orthographié avec une
).Après avoir imprimé une séquence de couleurs, elle s'appliquera à tout le texte qui la suit. Pour terminer une séquence de couleurs (réinitialiser à la couleur par défaut), sortez une séquence de couleurs de
0
("\e[0m"
).
Cas de test
{{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }} {{red|'}} {{red|'}} {{|yellow| }}
{{|yellow| }} \_/ {{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }}
Cela devrait produire un visage souriant ... avec des yeux rouges maléfiques.
Règles
Vous ne pouvez utiliser aucune bibliothèque ou fonction de votre langage de programmation pour analyser automatiquement une couleur. Cela signifie que vous devez être celui qui détermine ce que
"red"
signifie; une bibliothèque ne peut pas le faire automatiquement pour vous.Il s'agit de code-golf , donc le code le plus court en octets gagnera!
\n\[\e[32m\]\w\n\[\e[0m\]>
(nom de répertoire vert, invite simple sur la ligne suivante), mais je ne peux pas le faire fonctionner à partir d'un programme (essayé python et Java jusqu'à présent). Des idées?echo -e "\e[31mtest\e[0m"
.lolcat
.you
il signifie au sens figuréyour program
(par opposition à un appel à une fonction de bibliothèque), et qu'il prenddetermine
dans le sens defigure out
, pas comme danschoose
. C'est-à-dire que c'est votre programme qui doit gérer le mappage: String ("red") | -> Integer (31).red
c'est seulement31
parce qu'il le dit, que l'information doit être intégrée au programme. Bien que l'on puisse dire exactement ce qui compteraityour program
- pouvons-nous utiliser des fonctions de manipulation de chaînes à usage général? - ne trichez / abusez pas ouvertement.Réponses:
Rubis,
205189188186185 185182174170165161159154 154 octetsMettre de longues chaînes de noms de couleurs dans votre code ne semble pas assez ringard.
Jusqu'à 170 en partie grâce à
rubik
. Maintenant, les barres de défilement ont disparu!Une amélioration évidente et pas si évidente, grâce à la réponse flexible, sans l'amélioration, je n'aurais pas revu cela!
Plus maintenant, j'ai sauvé 4 octets avec #sum.
Je n'en avais pas l'intention, mais je viens de remarquer que cette solution est également insensible à la casse. Il traite avec bonheur{{RED|Red text}}
.Vidage hexadécimal:
Vous pouvez le convertir avec
xxd -r hex.dump
.Le programme avec tous les caractères non imprimables s'est échappé à des fins de référence:
C'est une ligne. Utilisez-le comme ça
Le
-W0
drapeau supprime les avertissements qui seraient envoyésstderr
autrement. Cependant, le programme fonctionne correctement sans aucun indicateur.Production:
la source
'1?IYU_N[(\x0c\x16&",\x1f\x01'
. Ma chaîne a une longueur de 16 cependant. Je vois que le vôtre a 18 ans, vous devez donc probablement vous ajuster.int()
fonction de Python ne peut pas dépasser 36). Ensuite, j'ai essayé toutes les combinaisons pour le module (de 2 à 10000, mais en théorie on pourrait élargir la recherche à tout Unicode) et pour le xor, que j'ai gardé petit (1 à 9). Ensuite, j'ai considéré des résultats acceptables uniquement ceux qui ne contenaient pas de caractères en double.x.to_i(base)%mod+offset
. J'ai ensuite remplacé le+
par^
, car bon, il a l'air plus cool. A part ça, c'est inutile. Suppression de^99
et modification<<
en+
enregistré pour plus d'octets. Merci pour l'astuce, je ne l'aurais pas remarqué autrement!Ruby, 329 octets.
la source
ruby 2.1.2p95
et il jette l' erreur:undefined method 'gsub' for nil:NilClass (NoMethodError)
.ruby colors.rb < input.txt
, il continuera à boucler une fois que toutes les entrées auront été lues.gets
Retourne ensuitenil
, qui ne possède pas de#gsub
méthode, provoquant ainsi une erreur. Utilisez$><<$<.read
au lieu deloop{puts gets
, c'est aussi plus court; )Flex (lexer) -
226197192182168 (ou 166)Pour le ramener à 166, remplacez le
\33
par un caractère d'échappement réel.Compiler et exécuter:
la source
Python - 351
la source
Cobra - 496
Il pourrait s'agir presque d' une seule déclaration imprimée.
la source
Python, 561
Lit le texte à formater depuis stdin.
la source
is not None
dans un codegolf. Vous pouvez utiliser!=None
, par exemple.def p(f,b,t)
, votre code lancera unZeroDivisionError
. Tout mod 0 est impossible.re.sub
exécution de ce programme