Votre défi est de prendre l'entrée comme une ligne de texte et de la produire comme ceci.
Entrée sortie
L'entrée sera une chaîne qui ne contient que des caractères ASCII imprimables. Le premier ou le dernier caractère ne sera jamais un espace et il n'y aura jamais deux espaces de suite. Il comportera toujours au moins deux caractères.
Votre sortie doit être la même chaîne, convertie en couleurs arc-en-ciel comme décrit ci-dessous. La sortie peut être sous forme d'image (enregistrée dans un fichier ou autrement mise à disposition), ou simplement afficher le résultat à l'écran (comme le fait l'implémentation de référence ci-dessous).
Conversion
Pour déterminer la couleur de chaque lettre de la chaîne, utilisez l'algorithme suivant. Notez que chaque lettre a sa propre couleur individuelle . Ce n'est pas un dégradé!
Si ce personnage est un espace:
- ... cela n'a pas d'importance, car les espaces ne peuvent pas vraiment ... avoir une couleur de toute façon. Générez simplement un espace.
Autrement:
Soit
i
= l'index de ce caractère dans la chaîne (basé sur 0, donc pour la toute première lettre, c'est0
), sans compter les espaces. Par exemple, dans la chaînefoo bar
, cette valeur serait4
pour lea
. En d'autres termes, c'est le nombre de non-espaces qui ont été rencontrés jusqu'à présent.Soit
n
= le nombre de non-espaces dans la chaîne.La couleur de cette lettre peut maintenant être exprimée, dans le système de coordonnées cylindriques HSL , comme [teinte = (
i
/n
) * 360 °, saturation = 100%, légèreté = 50%].
Notez que ces directions impliquent que la sortie pour foo
et f oo
doit être exactement la même, sauf pour un espace ajouté après le f
. Autrement dit, toutes les lettres doivent conserver les mêmes couleurs.
D'autres règles pour le processus de conversion sont décrites ci-dessous, dans les règles section .
Implémentation de référence
Ceci est écrit en JavaScript, et vous pouvez l'essayer en appuyant sur le bouton "Exécuter l'extrait de code".
window.addEventListener('load', function() {
addRainbow('Your challenge is to take input as a line of text and ' +
'output it like this.');
});
// append this text rainbow-ified to the argument (document.body by default)
function addRainbow(text, el) {
(el || document.body).appendChild(makeRainbow(text));
}
// returns a <div> that contains the text in a rainbow font
function makeRainbow(text) {
var div = document.createElement('div');
var letterCount = text.replace(/ /g, '').length, spaceCount = 0;
text.split('').forEach(function(letter, idx) {
if (letter == ' ') ++spaceCount;
div.appendChild(makeLetter(letter, (idx - spaceCount) / letterCount));
});
return div;
}
// returns a <span> that contains the letter in the specified color
function makeLetter(letter, hue) {
hue = Math.floor(hue * 360);
var span = document.createElement('span');
span.appendChild(document.createTextNode(letter));
span.style.color = 'hsl(' + hue + ', 100%, 50%)';
return span;
}
Règles
Lors du calcul de la valeur de teinte d'une lettre, vous obtiendrez presque certainement un nombre décimal (non entier). Vous pouvez l'arrondir à l'entier le plus proche, le fixer au sol, prendre le plafond ou simplement ne pas arrondir du tout.
La taille de la police doit être lisible. Ici, cela est défini comme une police de taille 10pt ou supérieure.
Vous pouvez utiliser un canevas à largeur fixe ou une "zone de dessin" pour sortir le texte, mais il doit être en mesure de correspondre à l'exemple donné dans la toute première phrase de cet article.
La notation est le code-golf , donc le code le plus court en octets gagnera.
Réponses:
Perl, 95
92 octets code + 3 pour
-p
Ce script utilise une approximation des couleurs disponibles pour le terminal (256 maximum), n'incluant actuellement que quelques points de couleur sélectionnés dans cette liste , il est donc probable qu'il ne soit pas spécifié, mais c'était quand même amusant! J'ai filtré la liste pour n'afficher que les couleurs avec
S
et lesL
valeurs de100%
et50%
respectivement, puis trié par teinte, emballé les nombres dans une chaîne et sélectionné les couleurs de cette liste.Cette implémentation comprend des caractères non imprimables! L'idée de Stole @ edc65 de remplacer seulement
\S
au lieu de.
, simple, mais intelligente!Hexdump:
Inversez le hexdump en copiant le texte ci-dessus et en exécutant:
coller les données et appuyer sur Ctrl+ D.
Exécutez en utilisant:
Il produit une sortie comme:
la source
Python 2: 240 utilisant PIL et colorsys lib
Exemple de sortie:
Merci à @agtoever et @Trang Oul pour quelques conseils de golf et à @Mauris pour avoir souligné les besoins en espaces.
Pour ajouter un vrai type de police, contrôlez la taille de la police, y compris le décalage horizontal et le changement de couleur en fonction de la longueur.
La police que j'ai utilisée est disponible à partir d' ici : Le résultat est (le haut n'imprime que la chaîne, celui ci-dessous imprime par lettre):
la source
as P
et écrivezPIL
deux fois et gagnez un personnage. Changementimg
ài
et gagner 4 caractères.255
dans une variable, remplacer toutes les occurrences et utiliser(a,)*3
comme couleur blanche. Remplacezfloat(j)
par(j+.0)
.float(j)
to1.*j
u=len(s) a=255
=>u,a=len(s),255
). Retirez les[]
supports detuple
, ils ne sont pas nécessaires. Remplacez la boucle par la compréhension de la liste (la méthode sera évaluée comme un effet secondaire).JavaScript (ES6), 114
117 125Edit2 3 octets enregistrés thx @Dom Hastings Edit HTML non valide, mais fonctionnant quand même.
Remarque habituelle: test de l'exécution de l'extrait sur un navigateur compatible EcmaScript 6 (notamment pas Chrome ni MSIE. J'ai testé sur Firefox)
la source
)
après votrehsl(
déclaration car cela semble toujours fonctionner pour moi dans Firefox!${c}'
pour'+c
enregistrer 2 de plus ... Mieux vaut reprendre le mien!Python 3, 131 octets
Similaire à la réponse de Dom Hastings mais implémenté en python.
La chaîne a
'|\x82\x88\x8ejF"#$%\x1f\x19\x137[\x7f~}'
été créée à partir de la liste[124,130,136,142,106,70,34,35,36,37,31,25,19,55,91,127,126,125]
des codes de couleur terminaux à afficher dans l'ordre. Ils ont été filtrés de sorte qu'ils n'incluent que les couleurs avec une saturation de 100% et une valeur de 50%. La liste a ensuite été triée afin que les teintes correctes soient affichées en premier.Prend l'entrée de stdin et la renvoie à stdout.
Votre terminal que vous utilisez DOIT prendre en charge les codes d'échappement ANSI pour fonctionner correctement.
Ou version raccourcie avec des caractères d'octets littéraux (n'a pas collé correctement):
Vidage hexadécimal littéral:
Merci @swstephe pour avoir économisé 9 octets (et aussi pour m'avoir fait remarquer que mon comptage d'octets était très légèrement faux)!
la source
PHP, 165 octets
Exécuter avec entrée comme paramètre "s"
Le code HTML n'est pas valide, mais il devrait s'afficher dans tous les principaux navigateurs (testé dans Chrome et Firefox)
la source
PHP 4.1,
112103102 octetsJ'ai utilisé la réponse de @DankMemes comme point de départ. À partir de là, j'ai implémenté une tonne de changements, au point que le code est différent.
L'implémentation est similaire, le code est totalement différent.
Pour l'utiliser, il suffit de définir une valeur sur une SESSION / GET / POST / COOKIE avec le nom
s
.Résultat de l'exécution de cette fonction, sur la phrase test:
la source