Gökkuşağı metni oluştur


22

Buradaki zorluk, girdiyi bir metin satırı olarak almak ve bu şekilde basmaktır.

Gökkuşağı resmi

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, bu 0) boşluk sayılmaz. Örneğin, dizede foo bar, bu değer olacaktır 4için a. 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 foove 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 , bu nedenle bayt cinsinden en kısa kod kazanacaktır.


Çıktı bir Veri URI'si olabilir mi? Yani HTML tuval çıktısı var
Downgoat

@vihan Evet, " Çıktı resim biçiminde olabilir (bir dosyaya kaydedilir veya bir şekilde kullanılabilir hale getirilir) " kuralı ile uyumludur .
Doorknob

Bir renklendirmenin teknik özelliği karşılayıp karşılamadığını nasıl belirlersiniz? Bir dilde yalnızca RGB renkleri destekleniyorsa, hangi dönüşüm formülünün kullanılması gerektiğini tam olarak belirtebilir misiniz? Ayrıca, kanal başına kaç bit hassasiyet gereklidir? Muhtemelen 8 tamam olurdu, ama yaklaşık 4 ya da 1?
feersum

@feersum RGB'ye dönüştürmek için bir yerleşik veya burada açıklanan yöntemlerden birini kullanabilirsiniz . İkinci sorunuzla ne demek istediğinizi netleştirebilir misiniz? Bunu özellikle HSL - RGB dönüşümü bağlamında mı yoksa genel olarak mı soruyorsunuz?
Doorknob

2
Dang, PowerShell ile denemeyeceğim bile ... Oynamak için sadece 16 renk alıyorsunuz (ve sıralı bile değiller ... gökkuşağı veya RGB ya da başka türlü ... sadece rastgele bir hex değeri). Resimler ile Referans, Gerçekten harika bir meydan okuma olsa!
AdmBorkBork

Yanıtlar:


12

Perl, 95

İçin 92 bayt kodu + 3 -p

Bu komut dosyası, şu anda yalnızca bu listeden seçilen birkaç renk noktasını içeren terminale (maksimum maksimum 256) sahip olan yaklaşık bir değeri kullanır , bu nedenle belirtmemesi muhtemeldir, ancak yine de eğlenceliydi! Ben yalnızca renkleri göstermek için listeyi süzüldü Sve Ldeğerlerini 100%ve50% ardından renk tonuna göre sıralanmış sırasıyla bir dize içine numaraları paketlenmiş ve bu listeden renkleri seçin.

Bu uygulama yazdırılamayan karakterler içeriyor! Stole @ edc65 sadece değiştirmenin 'ın fikrini \Syerine .basit ama zeki,!

@c=map ord,"..........vR../012.3-'!..9]........"=~/./g;s|\S|\e[38;5;$c[@c*$i++/y/!-~//]m$&|g

HexDump:

0000000: 4063 3d6d 6170 206f 7264 2c22 09c4 cad0  @c=map ord,"....
0000010: d6dc 0be2 be9a 7652 0a2e 2f30 3132 0e33  ......vR../012.3
0000020: 2d27 211b 1539 5d81 a50d c9c8 c7c6 c522  -'!..9]........"
0000030: 3d7e 2f2e 2f67 3b73 7c5c 537c 5c65 5b33  =~/./g;s|\S|\e[3
0000040: 383b 353b 2463 5b40 632a 2469 2b2b 2f79  8;5;$c[@c*$i++/y
0000050: 2f21 2d7e 2f2f 5d6d 2426 7c67            /!-~//]m$&|g

Yukarıdaki metni kopyalayıp çalıştırarak hexdump'ı tersine çevirin:

xxd -r > rainbowtext.pl

verilere yapıştırma ve Ctrl+ ' ya basmaD .

Kullanarak çalıştır:

perl -p rainbowtext.pl <<< 'Your challenge is to take input as a line of text and output it like this.'

Gibi çıktı üretir:

ŞİMDİ TERMİNAL METİNİZ KIRMIZI!  Muhahahaha!


10

Python 2: 240, PIL ve colorsys lib kullanarak

import PIL,colorsys as c
s=input()
u,a=len(s),255
g=Image.new('RGB',(u*6,13),(a,)*3)
[ImageDraw.Draw(g).text((j*6,0),s[j],fill=tuple(int(h*a)for h in c.hls_to_rgb(1.*(j-s[:j].count(' '))/(u-s.count(' ')),.5,1)))for j in range(u)]
g.show()

Örnek çıktı:

Çıktı gökkuşağı metni örneği boşluklarla test

Bazı golf püf noktaları için @agtoever ve @Trang Oul ve boşluk gereksinimlerini belirten @Mauris için teşekkürler.

Gerçek bir yazı tipi eklemek için yazı tipi boyutu denetimi de dahil olmak üzere yatay ofset ve uzunluğa bağlı renk değişimi.

import PIL as P,colorsys as c
s=input()
u=len(s)
a=255
fs=25
f=P.ImageFont.truetype("a.ttf",fs)
sza=f.getsize(s)
oa=f.getoffset(s)
g=P.Image.new('RGB',(sza[0]+fs,2*sza[1]+oa[1]),(a,)*3)
r=fs/4
P.ImageDraw.Draw(g).text((r,0),s,fill=(0,0,0),font=f)
for j in range(u):   
 o=f.getoffset(s[j])
 sz=f.getsize(s[j])   
 r+=o[0]
 P.ImageDraw.Draw(g).text((r,0+fs),s[j],fill=tuple([int(h*a)for h in c.hls_to_rgb(1.*r/sza[0],.5,1)]),font=f)
 r+=sz[0]
g.save('a.png')
g.show()

Kullandığım font buradan edinilebilir : Sonuç: (üst kısım yalnızca dizeyi yazdırmak, alt harf ise harf başına yazdırmaktır):

daktilo


1
Bırak as Pve PILiki kere yaz ve bir karakter kazan. Değişim imgiçin i4 daha fazla karakter kazanıp.
agtoever

1
255Bir değişkene kaydedin , tüm oluşumları değiştirin ve (a,)*3beyaz renk olarak kullanın . Değiştir float(j)tarafından (j+.0).
Trang Oul

1
Ayrıca: değiştirmek float(j)için1.*j
agtoever

1
Aynı anda birden fazla değişken atayın (örneğin u=len(s) a=255=> u,a=len(s),255). Kaldır []gelen parantez tupleonlar ihtiyaç yok. Döngüyü liste kavrayışla değiştirin (yöntem yan etki olarak değerlendirilecektir).
Trang Oul

1
@ willem: Problemin teknik özelliklerine bir göz atın ( Dönüşüm altında ); Programınızın boşluklarla nasıl başa çıkması gerektiğini özellikle açıklar.
Lynn,

5

JavaScript (ES6), 114 117 125

Edit2 3 byte kaydedildi thx @Dom Hastings Geçersiz HTML Düzenle , ancak yine de çalışıyor.

Genel not: snippet'i EcmaScript 6 uyumlu bir tarayıcıda çalıştırma testi (özellikle Chrome, MSIE değil. Firefox'ta test ettim)

F=s=>document.write(s.replace(/\S/g,c=>`<b style=color:hsl(${i++/s.replace(/ /g,'').length*360},100%,50%>`+c,i=0))
<input value='Your challenge is to take input as a line of text and output it like this.' id=I size=100>
<button onclick='F(I.value)'>-></button>


1
Henüz hiçbir tarayıcı tamamen ES6 uyumlu değil. IE henüz tamamen ES5 uyumlu değil!
SuperJedi224

@ SuperJedi224 Katılıyorum. Sadece söylüyorum: Chrome veya MSIE ile denemeyin, Firefox kullanırken çalışır
edc65 21:15

Hiçbir şey söylememem gerektiğini hissediyorum çünkü sadece benimkinin altında benimkendim, ama Firefox'ta hala benim için çalışıyormuş gibi görünen açıklamasından )sonra bunu reddedebilirsin hsl(!
Dom Hastings,

Ayrıca, 2 tane daha tasarruf ${c}'etmek '+ciçin değiştirebilirsin ... Madenle devam etsen iyi olur!
Dom Hastings,

Bu, Safari 9.0'da çalışmaz. c:
Addison Crump

4

Python 3, 131 bayt

Dom Hastings'in cevabına benzeyen ancak python'da uygulanan.

Dize '|\x82\x88\x8ejF"#$%\x1f\x19\x137[\x7f~}'listeden oluşturuldu[124,130,136,142,106,70,34,35,36,37,31,25,19,55,91,127,126,125] halinde sırayla gösterilecek olan terminal renk kodları olarak oluşturulmuştur. Filtrelendiklerinden, yalnızca% 100 doygunluk ve% 50 değerinde renkler içeren renkler içerir. Liste daha sonra sıralandı, böylece ilk önce doğru tonlar gösterildi.

Stdin'den girdi alır ve stdout'a geri döndürür.

Kullanmakta olduğunuz terminaliniz, düzgün çalışması için ANSI çıkış kodlarını desteklemelidir.

x=input();u=u'|\82\88\8ejF"#$%\1f\19\137[\7f~}';j=0
for i in x:print('\033[38;5;%dm%s'%(ord(u[j*18//len(x.replace(" ", ""))]),i),end="");j+=i!=" "

Veya değişmez bayt karakterleri olan kısaltılmış sürüm (Doğru şekilde yapıştırmadım):

x=input();u='|<82><88><8E>jF"#$%^_^Y^S7[^?~}';j=0
for i in x:print('ESC[38;5;%dm%s'%(ord(u[(j*18)//len(x.replace(" ", ""))]),i),end="");j+=i!=" "

Değişmez hexdump:

783d696e70757428293b753d277c82888e6a46222324251f1913375b7f7e7d273b6a3d300a666f72206920696e20783a7072696e7428271b5b33383b353b25646d25732725286f726428755b286a2a3138292f2f6c656e28782e7265706c616365282220222c20222229295d292c69292c656e643d2222293b6a2b3d69213d2220220a

9 bayt'ı kaydettiğiniz için teşekkürler @swstephe (ve ayrıca bayt sayımın her zaman çok az yanlış olduğunu fark etmemi sağladı)!


Neden "\ x82" yerine gerçek karakteri koymuyorsun? Bu dizgiyi bir dosyaya yazdım ve onu ikilik halinde komut dosyama geri okudum. \ 033 değerini ham bir kaçış karakteriyle veya hatta \ 1f (hex) ile değiştirebilirsiniz. "U" ilan eder, sonra sadece bir kere kullanırsın. İfadeye aşağı kaydırarak birkaç karakter kaydedebilirsiniz. Tamsayı bölme için "//" kullanarak int () çağrısından kaçınabilirsiniz.
15’de

Hata! \ 033, \ x1f ile aynı.
15’de

2

PHP, 165 bayt

"S" parametresi olarak girdiyle çalıştır

HTML geçersiz, ancak tüm büyük tarayıcılarda görüntülenmesi gerekiyor (Chrome ve Firefox'ta test edilmiştir)

<?php $n=preg_match_all("/[^ ]/",$q=$_GET['s']);for($i=$j=0;$j<strlen($q);$j++){if(" "!=$s=$q[$j])$i+=360;echo"<a style='color:hsl(".floor($i/$n).",100%,50%)'>".$s;}

1

PHP 4.1, 112 103 102 bayt

Kullandığım @DankMemes' cevabını bir başlangıç noktası olarak. O andan itibaren , kodun farklı olduğu noktaya kadar bir ton değişiklik yaptım .

Uygulama benzer, kod tamamen farklı.

foreach(str_split($s)as$c)echo"<a style=color:hsl(",((" "^$c?$i+=360:$i)/strlen($s))|0,",100%,50%>$c";

Kullanmak için, sadece bir OTURUM / GET / POST / COOKIE üzerine bir isim koyun s.

Bu fonksiyonu çalıştırmanın sonucu, sınama cümlesiyle:

<a style=color:hsl(4,100%,50%>Y<a style=color:hsl(9,100%,50%>o<a style=color:hsl(14,100%,50%>u<a style=color:hsl(19,100%,50%>r<a style=color:hsl(24,100%,50%> <a style=color:hsl(29,100%,50%>c<a style=color:hsl(34,100%,50%>h<a style=color:hsl(38,100%,50%>a<a style=color:hsl(43,100%,50%>l<a style=color:hsl(48,100%,50%>l<a style=color:hsl(53,100%,50%>e<a style=color:hsl(58,100%,50%>n<a style=color:hsl(63,100%,50%>g<a style=color:hsl(68,100%,50%>e<a style=color:hsl(72,100%,50%> <a style=color:hsl(77,100%,50%>i<a style=color:hsl(82,100%,50%>s<a style=color:hsl(87,100%,50%> <a style=color:hsl(92,100%,50%>t<a style=color:hsl(97,100%,50%>o<a style=color:hsl(102,100%,50%> <a style=color:hsl(107,100%,50%>t<a style=color:hsl(111,100%,50%>a<a style=color:hsl(116,100%,50%>k<a style=color:hsl(121,100%,50%>e<a style=color:hsl(126,100%,50%> <a style=color:hsl(131,100%,50%>i<a style=color:hsl(136,100%,50%>n<a style=color:hsl(141,100%,50%>p<a style=color:hsl(145,100%,50%>u<a style=color:hsl(150,100%,50%>t<a style=color:hsl(155,100%,50%> <a style=color:hsl(160,100%,50%>a<a style=color:hsl(165,100%,50%>s<a style=color:hsl(170,100%,50%> <a style=color:hsl(175,100%,50%>a<a style=color:hsl(180,100%,50%> <a style=color:hsl(184,100%,50%>l<a style=color:hsl(189,100%,50%>i<a style=color:hsl(194,100%,50%>n<a style=color:hsl(199,100%,50%>e<a style=color:hsl(204,100%,50%> <a style=color:hsl(209,100%,50%>o<a style=color:hsl(214,100%,50%>f<a style=color:hsl(218,100%,50%> <a style=color:hsl(223,100%,50%>t<a style=color:hsl(228,100%,50%>e<a style=color:hsl(233,100%,50%>x<a style=color:hsl(238,100%,50%>t<a style=color:hsl(243,100%,50%> <a style=color:hsl(248,100%,50%>a<a style=color:hsl(252,100%,50%>n<a style=color:hsl(257,100%,50%>d<a style=color:hsl(262,100%,50%> <a style=color:hsl(267,100%,50%>o<a style=color:hsl(272,100%,50%>u<a style=color:hsl(277,100%,50%>t<a style=color:hsl(282,100%,50%>p<a style=color:hsl(287,100%,50%>u<a style=color:hsl(291,100%,50%>t<a style=color:hsl(296,100%,50%> <a style=color:hsl(301,100%,50%>i<a style=color:hsl(306,100%,50%>t<a style=color:hsl(311,100%,50%> <a style=color:hsl(316,100%,50%>l<a style=color:hsl(321,100%,50%>i<a style=color:hsl(325,100%,50%>k<a style=color:hsl(330,100%,50%>e<a style=color:hsl(335,100%,50%> <a style=color:hsl(340,100%,50%>t<a style=color:hsl(345,100%,50%>h<a style=color:hsl(350,100%,50%>i<a style=color:hsl(355,100%,50%>s<a style=color:hsl(360,100%,50%>. 

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.