Ваша задача состоит в том, чтобы воспринимать ввод как строку текста и выводить его следующим образом.
Ввод, вывод
На входе будет строка, содержащая только печатные символы ASCII. Первый или последний символы никогда не будут пробелами, и никогда не будет двух пробелов подряд. Он всегда будет длиной не менее двух символов.
Ваш вывод должен быть такой же строкой, преобразованной в цвета радуги, как будет описано ниже. Вывод может быть в виде изображения (сохранен в файл или каким-либо другим образом сделан доступным), или он может просто отображать результат на экране (как это делает эталонная реализация ниже).
преобразование
Чтобы определить, каким цветом должна стать каждая буква в строке, используйте следующий алгоритм. Обратите внимание, что каждая буква имеет свой индивидуальный цвет . Это не градиент!
Если этот символ пробел:
- ... это не имеет значения, потому что пространства не могут ... иметь цвет в любом случае. Просто выведите пробел.
Иначе:
Let
i
= индекс этого символа в строке (на основе 0, так что для самой первой буквы это0
), не считая пробелов. Например, в строкеfoo bar
это значение будет4
дляa
. Другими словами, это то, сколько непробелов было встречено до сих пор.Let
n
= количество непробелов в строке.Цвет этой буквы теперь может быть выражен в цилиндрической системе координат HSL как [hue = (
i
/n
) * 360 °, насыщенность = 100%, яркость = 50%].
Обратите внимание, что эти направления подразумевают, что выходные данные для foo
и f oo
должны быть точно такими же, за исключением добавления пробела после f
. То есть все буквы должны сохранять одинаковые цвета.
Дополнительные правила для процесса преобразования описаны ниже, в разделе « Правила ».
Ссылочная реализация
Это написано на JavaScript, и вы можете попробовать его, нажав кнопку «Запустить фрагмент кода».
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;
}
правила
При вычислении значения оттенка буквы вы почти наверняка получите десятичное (нецелое) число. Вы можете округлить это до ближайшего целого числа, поставить пол, взять потолок или просто не округлить вообще.
Размер шрифта должен быть читабельным. Здесь это определяется как размер шрифта 10pt или больше.
Вы можете использовать холст фиксированной ширины или «область рисования» для вывода текста, но он должен уметь соответствовать примеру, приведенному в самом первом предложении этого поста.
Подсчет очков - это код-гольф , поэтому победит самый короткий код в байтах.