Terminal sangat membosankan akhir-akhir ini. Mereka dulu terlihat seperti ini:
Sekarang mereka hanya hambar dan kusam dan hitam-putih. Saya ingin Anda menulis saya sebuah program yang akan membuat terminal saya semua berwarna lagi!
Deskripsi
Ambil contoh ini kode Ruby:
Sebagian besar terminal Linux mendukung urutan pelarian ini ( \e
singkatan dari karakter pelarian), dan Windows dapat mendukungnya dengan ANSICON . Berikut adalah sintaks dari urutan escape spesifik yang dapat mengubah teks atau warna latar belakang string:
\e[{{COLOR}}m
di mana \e
singkatan karakter pelarian ( 0x1B
dalam ASCII) dan {{COLOR}}
diganti dengan jumlah warna yang ingin Anda gunakan (detail lebih lanjut tentang itu nanti). Teks yang muncul setelah urutan pelarian ini akan diformat seperti yang diarahkan, dan nilai 0
akan mengatur ulang semua pemformatan.
Tantangan Anda adalah mengambil string yang menentukan beberapa teks yang mungkin mengandung warna, dan menampilkan versi warna-warni.
Input output
Teks normal berfungsi seperti biasa, dan dicetak secara harfiah. Misalnya, input waffles
menghasilkan output yang sama, tanpa warna khusus.
Sintaksis untuk menentukan warna mirip dengan sintaksis Wikipedia . Misalnya, untuk mewarnai kata "warna merah" dengan warna merah dalam kalimat This is the color red!
, inputnya adalah:
This is {{red|the color red}}!
Warna latar juga berfungsi. Jika Anda ingin huruf hitam dengan latar belakang putih, Anda akan menggunakan ini:
{{black|white|This text is black on white}}
Untuk hanya mendapatkan warna latar belakang, abaikan latar depan:
{{|red|This text has a red background}}
Spesifikasi
Dua kurung keriting terbuka selalu menentukan awal dari arahan warna . Dua kurung keriting penutup menentukan akhir. Kurung akan selalu cocok; tidak akan pernah ada {{
tanpa yang sesuai }}
, dan }}
tidak akan pernah datang sebelum yang sesuai {{
. Ini arahan warna tidak akan bersarang, dan {{
tidak akan pernah muncul dalam direktif warna.
Dalam arahan warna, akan selalu ada satu atau dua |
simbol. Jika ada satu, teks sebelum itu adalah warna foreground dan teks sesudahnya adalah string untuk ditampilkan dalam warna itu. Jika ada dua, teks sebelum yang pertama adalah warna latar depan, teks setelah yang pertama tetapi sebelum yang kedua adalah warna latar belakang, dan teks setelah yang kedua adalah string untuk ditampilkan. Bilah vertikal ini mungkin ada di luar arahan warna, dan harus dicetak secara harfiah.
Warna latar depan atau warna latar belakang (tetapi tidak keduanya) mungkin kosong, dalam hal ini Anda harus membiarkannya sebagai default. String terakhir (yang akan di-output) tidak akan pernah kosong.
Berikut adalah petunjuk untuk menampilkan teks dengan warna tertentu:
Sebuah urutan warna didefinisikan dalam bagian "Keterangan". Misalnya, urutan warna 42 akan menjadi
"\e[42m"
.Untuk mengatur warna, cetak urutan warna dari angka yang ditentukan di bawah ini:
Color name | Color sequence number (foreground / background) --------------+---------- black | 30 / 40 red | 31 / 41 green | 32 / 42 yellow | 33 / 43 blue | 34 / 44 magenta | 35 / 45 cyan | 36 / 46 lightgray | 37 / 47 darkgray | 90 / 100 lightred | 91 / 101 lightgreen | 92 / 102 lightyellow | 93 / 103 lightblue | 94 / 104 lightmagenta | 95 / 105 lightcyan | 96 / 106 white | 97 / 107
Nama warna peka huruf besar-kecil, dan nama warna yang tidak valid tidak akan pernah diberikan. Anda tidak harus menangani hal-hal seperti
RED
ataulightgrey
(dieja dengane
).Setelah Anda mencetak urutan warna, itu akan berlaku untuk semua teks yang mengikutinya. Untuk mengakhiri urutan warna (reset ke warna default), output urutan warna
0
("\e[0m"
).
Kasus cobaan
{{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }} {{red|'}} {{red|'}} {{|yellow| }}
{{|yellow| }} \_/ {{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }}
Ini akan menghasilkan wajah tersenyum ... dengan mata merah jahat.
Aturan
Anda tidak dapat menggunakan perpustakaan atau fungsi bahasa pemrograman Anda untuk secara otomatis mengurai warna. Ini berarti bahwa Anda harus menjadi orang yang menentukan apa
"red"
artinya; Anda tidak dapat memiliki perpustakaan secara otomatis untuk Anda.Ini adalah kode-golf , jadi kode terpendek dalam byte akan menang!
\n\[\e[32m\]\w\n\[\e[0m\]>
(nama direktori hijau, prompt cepat di baris berikutnya), tapi saya tidak bisa membuatnya berfungsi dari sebuah program (mencoba python dan Java sejauh ini). Ada ide?echo -e "\e[31mtest\e[0m"
.lolcat
.you
dia secara kiasan berartiyour program
(sebagai lawan dari panggilan ke fungsi perpustakaan), dan bahwa diadetermine
memahami artifigure out
, bukan seperti dalamchoose
. Yaitu, program Anda yang harus menangani pemetaan: String ("red") | -> Integer (31).red
hanya31
karena dia berkata begitu, bahwa informasi perlu diintegrasikan ke dalam program. Meskipun mungkin diperdebatkan dengan tepat apa yang akan dihitungyour program
- bisakah kita menggunakan fungsi manipulasi String tujuan umum? - jangan curang / menyalahgunakan.Jawaban:
Ruby,
205189188186185182174170165161159154 byteMenempatkan string panjang nama warna dalam kode Anda tidak terlihat cukup kutu buku.
Turun ke 170 sebagian berkat
rubik
. Sekarang bilah gulir hilang!Satu peningkatan yang jelas dan satu tidak begitu jelas, berkat jawaban yang fleksibel, tanpa peningkatan itu, saya tidak akan meninjau kembali ini!
Tidak lagi, saya menyimpan 4 byte dengan #sum.
Saya tidak bermaksud, tapi saya perhatikan solusi ini juga tidak peka terhadap huruf besar-kecil. Itu dengan senang hati memproses{{RED|Red text}}
.Hex dump:
Anda dapat mengonversinya dengan
xxd -r hex.dump
.Program dengan semua karakter yang tidak dapat dicetak keluar untuk tujuan referensi:
Itu satu baris. Gunakan seperti ini
The
-W0
bendera menekan peringatan yang akan dikirim kestderr
sebaliknya. Namun, program ini berfungsi dengan baik tanpa bendera.Keluaran:
sumber
'1?IYU_N[(\x0c\x16&",\x1f\x01'
. Tali saya panjangnya 16. Saya melihat bahwa Anda berusia 18 tahun, jadi Anda mungkin harus menyesuaikan.int()
fungsi Python tidak bisa melampaui 36). Kemudian saya mencoba semua kombinasi untuk modulus (dari 2 hingga 10.000, tetapi secara teori kita dapat memperluas pencarian ke semua Unicode) dan untuk xor, yang saya pertahankan kecil (1 hingga 9). Lalu saya menganggap hasil yang dapat diterima hanya yang tidak mengandung karakter duplikat.x.to_i(base)%mod+offset
. Saya kemudian mengganti+
dengan^
, karena, itu terlihat lebih keren. Selain itu, tidak perlu. Menjatuhkan^99
dan mengubah<<
ke+
disimpan untuk lebih banyak byte. Terima kasih atas tipnya, saya tidak akan memperhatikan sebaliknya!Ruby, 329 byte.
sumber
ruby 2.1.2p95
dan membuang kesalahan:undefined method 'gsub' for nil:NilClass (NoMethodError)
.ruby colors.rb < input.txt
, itu akan tetap berulang setelah semua input telah dibaca. Lalugets
kembalinil
, yang tidak memiliki#gsub
metode, sehingga menimbulkan kesalahan. Gunakan$><<$<.read
bukanloop{puts gets
, itu juga lebih pendek; )Flex (lexer) -
226197192182168 (atau 166)Untuk turun ke 166, ubah
\33
ke karakter pelarian aktual.Kompilasi dan jalankan:
sumber
Python - 351
sumber
Cobra - 496
Ini bisa hampir menjadi pernyataan cetak tunggal.
sumber
Python, 561
Membaca teks ke format dari stdin.
sumber
is not None
codegolf. Anda dapat menggunakan!=None
, misalnya.def p(f,b,t)
, kode Anda akan melempar aZeroDivisionError
. Apa pun mod 0 tidak mungkin.re.sub
menjalankan ini