AppleSauce Fader


11

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

इनपुट

  • रंगों की एक सूची (आरजीबी, हेक्स, नाम, आदि)
  • प्रारूप करने के लिए पाठ

आपके प्रोग्राम को रंगों की सूची में कम से कम 2 रंगों की अपेक्षा करनी चाहिए।
प्रारूप को पाठ शून्य से अधिक किसी भी लम्बाई का हो सकता है और वर्ण मुद्रण योग्य एएससीआई तक सीमित होंगे। (संकेत: लंबे पाठ इनपुट आपको निरंतर वर्णों के लिए मध्यवर्ती रंगों का पुन: उपयोग करने की आवश्यकता हो सकती है)

उत्पादन

आउटपुट टेक्स्ट फॉन्ट और / या मार्कअप / स्टाइल के अलावा किसी भी तरह से इनपुट टेक्स्ट से अलग नहीं होना चाहिए (नोट: यदि आपके आउटपुट में html मार्कअप है तो आपको html को इनपुट को एनकोड करना होगा)। आप मार्कअप / स्टाइलिंग (HTML स्टाइल टैग, कंसोल कलर्स इत्यादि) या फीके टेक्स्ट की तस्वीर के साथ टेक्स्ट आउटपुट कर सकते हैं। सभी रंग हेक्सेस आउटपुट में मौजूद होना चाहिए जब तक कि इनपुट में इस आवश्यकता को पूरा करने के लिए पर्याप्त वर्ण न हों। यदि यह मामला है, तो यह निर्धारित करने के लिए प्राथमिकता के नियमों से परामर्श करें कि आपके आउटपुट में कौन से रंग के हेक्स मौजूद होने चाहिए। आपके आउटपुट में ऑर्डर या ये रंग अभी भी इनपुट ऑर्डर होना चाहिए।

रंग प्राथमिकता नियम

  1. इस घटना में कि इनपुट एक वर्ण है, पहले रंग का उपयोग किया जाएगा
  2. इस घटना में कि केवल दो वर्ण हैं, पहले और अंतिम रंग का उपयोग किया जाएगा
  3. इस घटना में कि पात्रों की तुलना में तीन से अधिक रंग और अधिक रंग हैं, पहले और आखिरी रंगों को प्राथमिकता दी जानी चाहिए, फिर बाकी रंगों को उनके इनपुट क्रम में।
  4. इस घटना में कि रंगों की तुलना में अधिक वर्ण हैं, वर्णों को मध्यवर्ती रंगों का उपयोग करके एक रंग से दूसरे रंग में फीका होना चाहिए

उदाहरण (प्राथमिकता नियम क्रमशः 1-3):
# रंग | रंग 0 | ... | रंग एन | पाठ
3 ff0000 0000ff ffff00 M-> -> ->केवल पहले
3 ff0000 0000ff ffff00 hi2 पर ध्यान न दें
4 ff0000 0000ff ffff00 0fff00 supअनदेखा ३

स्पष्ट होने के लिए, पाठ का रंग एक रंग के हेक्स से अगले तक फीका होना चाहिए। फीका पूरी तरह से समान होना जरूरी नहीं है, लेकिन यह एक अचानक रंग परिवर्तन नहीं होना चाहिए जब तक कि अच्छी तरह से फीका करने के लिए पर्याप्त वर्ण न हों। आम तौर पर यह फीका प्रत्येक वर्ण के लिए मध्यवर्ती रंगों का चयन करके प्राप्त किया जाता है। आरजीबी मूल्यों को बढ़ाकर / घटाकर कुछ अंतरालों द्वारा निर्धारित किया जाता है, जिन्हें आपके द्वारा काम किए जाने वाले वर्णों और रंगों के बीच के अंतर से निर्धारित किया जाता है। उदाहरण के लिए यदि हमें लाल(# ff0000) और काली(# 000000) के बीच एक ही रंग की आवश्यकता है , तो हम चुन सकते हैं # 800000क्योंकि यह बीच में सही बैठता है। इष्टतम उत्पादन बल्कि सुंदर दिखेगा।

उदाहरण (प्राथमिकता नियम 4):
3 ff0000 ff7f00 f0ff00 To be or not to be, that is the question...-> -OR-होना या न होना

<span style="color:#ff0000;">T</span><span style="color:#ff0600;">o</span><span style="color:#ff0c00;"> </span><span style="color:#ff1200;">b</span><span style="color:#ff1800;">e</span><span style="color:#ff1e00;"> </span><span style="color:#ff2400;">o</span><span style="color:#ff2a00;">r</span><span style="color:#ff3000;"> </span><span style="color:#ff3600;">n</span><span style="color:#ff3c00;">o</span><span style="color:#ff4300;">t</span><span style="color:#ff4900;"> </span><span style="color:#ff4f00;">t</span><span style="color:#ff5500;">o</span><span style="color:#ff5b00;"> </span><span style="color:#ff6100;">b</span><span style="color:#ff6700;">e</span><span style="color:#ff6d00;">,</span><span style="color:#ff7300;"> </span><span style="color:#ff7900;">t</span><span style="color:#ff7f00;">h</span><span style="color:#fe8500;">a</span><span style="color:#fe8b00;">t</span><span style="color:#fd9100;"> </span><span style="color:#fc9700;">i</span><span style="color:#fb9d00;">s</span><span style="color:#fba400;"> </span><span style="color:#faaa00;">t</span><span style="color:#f9b000;">h</span><span style="color:#f9b600;">e</span><span style="color:#f8bc00;"> </span><span style="color:#f7c200;">q</span><span style="color:#f6c800;">u</span><span style="color:#f6ce00;">e</span><span style="color:#f5d400;">s</span><span style="color:#f4da00;">t</span><span style="color:#f4e100;">i</span><span style="color:#f3e700;">o</span><span style="color:#f2ed00;">n</span><span style="color:#f1f300;">.</span><span style="color:#f1f900;">.</span><span style="color:#f0ff00;">.</span> 

अपने उत्तर में कृपया निर्दिष्ट करें कि आपका आउटपुट कैसे प्रदर्शित होना चाहिए (HTML के रूप में, कंसोल में, छवि के रूप में, आदि)।

* सभी काले रंग की पृष्ठभूमि केवल रंग जोर के लिए होती है और इसकी आवश्यकता नहीं होती है

स्कोरिंग

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



@LeakyNun RGB स्पेस में यह पर्याप्त है, दूसरा विकल्प # 7f0000 है।
नील

ज़रुरी नहीं। इस तरह से लाल और हरे रंग को औसत करने की कोशिश करें और देखें कि क्या आप पीले हो जाते हैं। इसे सही तरीके से करने के लिए, प्रत्यक्ष औसत के बजाय रूट-मीन-स्क्वायर लें।
लीक नून

का औसत 000000और ff0000होना चाहिए b40000( 255*sqrt((0+1)/2))
लीकी नून

1
@LeakyNun मैंने कभी नहीं कहा कि आपको रंगों को औसत करने की आवश्यकता है। मैंने लुप्त होती की एक आसान विधि का वर्णन किया जो कभी-कभी इस तरह की चुनौतियों के लिए नियोजित होती है। इस मामले में हमने दो रंगों (और गोल) के लाल औसत किए। मैंने इस चुनौती पर भी ध्यान दिया कि फीका पूरी तरह से समान नहीं होना चाहिए। यह आपके ऊपर है कि आप इस फीके को कैसे लागू करना चाहते हैं।
प्रहार

जवाबों:


3

जावास्क्रिप्ट (ईएस 6), 290 बाइट्स

h=a=>f(a,a.shift());f=
(a,w)=>[...w].map((c,i)=>{l=w.length-1;m=a.length-1;s=o.appendChild(document.createElement('span'));s.textContent=c;s.style.color=`#${i?i-l?a[r=l%m,n=l/m|0,i<r*n+r?++n:i-=r,k=i/n|0,k++].replace(/./g,(c,d)=>((parseInt(c,16)*(n-i%n)+i%n*parseInt(a[k][d],16))/n|0).toString(16)):a[m]:a[0]}`;})
<textarea rows=10 cols=40 oninput="o.textContent='';h(this.value.split`\n`)">Type the text here and the colours on subsequent lines.
FF0000
00FF00
0000FF</textarea><div id=o>


1
यह वास्तव में कोड स्निपेट के साथ वास्तविक समय में देखने के लिए अच्छा है। : D
AdmBorkBork

1

पायथ, 126 बाइट्स

प्रत्यक्ष अंकगणितीय माध्य के बजाय अप्रचलित मूल-माध्य-वर्ग औसत।

L%"<span style=\"color:#%s\">%s</span>",smt.H+256s*255@d2ebhbMm+hG*-eGhGcdHH=Q^RL2Q+smsyMC,hdCgRlhdCedC,ctlQPzC,QtQy,ez?tlzeQh

इसे ऑनलाइन आज़माएं!

नमूना उत्पादन:

नमूना


1

जावा, 702 662 अक्षर

दो कार्य गोल्फ:

import java.awt.*;String f(Color C,char c){return"<span style=\"color:#"+Integer.toHexString(C.getRGB()).substring(2)+";\">"+c+"</span>";}String c(String t,String[]h){String r="";int l=h.length,e=t.length(),i=0,s=0,g=1,c=-1,p,q,u;double d,m=0,v;char[]T=t.toCharArray();Color C[]=new Color[l],H[],a,b;for(;i<l;)C[i]=Color.decode(h[i++]);if(l>e){H=java.util.Arrays.copyOfRange(C,0,e);H[e-1]=C[l-1];H[0]=C[0];C=H;l=e;}d=--e/(l-1.);for(;++c<e;){a=C[s];b=C[g];p=b.getRed()-a.getRed();q=b.getGreen()-a.getGreen();u=b.getBlue()-a.getBlue();v=m/d;r+=f(new Color(a.getRGB()+((int)(v*p)<<16|(int)(v*q)<<8|(int)(v*u))),T[c]);if(++m>d){m-=d;s=g++;}}return r+f(C[l-1],T[e]);}

जैसा कि कोई भी इसे नहीं पढ़ सकता है: यहां दोनों कार्य एक वर्ग में असंगठित संस्करण में हैं:

import java.awt.*;

public class Q80554 {

    static String format(Color color, char character) {
        return "<span style=\"color:#" + Integer.toHexString(color.getRGB()).substring(2) + ";\">" + character + "</span>";
    }

    static String colorizeB(String text, String[] hexColors) {
        String result = "";
        int colorsLength = hexColors.length, textLength = text.length(), i, currentStartColorPos = 0, currentGoalColorPos = 1, currentCharPos = -1, diffColorRed, diffColorGreen, diffColorBlue;
        double difference, goneDifference = 0, relativeChange;
        char[] textArray = text.toCharArray();
        Color colors[] = new Color[colorsLength], changer[], currentStartColor, currentGoalColor;

        for (i = 0; i < colorsLength;)
            colors[i] = Color.decode(hexColors[i++]);

        if (colorsLength > textLength) {
            changer = Arrays.copyOfRange(colors, 0, textLength);
            changer[textLength - 1] = colors[colorsLength - 1];
            changer[0] = colors[0];

            colors = changer;
            colorsLength = textLength;
        }

        // fade
        difference = --textLength / (colorsLength - 1.); // space between colors    

        for (; ++currentCharPos < textLength;) {
            currentStartColor = colors[currentStartColorPos];
            currentGoalColor = colors[currentGoalColorPos];

            diffColorRed = currentGoalColor.getRed() - currentStartColor.getRed();
            diffColorGreen = currentGoalColor.getGreen() - currentStartColor.getGreen();
            diffColorBlue = currentGoalColor.getBlue() - currentStartColor.getBlue();

            relativeChange = goneDifference / difference;

            result += format(new Color(currentStartColor.getRGB() + ((int) (relativeChange * diffColorRed) << 16 | (int) (relativeChange * diffColorGreen) << 8 | (int) (relativeChange * diffColorBlue))), textArray[currentCharPos]);

            if (++goneDifference > difference) {
                goneDifference -= difference;
                currentStartColorPos = currentGoalColorPos++;                   
            }
        }

        // last character always has last color
        return result + format(colors[colorsLength - 1], textArray[textLength]);
    }
}

यहां आपके पास अपने कोड के लिए एक ऊपरी सीमा है। उपयोग कॉलिंग colorize(या गोल्फ संस्करण में ग) और पाठ और हेक्स रंग कोड की एक सरणी से गुजरती है। फ़ंक्शन HTML-टैग के साथ एक स्ट्रिंग लौटाएगा जैसे ओपी ने किया, इस प्रकार आपको HTML को प्रस्तुत करने के लिए कुछ तरीके की आवश्यकता है।

प्रश्न जैसा दिखता है, एल्गोरिथ्म आसान है। पहले वर्ण को हमेशा पहला रंग मिलता है, अंतिम को हमेशा अंतिम। यदि हमारे पास पाठ में वर्णों की तुलना में अधिक रंग हैं तो हम केवल पाठ और रंगों पर पुनरावृति करते हैं और इन्हें लागू करते हैं। मज़ेदार भाग फ़ेड्स के साथ एक है: मैंने यह पता लगाने से शुरू किया कि पाठ पर रंग कितनी दूरी पर हैं। मैं मूल रूप से दो दिए गए रंगों के बीच लाल, हरे और नीले रंग के अंतर की गणना करता हूं और फिर इस अंतर का एक हिस्सा पहले रंग में जोड़ देता हूं, जो इस बात पर निर्भर करता है कि रंगों के बीच चार कहां है। यदि यह दो रंगों के अंतराल को छोड़ देता है तो हम अगले दो रंगों के साथ नए से शुरू करते हैं। यह सभी के लिए दोहराया जाता है लेकिन अंतिम चरित्र, जिसे हम जानते हैं कि हमेशा अंतिम रंग होता है। यह बहुत सुंदर लुप्त होती है।

यह सवाल बहुत मजेदार था! धन्यवाद!

अपडेट

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

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