AppleSauce Fader

11

Wcześniej wszystkie 1337 dzieci używało suwaków tekstowych w pokojach rozmów. Nie wiem o was, ale chcę czuć się tak, jak oni. Jedyny problem polega na tym, że ich stare skrypty i aplikacje były mocno powiązane z oprogramowaniem, dla którego zostały stworzone, więc nie mogę po prostu korzystać z tej niesamowitej funkcjonalności gdziekolwiek chcę. Chcę też, aby rozwiązanie było łatwe do przenoszenia, więc musisz zminimalizować kod, aby zmieścił się na mojej dyskietce (wolałbym nosić tylko jedną dyskietkę, ale jeśli kod źródłowy jest zbyt duży Mogę nosić więcej niż jeden : P ).

Wejście

  • Lista kolorów (rgb, hex, nazwy itp.)
  • Tekst do sformatowania

Twój program powinien oczekiwać, że lista kolorów będzie zawierać co najmniej 2 kolory.
Tekst do sformatowania może mieć dowolną długość większą niż zero, a znaki będą ograniczone do ascii drukowalnych. (Wskazówka: dłuższe wprowadzanie tekstu może wymagać ponownego użycia kolorów pośrednich dla kolejnych znaków)

Wynik

Tekst wyjściowy nie powinien różnić się od tekstu wejściowego w żaden inny sposób niż czcionka i / lub znaczniki / style (Uwaga: jeśli twój wynik zawiera znaczniki html, musisz kodować dane wejściowe w formacie html). Możesz wyprowadzać tekst ze znacznikami / stylami (tagi stylu HTML, kolory konsoli itp.) Lub obraz wyblakłego tekstu. Wszystkie heksy kolorów powinny być obecne na wydruku, chyba że dane wejściowe nie zawierają wystarczającej liczby znaków, aby spełnić to wymaganie. W takim przypadku zapoznaj się z regułami pierwszeństwa, aby określić, które heksy kolorów powinny być obecne na wydruku. Kolejność lub te kolory na wydruku powinny nadal być kolejnością wprowadzania.

Zasady pierwszeństwa kolorów

  1. W przypadku, gdy na wejściu jest jeden znak, zostanie użyty pierwszy kolor
  2. W przypadku, gdy są tylko dwie postacie, użyty zostanie pierwszy i ostatni kolor
  3. W przypadku, gdy jest więcej niż trzy kolory i więcej kolorów niż znaków, pierwszeństwo mają pierwsze i ostatnie kolory, a następnie pozostałe kolory w kolejności wprowadzania.
  4. W przypadku, gdy znaków jest więcej niż kolorów, postacie powinny przechodzić z jednego koloru do drugiego przy użyciu kolorów pośrednich

Przykłady (odpowiednio zasady pierwszeństwa 1-3):
# Kolory | Kolor 0 | ... | Kolor n | Tekst
3 ff0000 0000ff ffff00 M-> -> ->tylko pierwszy
3 ff0000 0000ff ffff00 hizignoruj ​​2. miejsce
4 ff0000 0000ff ffff00 0fff00 supzignoruj ​​3. miejsce

Aby było jasne, kolor tekstu powinien zanikać z jednego koloru szesnastkowego na drugi. Zanikanie nie musi być idealnie jednolite, ale nie powinno być nagłą zmianą koloru, chyba że nie ma wystarczającej liczby postaci, aby ładnie zaniknąć. Zasadniczo to zanikanie uzyskuje się poprzez wybranie kolorów pośrednich dla każdego ze znaków poprzez zwiększenie / zmniejszenie wartości rgb o pewien przedział określony przez liczbę znaków, z którymi trzeba pracować, oraz różnicę między kolorami. Na przykład, jeśli potrzebujemy jednego koloru pomiędzy czerwony(# ff0000) a czarny(# 000000), możemy wybrać, # 800000ponieważ znajduje się on pośrodku. Optymalna wydajność będzie wyglądać raczej ładnie.

Przykład (reguła pierwszeństwa 4):
3 ff0000 ff7f00 f0ff00 To be or not to be, that is the question...-> -LUB-być albo nie być

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

W odpowiedzi określ sposób wyświetlania wyników (w formacie html, w konsoli, jako obraz itp.).

* Wszystkie czarne tła służą wyłącznie do podkreślenia kolorów i nie są wymagane

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź (w bajtach).
Jeśli uda ci się dodać blaknięcie do poszczególnych postaci, na zawsze będę myśleć, że jesteś fajny (ale nie ma żadnej premii do zdobycia, ponieważ nie będzie to sprawiedliwe dla niektórych języków)

Szturchać
źródło
@LeakyNun W przestrzeni RGB jest wystarczająco blisko, drugą opcją jest # 7f0000.
Neil
Nie całkiem. Spróbuj uśrednić czerwony i zielony w ten sposób i sprawdź, czy zrobisz się żółty. Aby zrobić to we właściwy sposób, zamiast średniej bezpośredniej należy wziąć średnią kwadratową.
Leaky Nun
Średnia 000000i ff0000powinna być b40000( 255*sqrt((0+1)/2))
Leaky Nun
1
@LeakyNun Nigdy nie mówiłem, że potrzebujesz uśrednić kolory. Opisałem łatwą metodę zanikania, która czasami jest stosowana do takich wyzwań. W tym przypadku uśredniliśmy czerwienie dwóch kolorów (i zaokrąglone). Zauważyłem również w wyzwaniu, że zanikanie nie musi być idealnie jednolite. To od Ciebie zależy, jak chcesz zaimplementować to zanikanie.
Poke

Odpowiedzi:

3

JavaScript (ES6), 290 bajtów

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>

Neil
źródło
1
Naprawdę fajnie jest widzieć, jak to się dzieje w czasie rzeczywistym dzięki fragmentowi kodu. : D
AdmBorkBork
1

Pyth, 126 bajtów

Obowiązkowa średnia kwadratowa średnia zamiast bezpośredniej średniej arytmetycznej.

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

Wypróbuj online!

Przykładowe dane wyjściowe:

próba

Leaky Nun
źródło
1

Java, 702 662 znaków

Dwie funkcje gry w golfa:

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]);}

Ponieważ nikt nie może tego przeczytać: oto obie funkcje w wersji bez golfa w klasie:

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]);
    }
}

Tutaj masz górną granicę własnego kodu. Wykorzystanie polega na wywołaniu colorize(lub c w wersji golfowej) i przekazaniu tekstu oraz szeregu kodów kolorów szesnastkowych. Funkcja zwróci ciąg znaków z tagami HTML, podobnie jak OP, dlatego potrzebujesz sposobu na renderowanie HTML.

Algorytm jest łatwiejszy, jak wygląda pytanie. Pierwsza postać zawsze otrzymuje pierwszy kolor, ostatnia zawsze ostatnia. Jeśli w tekście jest więcej kolorów niż znaków, po prostu iterujemy tekst i kolory i stosujemy je. Zabawne jest to, że zanikają: zacząłem od sprawdzenia, w jakiej odległości znajdują się kolory na tekście. Zasadniczo obliczam czerwoną, zieloną i niebieską różnicę między dwoma podanymi kolorami, a następnie dodaję część tej różnicy do pierwszego koloru, w zależności od tego, gdzie znak jest między kolorami. Jeśli pozostawi odstęp dwóch kolorów, zaczynamy od nowego z następnymi dwoma kolorami. Jest to powtarzane dla wszystkich oprócz ostatniego znaku, który, jak wiemy, jest zawsze ostatnim kolorem. Daje to bardzo piękne blaknięcie.

To pytanie było bardzo zabawne! Dzięki!

Aktualizacje

Teraz nie zajmuję się wszystkimi przypadkami specjalnie. Zamiast tego przycinam kolory, jeśli są ich dwa, i stosuję funkcję przenikania do każdego łańcucha. Jeśli będzie więcej kolorów niż tekstu, kolory zostaną przycięte, a funkcja zanikania będzie działać dokładnie jak zwykłe mapowanie.

Frozn
źródło