Charcoal adalah bahasa yang dibuat oleh ASCII-only dan DLosc yang berspesialisasi dalam tantangan seni ASCII.
Kiat apa yang Anda miliki untuk bermain golf di Charcoal? Jelas saya mencari kiat-kiat terkait khusus untuk Arang, bukan yang bisa diterapkan ke sebagian besar - jika tidak semua - bahasa.
Jawaban:
Manfaatkan deverbosifier
Menggunakan deverbosifier berarti Anda dapat menulis di ASCII (
--dv
atau--deverbosify
untuk deverbosify,-v
atau--verbose
mengeksekusi sebagai kode verbose). Selain itu, kompres string untuk Anda, yang dapat berguna dalam beberapa tantangan ASCII-art ketika string untuk kompres terlalu lama.@Neil merekomendasikan menggunakan
-vl
atau-v --sl
. Ini adalah kependekan dari--verbose --showlength
, artinya akan diartikan sebagai verbose Charcoal, dan panjang kode Charcoal normal akan ditampilkan. Juga, ketika melakukan deverbosifikasi, periksa output untuk memastikan bahwa input benar-benar diuraikan dengan benar, karena Charcoal umumnya mengabaikan kesalahan penguraian. Jika ada adalah kesalahan sintaks, penggunaan-a
(--astify
) atau--oa
(--onlyastify
) untuk bantuan mencari tahu masalah.sumber
-v -sl
. Juga, ketika melakukan deverbosifikasi, periksa output untuk memastikan bahwa input benar-benar diuraikan dengan benar, karena Anda tidak selalu mendapatkan kesalahan parse.Gunakan kelebihan beban
Misalnya, banyak perintah hanya perlu satu argumen:
Rectangle
,Oblong
danBox
buat kotak jika hanya satu argumen yang diberikanReflect
perintah default untuk mencerminkan kananRotate
perintah default ke 90 derajat berlawanan arah jarum jamPolygon
danPolygonHollow
dapat menerima multi arah dan panjang sisi. Ini dapat digunakan jika semua sisi memiliki panjang yang sama.sumber
PolygonHollow
secara tidak sengaja. Anda bahkan dapat memiliki beberapa multidirectional, tetapi harus ada sebelum panah normal (saya tidak tahu apakah batasan ini disengaja). Saya menggunakan itu dalam jawaban saya untuk tantangan "Draw a cube".ReflectButterfly dls
untuk memanggilReflectButterfly
untuk setiap arah, tetapi (sebagai wiki benar mendokumentasikan) itu benar-benar memanggilReflectOverlap
.Hindari konstanta berturut-turut dari jenis yang sama
Sebagai contoh,
Plus(Times(i, 2), 1)
diterjemahkan sebagai⁺×鲦¹
, tetapi Anda dapat menyimpan byte dengan beralih parameter:Plus(1, Times(i, 2))
diterjemahkan sebagai⁺¹×ι²
danPlus(Times(2, i), 1)
sebagai⁺ײι¹
yang keduanya menyimpan byte.Plus(1, Times(2, i))
(yang diterjemahkan sebagai⁺¹×²ι
) akan lebih baik jika ada konstanta numerik lain yang mengikutinya.sumber
Gunakan variabel yang sudah ditentukan sebelumnya
Berikut adalah daftar semua variabel yang dapat digunakan, memberikan huruf Yunani singkat dan huruf verbose yang mewakilinya.
Variabel yang mewakili input akan kosong jika tidak ada input yang cukup, tetapi semua variabel lain yang tidak ditampilkan di sini harus ditugaskan sebelum digunakan.
sumber
y
danf
sebaliknya dari apa yang saya tempelkan? (Saya mungkin salah membaca surat-surat Yunani ketika saya awalnya menulis ini.)Pelajari refleksi dan rotasi Anda
Ada banyak variasi refleksi dasar dan rotasi, jadi perlu untuk mengetahui apa perbedaannya. Kunci tabel:
/
menjadi\
setelah rotate atau flip.Refleksi
Arah refleksi adalah opsional. Standarnya adalah untuk mencerminkan sekali ke kanan. Untuk refleksi yang mempertahankan yang asli, beberapa arah diperbolehkan, yang hanya mengulangi perintah untuk setiap arah. (Ini berarti bahwa misalnya
ReflectMirror(:¬)
akan benar-benar membuat empat salinan secara total.)Kursor dipindahkan bersama dengan refleksi (bahkan ketika aslinya disimpan).
Rotasi
Untuk rotasi yang mempertahankan yang asli, ada asal opsional rotasi. Standarnya adalah kanan bawah kanvas. Nilai yang diijinkan adalah salah satu dari arah diagonal.
Jumlah rotasi (dalam penambahan 45 °) adalah opsional. Standarnya adalah 2, yaitu 90 ° berlawanan arah jarum jam (berlawanan arah jarum jam). Untuk rotasi yang mempertahankan yang asli, ada dua opsi alternatif: integer multidigit menentukan untuk memutar kanvas sekali untuk setiap digit dan kemudian menggabungkan hasilnya, sementara daftar integer hanya mengulangi perintah untuk setiap rotasi, dengan hasil variabel tergantung pada bagaimana kanvas berubah di antara keduanya.
sumber
Transform
artinya?Transform
kerjanya di suatu tempat.Gunakan perintah tanpa karakter perintah
Ekspresi yang bukan bagian dari perintah dicetak.
Jika didahului oleh suatu arah, ekspresi dicetak dalam arah yang ditentukan.
Angka dicetak sebagai garis dengan panjang yang ditentukan menggunakan karakter yang dipilih
\/-|
.Jika arah tidak diikuti oleh ekspresi, itu dihitung sebagai gerakan satu spasi dalam arah yang ditentukan.
Catatan: Ini kadang-kadang dapat dihitung sebagai bagian dari perintah sebelumnya sehingga karakter perintah sebenarnya diperlukan. (Terima kasih Neil untuk mengingatkan saya)
sumber
Gunakan multidireksional
Beberapa perintah dapat menerima multidirectionals:
+X*|-\/<>^KLTVY7¬⌊⌈
. Apa yang mereka kembangkan ada di sini . Secara umum, daftar arah dimulai dari atas dan berlanjut searah jarum jam.sumber
ReflectButtterflyOverlap(:¬, Modulo(g, 2));
.)Manfaatkan sepenuhnya
Sum
Sum
memiliki banyak kelebihan yang berguna:Join(..., "")
saja..
karakter, ambil jumlah digit.-
dihitung sebagai pemisah).Efek samping yang nyaman dari dua aturan terakhir adalah bahwa jika Anda menggunakan
Sum
karakter, maka digit1-9
akan dilemparkan ke nilainya dan yang lainnya mengembalikan nol, tidak sepertiCast
, yang gagal untuk nilai non-digit.sumber
Gunakan split untuk array string, split dan casting untuk array angka
Split untuk array string hanya tiga karakter overhead, dan split dan cast hanya empat karakter overhead. Bandingkan ini dengan menulis array secara harfiah, yang akan membutuhkan awal dan akhir array, dan pemisah antara setiap elemen array.
Jika susunan angka Anda hanya memiliki angka kurang dari 95, gunakan gips (jika semua angka kurang dari 10) atau indeks ke salah satu variabel yang telah ditentukan.
sumber
Gunakan Filter untuk mengiris karakter pertama dari array atau string
Bahkan jika Anda beruntung, menggunakan
Slice
untuk mengiris karakter pertama dari string membutuhkan 2 bytes:Slice(..., 1)
. Diperlukan waktu lebih lama jika ekspresi yang akan diiris diakhiri dengan angka, membutuhkan pemisah, atau jika kode berikut dapat diartikan sebagai ekspresi, karena dalam kasus ituSlice
akan ingin mengkonsumsinya sebagai parameter tambahan.Sebaliknya, gunakan saja
Filter(..., k)
, yang menjatuhkan elemen pertama, sehingga mencapai hasil yang diinginkan. (Jelas menggunakan variabel indeks loop yang sesuai jika ekspresi Anda bersarang di dalam loop lain.) Ini selalu 2 byte dan tidak dapat dipengaruhi oleh kode sekitarnya.sumber