Buradaki zorluk, girdiyi bir metin satırı olarak almak ve bu şekilde basmaktır.
Giriş çıkış
Giriş, yalnızca yazdırılabilir ASCII karakterlerini içeren bir dize olacaktır. İlk veya son karakterler asla boşluk olmaz ve arka arkaya iki boşluk olmaz. Her zaman en az iki karakter uzunluğunda olacak.
Çıktınız, aşağıda açıklanacağı gibi gökkuşağı rengine dönüştürülmüş aynı dize olmalıdır. Çıktı görüntü şeklinde olabilir (bir dosyaya kaydedilir veya bir şekilde kullanılabilir duruma getirilir) veya sonucu ekranda görüntüleyebilir (aşağıdaki referans uygulamasında olduğu gibi).
dönüştürme
Dizedeki her harfin ne renk olması gerektiğini belirlemek için aşağıdaki algoritmayı kullanın. Her harfin kendi rengi olduğuna dikkat edin . Bu bir gradyan değil!
Bu karakter bir boşluk ise:
- ... farketmez, çünkü boşluklar gerçekten ... bir renge sahip olamaz. Basitçe bir boşluk çıkar.
Aksi takdirde:
Let
i
= Bu karakterin indeksi dizgede (0-temelli, yani ilk harf için, bu0
) boşluk sayılmaz. Örneğin, dizedefoo bar
, bu değer olacaktır4
içina
. Başka bir deyişle, şu ana kadar kaç tane boşlukla karşılaşılmamıştı.Let
n
= dizedeki boşlukların sayısı.Bu mektubun rengi şimdi HSL silindirik koordinat sisteminde [ton = (
i
/n
) * 360 °, doygunluk =% 100, hafiflik =% 50] olarak ifade edilebilir.
Not Bu tarifi için çıkış olduğu anlamına olduğu foo
ve f oo
, tam olarak aynı sonra ilave bir alanı için hariç gerekir f
. Yani, tüm harfler aynı renkleri korumalıdır.
Dönüştürme işlemi için daha fazla kural, Kurallarda bölümünde .
Referans uygulaması
Bu JavaScript'te yazılmıştır ve "Kod pasajını çalıştır" düğmesine basarak deneyebilirsiniz.
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;
}
kurallar
Bir harfin Hue değerini hesaplarken, neredeyse kesinlikle bir ondalık (tam sayı olmayan) sayı alırsınız. Bunu en yakın tam sayıya yuvarlayabilir, döşeyebilir, tavana alabilir ya da hiç yuvarlayamazsınız.
Yazı tipi boyutu okunabilir olmalıdır. Burada, bu 10pt boyutunda bir font veya daha büyük olarak tanımlanır.
Metnin çıktısını almak için sabit genişlikte bir tuval veya "çizim alanı" kullanabilirsiniz, ancak bu yazının ilk cümlesinde verilen örneğe uyması gerekir .
Puanlama kod-golf'dür , bu nedenle bayt cinsinden en kısa kod kazanacaktır.