Fader de AppleSauce

11

En el pasado, todos los 1337 niños usaban faders de texto en las salas de chat. No sé ustedes, pero quiero sentirme genial como ellos. El único problema es que sus antiguos scripts y aplicaciones estaban fuertemente acoplados al software para el que fueron creados, por lo que no puedo utilizar esta increíble funcionalidad donde quiera. También quiero que la solución sea fácilmente portátil, por lo que tendrá que hacer que el código sea lo más pequeño posible para que quepa en mi disquete (prefiero solo llevar un disquete, pero si su código fuente es demasiado grande) Puedo llevar más de uno : P ).

Entrada

  • Una lista de colores (rgb, hexadecimal, nombres, etc.)
  • Texto a formatear

Su programa debe esperar que la lista de colores contenga al menos 2 colores.
El texto a formatear puede tener cualquier longitud mayor que cero y los caracteres se limitarán a ascii imprimibles. (Sugerencia: las entradas de texto más largas pueden requerir que reutilice colores intermedios para caracteres consecutivos)

Salida

El texto de salida no debe diferir del texto de entrada de ninguna otra manera que no sea la fuente y / o el marcado / estilo (Nota: si su salida contiene marcado html, entonces necesitará codificar html en la entrada). Puede generar texto con marcado / estilo (etiquetas de estilo html, colores de consola, etc.) o una imagen del texto desvanecido. Todos los hexágonos de color deben estar presentes en la salida a menos que la entrada no contenga suficientes caracteres para cumplir este requisito. Si este es el caso, consulte las reglas de prioridad para determinar qué hexágonos de color deben estar presentes en su salida. El orden o estos colores en su salida aún deben ser orden de entrada.

Reglas de prioridad de color

  1. En el caso de que la entrada sea un carácter, se utilizará el primer color.
  2. En el caso de que solo haya dos caracteres, se utilizará el primer y el último color.
  3. En el caso de que haya más de tres colores y más colores que caracteres, se deben priorizar el primer y el último color, luego el resto de los colores en el orden ingresado.
  4. En el caso de que haya más caracteres que colores, los caracteres deberían desvanecerse de un color a otro utilizando colores intermedios.

Ejemplos (Reglas de prioridad 1-3 respectivamente):
# Colores | Color 0 | ... | Color n | Texto
3 ff0000 0000ff ffff00 M-> -> ->solo primero
3 ff0000 0000ff ffff00 hiignorar 2do
4 ff0000 0000ff ffff00 0fff00 supignorar tercero

Para que quede claro, el color del texto debe desvanecerse de un hexágono de color al siguiente. El desvanecimiento no tiene que ser perfectamente uniforme, pero no debería ser un cambio de color abrupto a menos que no haya suficientes caracteres para desvanecerse bien. En general, este desvanecimiento se logra eligiendo colores intermedios para cada uno de los caracteres incrementando / decrementando los valores rgb en un intervalo determinado por el número de caracteres con los que tiene que trabajar y la diferencia entre los colores. Por ejemplo, si necesitáramos un solo color entre rojo(# ff0000) y negro(# 000000), podríamos elegir # 800000ya que se encuentra justo en el medio. La salida óptima se verá bastante bonita.

Ejemplo (regla de prioridad 4):
3 ff0000 ff7f00 f0ff00 To be or not to be, that is the question...-> -O BIEN-ser o no

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

En su respuesta, especifique cómo se debe mostrar su salida (como html, en una consola, como una imagen, etc.).

* Todos los fondos negros son solo para enfatizar el color y no son obligatorios

Puntuación

Este es el , por lo que gana la respuesta más corta (en bytes).
Si logras agregar desvanecimiento a los personajes individuales, siempre pensaré que eres genial (pero no hay bonificación para anotar, ya que esto no será justo para algunos langs)

Dar un toque
fuente
@LeakyNun En el espacio RGB está lo suficientemente cerca, la otra opción es # 7f0000.
Neil
Realmente no. Trate de promediar el rojo y el verde de esta manera y vea si se pone amarillo. Para hacerlo de la manera correcta, tome la raíz del cuadrado medio en lugar del promedio directo.
Leaky Nun
El promedio de 000000y ff0000debería ser b40000( 255*sqrt((0+1)/2))
Leaky Nun
1
@LeakyNun Nunca dije que necesitaras promediar los colores. Describí un método fácil de desvanecimiento que a veces se emplea para desafíos como este. En este caso promediamos los rojos de los dos colores (y redondeados). También noté en el desafío que el desvanecimiento no tiene que ser perfectamente uniforme. Depende de usted cómo desea implementar este desvanecimiento.
Poke

Respuestas:

3

JavaScript (ES6), 290 bytes

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
fuente
1
Es realmente genial ver que suceda en tiempo real con el fragmento de código. : D
AdmBorkBork
1

Pyth, 126 bytes

Promedio obligatorio de raíz cuadrática media en lugar de media aritmética directa.

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

Pruébalo en línea!

Salida de muestra:

muestra

Monja permeable
fuente
1

Java, 702 662 caracteres

Dos funciones de golf:

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

Como nadie puede leer esto: aquí hay ambas funciones en una versión sin golf en una clase:

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

Aquí tiene un límite superior para su propio código. El uso es mediante una llamada colorize(o c en la versión de golf) y pasa el texto y una serie de códigos de colores hexadecimales. La función devolverá una Cadena con etiquetas HTML como lo hizo el OP, por lo que necesita alguna forma de representar el HTML.

El algoritmo es más fácil como parece la pregunta. El primer personaje siempre obtiene el primer color, el último siempre el último. Si tenemos más colores que caracteres en el texto, simplemente iteramos sobre el texto y los colores y los aplicamos. La parte divertida es la que se desvanece: comencé descubriendo a qué distancia están los colores en el texto. Básicamente calculo la diferencia de rojo, verde y azul entre dos colores dados y luego agrego una parte de esta diferencia al primer color, dependiendo de dónde esté el carácter entre los colores. Si deja el intervalo de dos colores, comenzamos de nuevo con los siguientes dos colores. Esto se repite para todos menos el último carácter, que sabemos que siempre es el último color. Esto da un desvanecimiento muy hermoso.

¡Esa pregunta fue muy divertida! ¡Gracias!

Actualizaciones

Ahora no manejo todos los casos especialmente. En cambio, recorto los colores si hay dos y aplico la función de fundido a cada cadena. Si hubiera más colores que texto, los colores se recortarán y la función de desvanecimiento funcionará exactamente como un mapeo simple.

Frozn
fuente