AppleSauce Fader


11

ย้อนกลับไปในวันนั้นเด็ก 1337 คนทั้งหมดใช้เฟดเดอร์ข้อความในห้องสนทนา ฉันไม่รู้เกี่ยวกับพวกคุณ แต่ฉันต้องการที่จะรู้สึกเท่ห์เหมือนพวกเขา ปัญหาเดียวก็คือสคริปต์และแอปพลิเคชันเก่าของพวกเขาเชื่อมโยงกับซอฟต์แวร์ที่สร้างขึ้นมาอย่างหนักดังนั้นฉันจึงไม่สามารถใช้ฟังก์ชั่นที่น่าทึ่งนี้ได้ทุกที่ที่ฉันต้องการ ฉันต้องการโซลูชันที่สามารถพกพาได้ง่ายดังนั้นคุณจะต้องทำให้โค้ดมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้เพื่อให้มันพอดีกับฟล็อปปี้ดิสก์ของฉัน (ฉันควรจะพกฟล้อปปี้เพียงแผ่นเดียว ฉันสามารถพกพาได้มากกว่าหนึ่ง: P )

อินพุต

  • รายการสี (rgb, hex, ชื่อ ฯลฯ )
  • ข้อความที่จะจัดรูปแบบ

โปรแกรมของคุณควรคาดหวังว่ารายการสีจะมีอย่างน้อย 2 สี
ข้อความที่จัดรูปแบบอาจมีความยาวมากกว่าศูนย์และอักขระจะถูก จำกัด ไว้ที่ ascii ที่พิมพ์ได้ (คำแนะนำ: การป้อนข้อความอีกต่อไปอาจทำให้คุณต้องใช้สีกลางสำหรับตัวอักษรที่ต่อเนื่องกัน)

เอาท์พุต

ข้อความเอาต์พุตไม่ควรแตกต่างจากข้อความอินพุตไม่ว่าด้วยวิธีอื่นใดนอกจากฟอนต์และ / หรือมาร์กอัป / สไตล์ (หมายเหตุ: หากเอาต์พุตของคุณมีมาร์กอัป html ดังนั้นคุณจะต้องเข้ารหัส HTML เป็นอินพุต) คุณสามารถส่งออกข้อความด้วยมาร์กอัป / สไตล์ (แท็กสไตล์ html สีคอนโซล ฯลฯ ) หรือรูปภาพของข้อความจาง ๆ hexes สีทั้งหมดควรมีอยู่ในเอาต์พุตเว้นแต่อินพุตจะไม่มีอักขระเพียงพอที่จะตอบสนองความต้องการนี้ หากเป็นกรณีนี้ให้ศึกษากฎลำดับความสำคัญเพื่อพิจารณาว่าควรใช้ hexes สีใดในผลลัพธ์ของคุณ คำสั่งซื้อหรือสีเหล่านี้ในผลลัพธ์ของคุณควรเป็นคำสั่งซื้อ

กฎลำดับความสำคัญของสี

  1. ในกรณีที่อินพุตเป็นอักขระหนึ่งตัวสีแรกจะถูกนำมาใช้
  2. ในกรณีที่มีเพียงสองตัวอักษรสีแรกและสีสุดท้ายจะถูกนำมาใช้
  3. ในกรณีที่มีมากกว่าสามสีและสีมากกว่าตัวอักษรสีแรกและสีสุดท้ายควรได้รับการจัดลำดับความสำคัญจากนั้นเลือกสีที่เหลือตามลำดับที่ป้อน
  4. ในกรณีที่มีตัวอักษรมากกว่าสีตัวอักษรควรจางหายไปจากสีหนึ่งไปอีกสีหนึ่งโดยใช้สีกลาง

ตัวอย่าง (กฎลำดับความสำคัญ 1-3 ตามลำดับ):
# Colors | สี0 | ... | สีn | ข้อความ
3 ff0000 0000ff ffff00 M-> -> ->ก่อนเท่านั้น
3 ff0000 0000ff ffff00 hiไม่สนใจ 2nd
4 ff0000 0000ff ffff00 0fff00 supไม่สนใจ 3

เพื่อให้ชัดเจนสีข้อความควรจางจาก hex สีหนึ่งไปยังอีก จางไม่จำเป็นต้องเหมือนกันอย่างสมบูรณ์แบบ แต่มันไม่ควรเป็นการเปลี่ยนสีฉับพลันยกเว้นว่ามีตัวละครไม่เพียงพอที่จะจางหายไปอย่างสวยงาม โดยทั่วไปแล้วการจางนี้สามารถทำได้โดยการเลือกสีกลางสำหรับแต่ละอักขระโดยการเพิ่ม / ลดค่า rgb ตามช่วงเวลาที่กำหนดโดยจำนวนอักขระที่คุณต้องใช้งานและความแตกต่างระหว่างสี ตัวอย่างเช่นหากเราต้องการสีเดียวระหว่างสีแดง(# 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
Neil

ไม่ได้จริงๆ ลองเฉลี่ยสีแดงและสีเขียวด้วยวิธีนี้และดูว่าคุณได้สีเหลืองหรือไม่ หากต้องการทำอย่างถูกวิธีให้ใช้รูท - ค่าเฉลี่ย - สี่เหลี่ยมแทนค่าเฉลี่ยโดยตรง
Leun Nun

ค่าเฉลี่ย000000และff0000ควรเป็นb40000( 255*sqrt((0+1)/2))
Leun Nun

1
@LeakyNun ฉันไม่เคยบอกว่าคุณต้องใช้สีเฉลี่ย ฉันอธิบายวิธีการง่าย ๆ ในการซีดจางซึ่งบางครั้งใช้สำหรับความท้าทายเช่นนี้ ในกรณีนี้เราเฉลี่ยค่าสีแดงของสองสี (และปัดเศษ) ฉันยังตั้งข้อสังเกตในความท้าทายที่จางไม่จำเป็นต้องเหมือนกันอย่างสมบูรณ์ มันขึ้นอยู่กับคุณว่าคุณต้องการนำเฟดนี้ไปใช้อย่างไร
Poke

คำตอบ:


3

JavaScript (ES6), 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

Pyth, 126 ไบต์

ภาระผูกพันค่าเฉลี่ยของรูต - ค่าเฉลี่ยกำลังสองแทนค่าเฉลี่ยเลขคณิตโดยตรง

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

ลองออนไลน์!

ตัวอย่างผลลัพธ์:

ตัวอย่าง


1

Java, 702 662 ตัวอักษร

ฟังก์ชั่นสอง golfed:

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(หรือ c ในรุ่น golfed) และผ่านข้อความและอาร์เรย์ของรหัสสีฐานสิบหก ฟังก์ชันจะส่งคืนสตริงพร้อมแท็ก HTML อย่างที่ OP ทำดังนั้นคุณต้องมีวิธีในการแสดง HTML

อัลกอริทึมนั้นง่ายกว่าที่คำถามดูเหมือน อักขระตัวแรกจะได้สีแรกเสมอตัวสุดท้ายจะเป็นสีสุดท้ายเสมอ หากเรามีสีมากกว่าตัวอักษรในตัวอักษรเราก็แค่วนซ้ำตัวอักษรและสีแล้วนำไปใช้ ส่วนที่สนุกคือส่วนที่จางหายไป: ฉันเริ่มด้วยการหาว่าสีอยู่ในข้อความที่อยู่ห่างจากอะไร โดยทั่วไปฉันคำนวณความแตกต่างสีแดงสีเขียวและสีน้ำเงินระหว่างสองสีที่กำหนดแล้วเพิ่มส่วนหนึ่งของความแตกต่างนี้เป็นสีแรกขึ้นอยู่กับว่าถ่านอยู่ระหว่างสีใด หากปล่อยให้ช่วงเวลาของสองสีเราเริ่มจากใหม่ด้วยสองสีถัดไป นี่คือการทำซ้ำสำหรับทุกคนยกเว้นตัวละครตัวสุดท้ายซึ่งเรารู้ว่าเป็นสีสุดท้ายเสมอ นี่ทำให้สีซีดจางมาก

คำถามนั้นสนุกมาก! ขอบคุณ!

อัพเดท

ตอนนี้ฉันไม่ได้จัดการทุกกรณีเป็นพิเศษ ฉันจะตัดแต่งสีถ้ามีสองอย่างมากและใช้ฟังก์ชั่นจางกับทุกสตริง หากมีสีมากกว่าตัวอักษรสีจะถูกตัดแต่งและฟังก์ชั่นการซีดจางจะทำงานเหมือนกับการทำแผนที่อย่างง่าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.