इंद्रधनुष पाठ बनाएँ


22

आपकी चुनौती इनपुट को पाठ की एक पंक्ति के रूप में लेना है और इसे इस तरह से आउटपुट करना है।

इंद्रधनुष की छवि

इनपुट आउटपुट

इनपुट एक स्ट्रिंग होगा जिसमें केवल मुद्रण योग्य ASCII वर्ण होते हैं। पहले या अंतिम वर्ण कभी रिक्त स्थान नहीं होंगे, और एक पंक्ति में दो स्थान कभी नहीं होंगे। यह हमेशा कम से कम दो अक्षर लंबा होगा।

आपका आउटपुट एक ही स्ट्रिंग होना चाहिए, इंद्रधनुष के रंगों में परिवर्तित हो जाएगा जैसा कि नीचे वर्णित किया जाएगा। आउटपुट छवि के रूप में हो सकता है (किसी फ़ाइल में सहेजा गया है या किसी तरह अन्यथा उपलब्ध कराया गया है), या यह बस स्क्रीन पर परिणाम प्रदर्शित कर सकता है (जैसा कि नीचे संदर्भ कार्यान्वयन करता है)।

रूपांतरण

यह निर्धारित करने के लिए कि स्ट्रिंग के प्रत्येक अक्षर को किस रंग का होना चाहिए, निम्न एल्गोरिथम का उपयोग करें। ध्यान दें कि प्रत्येक अक्षर का अपना अलग रंग होता हैयह एक ढाल नहीं है!

  • यदि यह वर्ण एक स्थान है:

    • ... यह कोई फर्क नहीं पड़ता, क्योंकि रिक्त स्थान वास्तव में नहीं हो सकता ... वैसे भी एक रंग है। बस एक जगह उत्पादन।
  • अन्यथा:

    • Let i= स्ट्रिंग में इस चरित्र का सूचकांक (0-आधारित, इसलिए पहले अक्षर के लिए, यह है 0), रिक्त स्थान की गणना नहीं। उदाहरण के लिए, स्ट्रिंग में foo bar, यह मान होगा 4के लिए a। दूसरे शब्दों में, यह है कि अब तक कितने गैर रिक्त स्थान का सामना किया गया है।

    • आज्ञा देना n= स्ट्रिंग में गैर-रिक्त स्थान की संख्या।

    • इस पत्र का रंग अब एचएसएल बेलनाकार-समन्वय प्रणाली में व्यक्त किया जा सकता है , [hue = ( i/ n) * 360 °, संतृप्ति = 100%, लपट = 50%] के रूप में।

नोट इन निर्देशों का मतलब है कि उस के लिए उत्पादन fooऔर f oo, ठीक वही होना चाहिए के बाद एक अतिरिक्त अंतरिक्ष के लिए छोड़कर f। यही है, सभी अक्षरों को समान रंगों को बनाए रखना चाहिए।

रूपांतरण की प्रक्रिया के लिए इसके अलावा नियम नीचे वर्णित हैं, में नियम अनुभाग।

संदर्भ कार्यान्वयन

यह जावास्क्रिप्ट में लिखा गया है, और आप इसे "रन कोड स्निपेट" बटन दबाकर आज़मा सकते हैं।

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 आकार के फ़ॉन्ट या अधिक के रूप में परिभाषित किया गया है।

  • आप पाठ को आउटपुट करने के लिए एक निश्चित-चौड़ाई के कैनवास या "ड्राइंग क्षेत्र" का उपयोग कर सकते हैं, लेकिन यह इस पोस्ट के पहले वाक्य में दिए गए उदाहरण को फिट करने में सक्षम होना चाहिए।

  • स्कोरिंग , इसलिए बाइट्स में सबसे छोटा कोड जीत जाएगा।


क्या आउटपुट डेटा URI हो सकता है? यह एचटीएमएल कैनवास से आउटपुट है
डाउनगोट

@vihan हाँ, कि " छवि के रूप में आउटपुट हो सकता है (किसी फ़ाइल में सहेजा गया है या किसी तरह अन्यथा उपलब्ध कराया गया है) " नियम के अनुसार।
दरवाज़े

आप यह कैसे निर्धारित करते हैं कि एक रंग कल्पना से मिलता है? क्या आप ठीक से निर्दिष्ट कर सकते हैं कि यदि किसी भाषा में केवल RGB रंगों का समर्थन किया जाता है, तो किस रूपांतरण सूत्र का उपयोग करना चाहिए? इसके अलावा, प्रति चैनल परिशुद्धता के कितने बिट्स आवश्यक हैं? शायद 8 ठीक होगा, लेकिन कैसे 4, या 1 के बारे में?
feersum

@ फ़ेर्सम आरजीबी में बदलने के लिए, आप एक बिलिन या यहाँ वर्णित विधियों में से एक का उपयोग कर सकते हैं । क्या आप स्पष्ट कर सकते हैं कि आपके दूसरे प्रश्न का क्या मतलब है? क्या आप इसके बारे में विशेष रूप से एचएसएल से आरजीबी रूपांतरण, या सामान्य रूप से पूछ रहे हैं?
दरवाज़े

2
डांग, मैं पॉवरशेल के साथ भी कोशिश नहीं करने जा रहा हूं ... आपको केवल 16 रंगों के साथ खेलने के लिए मिलता है (और वे आदेश भी नहीं हैं ... इंद्रधनुष या आरजीबी या अन्यथा ... बस एक मनमाना हेक्स मूल्य)। संदर्भ, वास्तव में शांत चुनौती के साथ, हालांकि!
AdmBorkBork

जवाबों:


12

पर्ल, 95

92 बाइट्स कोड + 3 के लिए -p

यह स्क्रिप्ट वर्तमान में केवल इस सूची से चुने गए कुछ रंग बिंदुओं सहित टर्मिनल (256 अधिकतम) के लिए उपलब्ध रंगों के एक सन्निकटन का उपयोग करती है , इसलिए यह अनुमान लगाने की संभावना नहीं है, लेकिन यह वैसे भी मजेदार था! मैं केवल के साथ रंग दिखाने के लिए सूची फ़िल्टर किया Sऔर Lके मूल्यों 100%और 50%क्रमशः, तो रंग के अनुसार क्रमबद्ध, एक स्ट्रिंग में संख्या बाँधा और उस सूची से रंग का चयन करें।

इस कार्यान्वयन में गैर-मुद्रण योग्य वर्ण शामिल हैं! चुराया @ edc65 के विचार के \Sबजाय केवल ., सरल, लेकिन चतुर की जगह!

@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

उपरोक्त पाठ की प्रतिलिपि बनाकर और चलकर षोड्शप को उल्टा करें:

xxd -r > rainbowtext.pl

डेटा में चिपकाना और दबाना Ctrl+ D

रन का उपयोग करें:

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

यह उत्पादन की तरह:

अब आपका मूल पाठ लाल है!  MUHAHAHAHA!


10

पायथन 2: 240 पीआईएल का उपयोग कर और लिबास को कलर्ड करता है

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()

उदाहरण आउटपुट:

आउटपुट इंद्रधनुष पाठ उदाहरण रिक्त स्थान के साथ परीक्षण करें

कुछ गोल्फिंग टिप्स के लिए @agtoever और @Trang Oul का धन्यवाद, और @Mauris के लिए रिक्त स्थान की आवश्यकता को इंगित करने के लिए।

सही प्रकार के फोंट जोड़ने के लिए, लंबाई के आधार पर क्षैतिज ऑफसेट और रंग परिवर्तन सहित फ़ॉन्ट आकार नियंत्रण।

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()

मेरे द्वारा उपयोग किया गया फ़ॉन्ट यहाँ से उपलब्ध है : परिणाम यह है (शीर्ष केवल स्ट्रिंग को प्रिंट कर रहा है, नीचे एक अक्षर प्रति मुद्रण है):

टाइपराइटर


1
ड्रॉप करें as Pऔर PILदो बार लिखें और एक चरित्र जीतें। 4 और वर्णों imgको बदलें iऔर जीतें।
agtoever

1
255एक चर के लिए सहेजें , सभी महासागरों को बदलें और (a,)*3सफेद रंग के रूप में उपयोग करें । float(j)द्वारा प्रतिस्थापित करें (j+.0)
ट्रांग ओउल

1
इसके अलावा: की जगह float(j)के लिए1.*j
agtoever

1
एक साथ कई चर निर्दिष्ट करें (जैसे u=len(s) a=255=> u,a=len(s),255)। []कोष्ठक निकालें tuple, उनकी आवश्यकता नहीं है। सूची समझ से पाश को बदलें (विधि का एक साइड इफेक्ट के रूप में मूल्यांकन किया जाएगा)।
ट्रांग ओउल

1
@ विलेम: समस्या विनिर्देश ( रूपांतरण के तहत ) पर एक नज़र डालें ; यह विशेष रूप से बताता है कि आपके प्रोग्राम को रिक्त स्थान कैसे संभालना चाहिए।
लिन

5

जावास्क्रिप्ट (ईएस 6), 114 117 125

Edit2 3 बाइट ने thx को बचाया @Dom Hastings ने अवैध HTML संपादित किया , लेकिन वैसे भी काम कर रहा था।

सामान्य नोट: एक EcmaScript 6 अनुरूप ब्राउज़र पर स्निपेट चलाने का परीक्षण (विशेष रूप से क्रोम नहीं MSIE। मैंने फ़ायरफ़ॉक्स के साथ परीक्षण किया है)।

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
कोई भी ब्राउज़र पूरी तरह से ES6 अनुरूप नहीं है , फिर भी। IE अभी भी पूरी तरह से ES5 शिकायत नहीं है!
SuperJedi224

@ SuperJedi224 मैं सहमत हूं। मैं सिर्फ इतना कह रहा हूं: फ़ायरफ़ॉक्स का उपयोग करते समय इसे क्रोम या MSIE के साथ आज़माएं नहीं
edc65

मुझे ऐसा लगता है कि मुझे भी कुछ नहीं कहना चाहिए क्योंकि मैं सिर्फ तुम्हारे नीचे ही मिला हूं, लेकिन मुझे लगता है कि तुम )अपनी hsl(घोषणा के बाद इसे छोड़ सकते हो जैसा कि अभी भी फ़ायरफ़ॉक्स में मेरे लिए काम करता है!
डोम हेस्टिंग्स

इसके अलावा, आप 2 और बचाने के ${c}'लिए बदल सकते हैं '+c... बेहतर मेरा साथ वापस ले लें!
डोम हेस्टिंग्स

यह सफारी 9.0 पर काम नहीं करता है। c:
Addison Crump

4

पायथन 3, 131 बाइट्स

डोम हेस्टिंग्स के जवाब पर सिम्युलर लेकिन अजगर में लागू किया गया।

स्ट्रिंग '|\x82\x88\x8ejF"#$%\x1f\x19\x137[\x7f~}'को सूची के रूप में बनाया गया था[124,130,136,142,106,70,34,35,36,37,31,25,19,55,91,127,126,125] क्रम में प्रदर्शित करने के लिए टर्मिनल रंग कोड है। उन्हें फ़िल्टर्ड किया गया है ताकि वे केवल संतृप्ति 100% और मूल्य 50% वाले रंग शामिल करें। तब सूची को क्रमबद्ध किया गया था, इसलिए पहले सही hues प्रदर्शित किए गए थे।

स्टडिन से इनपुट लेता है और स्टैडआउट को लौटाता है।

आपका टर्मिनल जिसे आप ठीक से चलाने के लिए MSI समर्थन ANSI एस्केप कोड का उपयोग कर रहे हैं।

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!=" "

या शाब्दिक बाइट पात्रों के साथ छोटा संस्करण (ठीक से पेस्ट नहीं किया गया):

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!=" "

शाब्दिक हेक्सडम्प:

783d696e70757428293b753d277c82888e6a46222324251f1913375b7f7e7d273b6a3d300a666f72206920696e20783a7072696e7428271b5b33383b353b25646d25732725286f726428755b286a2a3138292f2f6c656e28782e7265706c616365282220222c20222229295d292c69292c656e643d2222293b6a2b3d69213d2220220a

9 बाइट्स बचाने के लिए @swstephe धन्यवाद (और मुझे यह भी ध्यान रहे कि मेरी बाइट गिनती कभी बहुत गलत थी)!


वास्तविक चरित्र के साथ "\ x82" को क्यों न बदलें? मैंने उस स्ट्रिंग को एक फाइल में लिखा और उसे वापस बाइनरी में मेरी स्क्रिप्ट में पढ़ा। आप कच्चे बच चरित्र, या यहां तक ​​कि \ 1f (हेक्स) के साथ \ 033 बदल सकते हैं। आप "यू" की घोषणा करते हैं, तो केवल एक बार इसका उपयोग करें। आप इसे अभिव्यक्ति में नीचे ले जाकर कुछ पात्रों को बचा सकते हैं। पूर्णांक विभाजन के लिए आप "//" का उपयोग करके int () कॉल से बच सकते हैं।

ओह, \ 033 \ X1f के समान है।
स्वस्तिक

2

PHP, 165 बाइट्स

इनपुट "पैरामीटर" के रूप में चलाएं

HTML अमान्य है, लेकिन इसे सभी प्रमुख ब्राउज़रों (क्रोम और फ़ायरफ़ॉक्स में परीक्षण) में प्रस्तुत करना चाहिए

<?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 बाइट्स

मैंने @DankMemes के उत्तर का उपयोग प्रारंभिक बिंदु के रूप में किया है। वहाँ से, मैं एक को क्रियान्वित किया है टन का कहना है कि कोड अलग है, परिवर्तन की।

कार्यान्वयन समान है, कोड पूरी तरह से अलग है।

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

इसका उपयोग करने के लिए, बस नाम के साथ SESSION / GET / POST / COOKIE पर एक मूल्य निर्धारित करें s

परीक्षण वाक्य पर इस फ़ंक्शन को चलाने का परिणाम:

<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%>. 

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.