您的挑战是将输入作为一行文本并以这种方式输出。
输入输出
输入将是仅包含可打印ASCII字符的字符串。第一个或最后一个字符永远不会是空格,并且行中永远不会有两个空格。它总是至少两个字符长。
您的输出应为相同的字符串,转换为彩虹色,如下所述。输出可以是图像形式(保存到文件或以其他方式可用),也可以仅在屏幕上显示结果(如下面的参考实现所示)。
转换次数
要确定字符串中的每个字母应变成哪种颜色,请使用以下算法。请注意,每个字母都是其自己的单独颜色。这不是渐变!
如果此字符是空格:
- ...没关系,因为空格无法真正...仍然具有颜色。只需输出一个空格。
除此以外:
令
i=该字符在字符串中的索引(从0开始,因此对于第一个字母为0),不计算空格。例如,在字符串中foo bar,此值将4用于a。换句话说,这就是到目前为止已经遇到了多少个非空格。令
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;
}
规则
计算字母的Hue值时,几乎可以肯定会得到一个十进制(非整数)数字。您可以将其四舍五入为最接近的整数,对其进行下限,采用上限或根本不进行四舍五入。
字体大小必须可读。在此,将其定义为10pt或更大的字体。
您可以使用固定宽度的画布或“绘图区域”来输出文本,但是它必须能够适合本文第一句中给出的示例。
得分是code-golf,因此以字节为单位的最短代码将获胜。




