AppleSauce Fader


11

Günün geri kalanında, 1337 çocuğun tümü sohbet odalarında metin fader'ları kullandı. Seni bilmiyorum arkadaşlar, ama onlar gibi serin hissetmek istiyorum. Tek sorun, eski komut dosyalarının ve uygulamalarının yapıldığı yazılıma büyük ölçüde bağlı olması, bu yüzden istediğim yerde bu inanılmaz işlevselliği kullanamıyorum. Ayrıca çözümün kolayca taşınabilir olmasını istiyorum, böylece kodu disketime uyacak şekilde olabildiğince küçük hale getirmeniz gerekecek (sadece bir disket taşımak istiyorum ama kaynak kodunuz çok büyükse) Birden fazla taşıyabilirim : P ).

Giriş

  • Renklerin listesi (rgb, hex, adlar, vb.)
  • Biçimlendirilecek metin

Programınız renk listesinin en az 2 renk içermesini beklemelidir.
Biçimlendirilecek metin sıfırdan büyük herhangi bir uzunluk olabilir ve karakterler yazdırılabilir ASCII ile sınırlı olacaktır. (İpucu: Daha uzun metin girişleri, ara renkleri ardışık karakterler için yeniden kullanmanızı gerektirebilir)

Çıktı

Çıktı metni, yazı ve / veya biçimlendirme / stil dışında herhangi bir şekilde giriş metninden farklı olmamalıdır (Not: çıktınızda html işaretlemesi varsa, girişi html kodlamanız gerekir). İşaretleme / stil (html stil etiketleri, konsol renkleri vb.) Veya soluk metnin resmiyle metin çıktısı alabilirsiniz. Giriş bu gereksinimi karşılamak için yeterli karakter içermiyorsa, tüm renk altıgenleri çıktıda bulunmalıdır. Bu durumda, çıktınızda hangi renk altıgenlerinin bulunması gerektiğini belirlemek için öncelik kurallarına bakın. Çıktınızdaki sipariş veya bu renkler yine de giriş sırası olmalıdır.

Renk Önceliği Kuralları

  1. Girişin bir karakter olması durumunda, ilk renk kullanılır
  2. Yalnızca iki karakter olması durumunda, ilk ve son renk kullanılır
  3. Karakterlerden üçten fazla renk ve daha fazla renk olması durumunda, ilk ve son renklere, ardından renklerin geri kalanına girilen sırayla öncelik verilmelidir.
  4. Renklerden daha fazla karakter olması durumunda, karakterler ara renkleri kullanarak bir renkten diğerine solmalıdır

Örnekler (Sırasıyla Öncelik kuralları 1-3):
# Renkler | Renk 0 | ... | Renk n | Metin
3 ff0000 0000ff ffff00 M-> -> ->sadece önce
3 ff0000 0000ff ffff00 hi2. yoksay
4 ff0000 0000ff ffff00 0fff00 sup3. yoksay

Açık olmak gerekirse, metin rengi bir renk onaltılıdan diğerine solmalıdır. Solmanın mükemmel bir şekilde düzgün olması gerekmez, ancak güzel bir şekilde solması için yeterli karakter olmadığı sürece ani bir renk değişikliği olmamalıdır. Genellikle bu solma, rgb değerlerini, çalışmak zorunda olduğunuz karakter sayısı ve renkler arasındaki fark tarafından belirlenen bir aralıkla artırarak / azaltarak karakterlerin her biri için ara renkler seçerek elde edilir. Örneğin, kırmızı(# ff0000) ve siyah(# 000000) arasında tek bir renge ihtiyaç duyarsak # 800000, tam ortada olduğu gibi seçebiliriz . Optimal çıktı oldukça hoş görünecek.

Örnek (Öncelik kuralı 4):
3 ff0000 ff7f00 f0ff00 To be or not to be, that is the question...-> -VEYA-olmak ya da olmamak

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

Yanıtınızda lütfen çıktınızın nasıl görüntülenmesi gerektiğini belirtin (html olarak, bir konsolda, bir resim olarak, vb.).

* Tüm siyah arka planlar sadece renk vurgusu içindir ve gerekli değildir

puanlama

Bu , bu yüzden en kısa cevap (bayt cinsinden) kazanır.
Eğer tek tek karakterlere solmaya eklemeyi başarırsanız, sonsuza kadar havalı olduğunuzu düşünürüm (ancak bazı langlar için adil olmayacağından gol atamazsınız)



@LeakyNun RGB alanında yeterince yakın, diğer seçenek # 7f0000.
Neil

Pek sayılmaz. Bu şekilde kırmızı ve yeşili ortalamayı deneyin ve sarı olup olmadığını görün. Doğru şekilde yapmak için, doğrudan ortalama yerine kök ortalama karesini alın.
Sızdıran Rahibe

Ortalama 000000ve ff0000olmalıdır b40000( 255*sqrt((0+1)/2))
Leaky Nun

1
@LeakyNun Renkleri ortalamanız gerektiğini hiç söylemedim. Bazen böyle zorluklar için kullanılan kolay bir solma yöntemini tanımladım. Bu durumda, iki rengin (ve yuvarlak) kırmızılarının ortalamasını aldık. Ayrıca meydan okumada solmanın mükemmel bir şekilde tek tip olması gerekmediğini de belirtmiştim. Bu solmayı nasıl uygulamak istediğiniz size kalmış.
Poke

Yanıtlar:


3

JavaScript (ES6), 290 bayt

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
Kod parçacığıyla gerçek zamanlı olarak gerçekleştiğini görmek gerçekten harika. : D
AdmBorkBork

1

Pyth, 126 bayt

Doğrudan aritmetik ortalama yerine zorunlu kök-ortalama-kare ortalaması.

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

Çevrimiçi deneyin!

Örnek çıktı:

örneklem


1

Java, 702 662 karakter

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

Kimse bunu okuyamayacağı için: burada her iki fonksiyon da bir sınıfta ungolfed versiyonunda:

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

Burada kendi kodunuz için bir üst sınırınız var. Kullanımı arayarak colorize(ya da golf versiyonunda c) ve metni ve bir dizi onaltılık renk kodunu geçirmektir. İşlev, OP'nin yaptığı gibi HTML etiketleri olan bir Dize döndürür, bu nedenle HTML'yi oluşturmak için bir yol gerekir.

Soru gibi göründüğü gibi algoritma daha kolaydır. İlk karakter her zaman ilk rengi, son karakter her zaman sonuncuyu alır. Metindeki karakterlerden daha fazla rengimiz varsa, sadece metin ve renkler üzerinde tekrarlar ve bunları uygularız. Eğlenceli kısım, soluk olan kısımdır: Metnin üzerindeki renklerin hangi mesafede olduğunu öğrenerek başladım. Temel olarak, verilen iki renk arasındaki kırmızı, yeşil ve mavi farkı hesaplıyorum ve ardından karakterin renkler arasında nerede bulunduğuna bağlı olarak bu rengin bir kısmını ilk renge ekliyorum. İki renk aralığından ayrılırsa, yeni iki renkten sonraki iki renkle başlarız. Bu, her zaman son renk olduğunu bildiğimiz son karakter hariç herkes için tekrarlanır. Bu çok güzel bir solma sağlar.

Bu soru çok eğlenceliydi! Teşekkürler!

Güncellemeler

Şimdi tüm davaları özel olarak ele almıyorum. Bunun yerine iki tane varsa renkleri düzeltirim ve her dizeye solma işlevini uygularım. Metinden daha fazla renk varsa, renkler kırpılacak ve solma işlevi tam olarak basit bir eşleme olarak çalışacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.