Fader AppleSauce


11

Ngày trước, tất cả 1337 trẻ em đã sử dụng các phần mềm văn bản trong các phòng chat. Tôi không biết về các bạn, nhưng tôi muốn cảm thấy tuyệt như họ đã làm. Vấn đề duy nhất là các tập lệnh và ứng dụng cũ của chúng được kết hợp chặt chẽ với phần mềm mà chúng được tạo ra, vì vậy tôi không thể sử dụng chức năng tuyệt vời này bất cứ nơi nào tôi muốn. Tôi cũng muốn giải pháp dễ dàng mang theo để bạn cần làm cho mã càng nhỏ càng tốt để nó phù hợp với đĩa mềm của tôi (tôi chỉ muốn mang một đĩa mềm nhưng nếu mã nguồn của bạn quá lớn Tôi có thể mang nhiều hơn một : P ).

Đầu vào

  • Danh sách các màu (rgb, hex, tên, v.v.)
  • Văn bản để định dạng

Chương trình của bạn sẽ mong đợi danh sách các màu chứa ít nhất 2 màu.
Văn bản thành định dạng có thể dài bất kỳ lớn hơn 0 và các ký tự sẽ được giới hạn ở ascii có thể in được. (Gợi ý: Nhập văn bản dài hơn có thể yêu cầu bạn sử dụng lại các màu trung gian cho các ký tự liên tiếp)

Đầu ra

Văn bản đầu ra không được khác với văn bản đầu vào theo bất kỳ cách nào khác ngoài phông chữ và / hoặc đánh dấu / kiểu dáng (Lưu ý: nếu đầu ra của bạn chứa đánh dấu html thì bạn sẽ cần mã hóa html đầu vào). Bạn có thể xuất văn bản với đánh dấu / kiểu dáng (thẻ kiểu html, màu bảng điều khiển, v.v.) hoặc hình ảnh của văn bản bị mờ. Tất cả các hình lục giác màu phải có trong đầu ra trừ khi đầu vào không chứa đủ ký tự để đáp ứng yêu cầu này. Nếu đây là trường hợp, sau đó tham khảo các quy tắc ưu tiên để xác định những hình lục giác màu nào sẽ có trong đầu ra của bạn. Thứ tự hoặc những màu này trong đầu ra của bạn vẫn phải là thứ tự đầu vào.

Quy tắc ưu tiên màu

  1. Trong trường hợp đầu vào là một ký tự, màu đầu tiên sẽ được sử dụng
  2. Trong trường hợp chỉ có hai ký tự, màu đầu tiên và màu cuối cùng sẽ được sử dụng
  3. Trong trường hợp có nhiều hơn ba màu và nhiều màu hơn ký tự, các màu đầu tiên và cuối cùng sẽ được ưu tiên, sau đó các màu còn lại theo thứ tự được nhập vào.
  4. Trong trường hợp có nhiều ký tự hơn màu sắc, các ký tự sẽ mờ dần từ màu này sang màu khác bằng các màu trung gian

Ví dụ (Quy tắc ưu tiên 1-3 tương ứng):
# Colors | Màu 0 | ... | Màu n | Văn bản
3 ff0000 0000ff ffff00 M-> -> ->chỉ đầu tiên
3 ff0000 0000ff ffff00 hibỏ qua thứ 2
4 ff0000 0000ff ffff00 0fff00 supbỏ qua thứ 3

Để rõ ràng, màu văn bản nên mờ dần từ một màu hex sang màu tiếp theo. Độ mờ không nhất thiết phải hoàn toàn đồng nhất nhưng không nên thay đổi màu đột ngột trừ khi không có đủ ký tự để làm mờ dần. Nói chung, độ mờ này đạt được bằng cách chọn các màu trung gian cho mỗi ký tự bằng cách tăng / giảm các giá trị rgb theo một khoảng thời gian được xác định bởi số lượng ký tự bạn phải làm việc và sự khác biệt giữa các màu. Ví dụ: nếu chúng ta cần một màu duy nhất giữa màu đỏ(# ff0000) và đen(# 000000), chúng ta có thể chọn # 800000vì nó nằm ngay giữa. Đầu ra tối ưu sẽ trông khá đẹp.

Ví dụ (Quy tắc ưu tiên 4):
3 ff0000 ff7f00 f0ff00 To be or not to be, that is the question...-> -OR-tồn tại hay không

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

Trong câu trả lời của bạn, vui lòng xác định cách hiển thị đầu ra của bạn (dưới dạng html, trong bảng điều khiển, dưới dạng hình ảnh, v.v.).

* Tất cả các nền đen chỉ để nhấn mạnh màu sắc và không bắt buộc

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.
Nếu bạn quản lý để thêm mờ dần cho từng ký tự thì tôi sẽ mãi mãi nghĩ bạn thật tuyệt (nhưng không có phần thưởng để ghi điểm vì điều này sẽ không công bằng đối với một số lang)



@LeakyNun Trong không gian RGB, nó gần đủ, tùy chọn khác là # 7f0000.
Neil

Không hẳn vậy. Hãy thử trung bình màu đỏ và màu xanh lá cây theo cách này và xem nếu bạn có màu vàng. Để làm điều đó đúng cách, hãy lấy bình phương gốc thay vì trung bình trực tiếp.
Leaky Nun

Trung bình của 000000ff0000nên là b40000( 255*sqrt((0+1)/2))
Leaky Nun

1
@LeakyNun Tôi chưa bao giờ nói bạn cần trung bình các màu. Tôi đã mô tả một phương pháp làm mờ dễ dàng đôi khi được sử dụng cho các thử thách như thế này. Trong trường hợp này, chúng tôi lấy trung bình màu đỏ của hai màu (và làm tròn). Tôi cũng lưu ý trong thử thách rằng độ mờ không nhất thiết phải hoàn toàn đồng nhất. Nó phụ thuộc vào bạn như thế nào bạn muốn thực hiện phai này.
Chọc

Câu trả lời:


3

JavaScript (ES6), 290 byte

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
Thật tuyệt khi thấy điều đó xảy ra trong thời gian thực với đoạn mã. : D
admBorkBork

1

Bình thường, 126 byte

Nghĩa vụ trung bình gốc-trung bình-bình phương thay vì trung bình số học trực tiếp.

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

Hãy thử trực tuyến!

Đầu ra mẫu:

mẫu vật


1

Java, 702 662 ký tự

Hai chức năng chơi gôn:

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

Vì không ai có thể đọc được điều này: đây là cả hai chức năng trong đó có phiên bản chưa được chỉnh sửa trong một lớp:

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

Ở đây bạn có một giới hạn trên cho mã của riêng bạn. Cách sử dụng là bằng cách gọi colorize(hoặc c trong phiên bản được đánh gôn) và chuyển văn bản và một mảng mã màu hex. Hàm sẽ trả về một Chuỗi có các thẻ HTML giống như OP đã làm, do đó bạn cần một số cách để hiển thị HTML.

Thuật toán dễ dàng hơn khi câu hỏi trông như thế nào. Nhân vật đầu tiên luôn có màu đầu tiên, nhân vật cuối cùng luôn luôn là màu cuối cùng. Nếu chúng ta có nhiều màu hơn ký tự trong văn bản, chúng ta chỉ cần lặp lại văn bản và màu sắc và áp dụng những màu này. Phần thú vị là phần mờ dần: Tôi bắt đầu bằng cách tìm hiểu khoảng cách của màu sắc trên văn bản. Về cơ bản, tôi tính toán sự khác biệt màu đỏ, xanh lá cây và xanh dương giữa hai màu nhất định và sau đó thêm một phần của sự khác biệt này vào màu đầu tiên, tùy thuộc vào vị trí của char giữa các màu. Nếu nó để lại khoảng thời gian của hai màu, chúng ta bắt đầu từ mới với hai màu tiếp theo. Điều này được lặp lại cho tất cả trừ nhân vật cuối cùng, mà chúng ta biết luôn luôn là màu cuối cùng. Điều này cho một phai rất đẹp.

Câu hỏi đó rất vui! Cảm ơn!

Cập nhật

Bây giờ tôi không xử lý tất cả các trường hợp đặc biệt. Thay vào đó, tôi cắt các màu nếu có hai nhiều và áp dụng hàm fade cho mỗi chuỗi. Nếu có nhiều màu hơn văn bản thì màu sẽ được cắt bớt và chức năng làm mờ sẽ hoạt động chính xác như một ánh xạ đơn giản.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.