あなたの課題は、入力をテキスト行として取得し、次のように出力することです。
入出力
入力は、印刷可能なASCII文字のみを含む文字列になります。最初または最後の文字がスペースになることはありません。また、2つのスペースが連続することはありません。常に少なくとも2文字の長さになります。
出力は、以下で説明するように、虹色に変換された同じ文字列である必要があります。出力は画像形式(ファイルに保存されるか、何らかの方法で利用可能になったもの)である場合もあれば、単に画面に結果を表示する場合もあります(以下の参照実装のように)。
変換
文字列の各文字が何色になるかを判断するには、次のアルゴリズムを使用します。各文字は、独自の個別の色であることに注意してください。これは勾配ではありません!
この文字がスペースの場合:
- ...スペースは実際にはできないので、それは問題ではありません...とにかく色を持っています。単にスペースを出力します。
さもないと:
Let
i=文字列内のこの文字のインデックス(0から始まるため、最初の文字の場合、これは0)で、スペースはカウントしません。例えば、文字列でfoo bar、この値は次のようになります4ためa。つまり、これは、これまでに検出された非スペースの数です。Let
n=文字列内の非スペースの数。この文字の色は、HSL円筒座標系で、[色相=(
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;
}
ルール
文字の色相値を計算すると、ほぼ確実に10進数(非整数)が取得されます。これを最も近い整数に丸めるか、床に乗せるか、天井を取るか、まったく丸めないことができます。
フォントサイズは読み取り可能である必要があります。ここでは、これは10ptサイズ以上のフォントとして定義されています。
固定幅のキャンバスまたは「描画領域」を使用してテキストを出力できますが、この投稿の最初の文に記載されている例に適合する必要があります。
スコアリングはcode-golfであるため、バイト単位の最短コードが優先されます。




