Tantangan Anda adalah mengambil input sebagai garis teks dan menampilkannya seperti ini.
Input output
Input akan berupa string yang hanya berisi karakter ASCII yang dapat dicetak. Karakter pertama atau terakhir tidak akan pernah menjadi spasi, dan tidak akan pernah ada dua spasi dalam satu baris. Panjangnya akan selalu setidaknya dua karakter.
Output Anda harus string yang sama, dikonversi ke warna pelangi seperti yang akan dijelaskan di bawah ini. Outputnya mungkin dalam bentuk gambar (disimpan ke file atau entah bagaimana dibuat tersedia), atau mungkin hanya menampilkan hasilnya di layar (seperti implementasi referensi di bawah ini).
Konversi
Untuk menentukan apa warna setiap huruf dalam string seharusnya, gunakan algoritma berikut. Perhatikan bahwa setiap huruf adalah warna masing-masing . Ini bukan gradien!
Jika karakter ini adalah spasi:
- ... tidak masalah, karena ruang tidak bisa benar-benar ... memiliki warna. Cukup output ruang.
Jika tidak:
Misalkan
i
= indeks karakter ini dalam string (berbasis 0, jadi untuk huruf pertama, ini0
), tidak menghitung spasi. Misalnya, dalam stringfoo bar
, nilai ini adalah4
untuka
. Dengan kata lain, sejauh ini sudah berapa banyak ruang kosong yang ditemukan.Let
n
= jumlah non-spasi dalam string.Warna surat ini sekarang dapat dinyatakan, dalam sistem koordinat-silindris HSL , sebagai [rona = (
i
/n
) * 360 °, saturasi = 100%, cahaya = 50%].
Perhatikan bahwa arah ini menyiratkan bahwa output untuk foo
dan f oo
harus persis sama, kecuali untuk ruang tambahan setelah f
. Artinya, semua huruf harus mempertahankan warna yang sama.
Aturan lebih lanjut untuk proses konversi dijelaskan di bawah ini, di bagian Aturan .
Implementasi referensi
Ini ditulis dalam JavaScript, dan Anda dapat mencobanya dengan menekan tombol "Run snippet".
window.addEventListener('load', function() {
addRainbow('Your challenge is to take input as a line of text and ' +
'output it like this.');
});
// append this text rainbow-ified to the argument (document.body by default)
function addRainbow(text, el) {
(el || document.body).appendChild(makeRainbow(text));
}
// returns a <div> that contains the text in a rainbow font
function makeRainbow(text) {
var div = document.createElement('div');
var letterCount = text.replace(/ /g, '').length, spaceCount = 0;
text.split('').forEach(function(letter, idx) {
if (letter == ' ') ++spaceCount;
div.appendChild(makeLetter(letter, (idx - spaceCount) / letterCount));
});
return div;
}
// returns a <span> that contains the letter in the specified color
function makeLetter(letter, hue) {
hue = Math.floor(hue * 360);
var span = document.createElement('span');
span.appendChild(document.createTextNode(letter));
span.style.color = 'hsl(' + hue + ', 100%, 50%)';
return span;
}
Aturan
Saat menghitung nilai Hue dari sebuah huruf, Anda hampir pasti akan mendapatkan angka desimal (non-integer). Anda bisa membulatkan ini ke bilangan bulat terdekat, melantai, mengambil langit-langit, atau tidak bulat sama sekali.
Ukuran font harus dapat dibaca. Di sini, ini didefinisikan sebagai font ukuran 10pt atau lebih besar.
Anda dapat menggunakan kanvas dengan lebar tetap atau "area gambar" untuk menampilkan teks, tetapi harus dapat mencocokkan dengan contoh yang diberikan pada kalimat pertama posting ini.
Skor adalah kode-golf , sehingga kode terpendek dalam byte akan menang.
Jawaban:
Perl, 95
92 byte kode + 3 untuk
-p
Skrip ini menggunakan perkiraan warna yang tersedia untuk terminal (maksimum 256) saat ini hanya termasuk beberapa titik warna yang dipilih dari daftar ini , jadi kemungkinan besar tidak akan ditentukan, tetapi ini tetap menyenangkan! Saya memfilter daftar untuk hanya menampilkan warna dengan
S
danL
nilai100%
dan50%
masing masing, lalu diurutkan berdasarkan rona, mengemas angka-angka ke dalam string dan memilih warna dari daftar itu.Implementasi ini termasuk karakter yang tidak dapat dicetak! Gagasan mencuri @ edc65 hanya mengganti
\S
bukan.
, sederhana, tapi pintar!Hexdump:
Balikkan hexdump dengan menyalin teks di atas dan menjalankan:
menempelkan data dan menekan Ctrl+D .
Jalankan menggunakan:
Ini menghasilkan output seperti:
sumber
Python 2: 240 menggunakan PIL dan colorsys lib
Contoh output:
Terima kasih kepada @agtoever dan @Trang Oul untuk beberapa kiat bermain golf, dan untuk @Mauris untuk menunjukkan persyaratan ruang.
Untuk menambahkan font jenis sebenarnya, kontrol ukuran font, termasuk offset horizontal dan perubahan warna berdasarkan panjangnya.
Font yang saya gunakan tersedia dari sini : Hasilnya (bagian atas hanya mencetak string, yang di bawah ini mencetak per huruf):
sumber
as P
dan tulisPIL
dua kali dan menangkan satu karakter. Ubahimg
kei
dan menangkan 4 karakter lainnya.255
ke variabel, ganti semua ocurrences dan gunakan(a,)*3
sebagai warna putih. Gantifloat(j)
dengan(j+.0)
.float(j)
ke1.*j
u=len(s) a=255
=>u,a=len(s),255
). Hapus[]
tanda kurung darituple
, mereka tidak diperlukan. Ganti loop dengan daftar pemahaman (metode akan dievaluasi sebagai efek samping).JavaScript (ES6), 114
117 125Edit2 3 byte disimpan thx @Dom Hastings Edit HTML tidak valid, tetapi tetap bekerja.
Catatan biasa: tes menjalankan cuplikan pada browser yang sesuai EcmaScript 6 (terutama bukan Chrome bukan MSIE. Saya menguji pada Firefox)
sumber
)
Andahsl(
karena tampaknya masih bekerja untuk saya di Firefox!${c}'
untuk'+c
menyimpan 2 lagi ... Lebih baik kembali dengan milikku!Python 3, 131 byte
Simular dengan jawaban Dom Hastings tetapi diimplementasikan dengan python.
String
'|\x82\x88\x8ejF"#$%\x1f\x19\x137[\x7f~}'
dibangun dari daftar[124,130,136,142,106,70,34,35,36,37,31,25,19,55,91,127,126,125]
adalah kode warna terminal untuk ditampilkan secara berurutan. Mereka telah difilter sehingga mereka hanya menyertakan warna dengan saturasi 100% dan nilai 50%. Daftar itu kemudian disortir sehingga rona yang benar ditampilkan terlebih dahulu.Mengambil input dari stdin dan mengembalikannya ke stdout.
Terminal Anda yang Anda gunakan HARUS mendukung kode pelarian ANSI untuk menjalankan ini dengan benar.
Atau versi singkat dengan karakter byte literal (Tidak menempel dengan benar):
Hexdump literal:
Terima kasih @swstephe untuk menghemat 9 byte (dan juga membuat saya memperhatikan penghitungan byte saya sedikit salah)!
sumber
PHP, 165 byte
Jalankan dengan input sebagai parameter "s"
HTML tidak valid tetapi harus dirender di semua browser utama (diuji di Chrome dan Firefox)
sumber
PHP 4.1,
112103102 byteSaya sudah menggunakan jawaban @DankMemes sebagai titik awal. Dari sana, saya sudah menerapkan banyak perubahan, ke titik bahwa kode berbeda.
Implementasinya mirip, kodenya sama sekali berbeda.
Untuk menggunakannya, cukup tetapkan nilai pada SESI / DAPATKAN / POST / COOKIE dengan nama
s
.Hasil menjalankan fungsi ini, pada kalimat tes:
sumber