Kiat untuk bermain golf di Charcoal

15

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.

Okx
sumber
Persetan, aku akan mencoba melakukan jawaban arang pada sesuatu, brb. Mungkin saya bisa memberi petunjuk kecil di utas ini.
Magic Gurita Guci

Jawaban:

5

Manfaatkan deverbosifier

Menggunakan deverbosifier berarti Anda dapat menulis di ASCII (--dv atau --deverbosifyuntuk deverbosify, -vatau --verbosemengeksekusi 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 -vlatau -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.

Khusus ASCII
sumber
Selanjutnya, saya sarankan menggunakan -v -sl. Juga, ketika melakukan deverbosifikasi, periksa output untuk memastikan bahwa input benar-benar diuraikan dengan benar, karena Anda tidak selalu mendapatkan kesalahan parse.
Neil
3

Gunakan kelebihan beban

Misalnya, banyak perintah hanya perlu satu argumen:

  • Rectangle, OblongdanBox buat kotak jika hanya satu argumen yang diberikan
  • Reflect perintah default untuk mencerminkan kanan
  • Rotate perintah default ke 90 derajat berlawanan arah jarum jam
  • Polygondan PolygonHollowdapat menerima multi arah dan panjang sisi. Ini dapat digunakan jika semua sisi memiliki panjang yang sama.
Khusus ASCII
sumber
Saya menemukan fakta itu PolygonHollowsecara 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".
Neil
Hmm batasannya agak disengaja, tapi saya kira saya harus mengubahnya karena tidak akan sakit
ASCII-only
Saya melihat Anda memperbaiki Polygon untuk menerima panah dan multi arah dalam urutan apa pun, terima kasih! Sementara saya di sini, saya berharap ReflectButterfly dlsuntuk memanggil ReflectButterflyuntuk setiap arah, tetapi (sebagai wiki benar mendokumentasikan) itu benar-benar memanggil ReflectOverlap.
Neil
@Neil lol oops, saya akan mencoba untuk memperbaikinya ASAP (saya pikir itu kebetulan juga haha)
ASCII-only
3

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 ⁺¹×ι²dan Plus(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.

Neil
sumber
3

Gunakan variabel yang sudah ditentukan sebelumnya

Berikut adalah daftar semua variabel yang dapat digunakan, memberikan huruf Yunani singkat dan huruf verbose yang mewakilinya.

α/a: The uppercase alphabet
β/b: The lowercase alphabet
γ/g: A string of all the ASCII characters from space to ~
δ/d: The fifth input
ε/e: The fourth input
ζ/z: The third input
η/h: The second input
θ/q: The first input
υ/u: An empty array
φ/f: 1000
χ/c: 10
ψ/y: The null character
ω/w: The empty string

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.

Neil
sumber
Ini harus diperbaiki pada TIO sekarang, alangkah baiknya jika Anda dapat memverifikasi bahwa itu berfungsi
ASCII-only
@ Khusus ASCII Bisakah Anda mengonfirmasi hal itu ydan fsebaliknya dari apa yang saya tempelkan? (Saya mungkin salah membaca surat-surat Yunani ketika saya awalnya menulis ini.)
Neil
Ya mereka sebaliknya
hanya ASCII
3

Pelajari refleksi dan rotasi Anda

Ada banyak variasi refleksi dasar dan rotasi, jadi perlu untuk mengetahui apa perbedaannya. Kunci tabel:

  • Command: Nama perintah dalam mode Verbose.
  • Transform: Apakah Charcoal harus mencoba untuk membalik atau memutar karakter saat ia mencerminkan atau memutarnya. Misalnya, a /menjadi \setelah rotate atau flip.
  • Tetap Asli: Apakah Arang harus menggabungkan hasilnya dengan kanvas asli.
  • Tumpang tindih: (Hanya berlaku ketika Keep Original is Yes.) Menentukan posisi sumbu refleksi / rotasi, dalam setengah karakter dari perbatasan. Dalam hal refleksi, setara dengan jumlah baris / kolom yang tidak terpengaruh dan berakhir di tengah-tengah hasilnya. Dalam hal rotasi, salinan yang diputar diizinkan untuk menimpa area yang jelas (tetapi bukan spasi) dalam dokumen asli.

Refleksi

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Reflect                 | No        | No            | n/a     |
| ReflectCopy             | No        | Yes           | 0       |
| ReflectOverlap          | No        | Yes           | 1       |
| ReflectOverlapOverlap   | No        | Yes           | n       |
| ReflectTransform        | Yes       | No            | n/a     |
| ReflectMirror           | Yes       | Yes           | 0       |
| ReflectButterfly        | Yes       | Yes           | 1       |
| ReflectButterflyOverlap | Yes       | Yes           | n       |

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

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Rotate                  | No        | No            | n/a     |
| RotateCopy              | No        | Yes           | 0       |
| RotateOverlap           | No        | Yes           | 1       |
| RotateOverlapOverlap    | No        | Yes           | n       |
| RotateTransform         | Yes       | No            | n/a     |
| RotatePrism             | Yes       | Yes           | 0       |
| RotateShutter           | Yes       | Yes           | 1       |
| RotateShutterOverlap    | Yes       | Yes           | n       |

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.

Neil
sumber
Pertanyaan: Apa Transformartinya?
CalculatorFeline
@ CalculatorFeline Pertanyaan bagus. Kasus di mana Transform bukan hanyalah salinan karakter-untuk-karakter. Sebagai contoh, refleksi standar "4> 2" hanyalah karakter dalam urutan terbalik, yaitu "2> 4". Ini tidak selalu diinginkan, jadi Transform berupaya untuk mengganti karakter dengan cara yang paling tepat, sehingga pantulan "4> 2" akan menjadi "2 <4". Transform mungkin bukan deskripsi terbaik untuk ini, jadi jangan ragu untuk menyarankan sesuatu yang lebih baik.
Neil
Tidak dapat memikirkan sesuatu yang lebih baik, jadi Anda harus menjelaskan cara Transformkerjanya di suatu tempat.
CalculatorFeline
@ CalculatorFeline Saya telah menambahkan kunci ke tabel, kalau-kalau kolom lain juga tidak jelas.
Neil
Bug harus diperbaiki sekarang. Juga terima kasih banyak telah meluangkan waktu untuk menulis penjelasan ini!
ASCII
2

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)

Khusus ASCII
sumber
1
Anda harus berhati-hati terhadap ambiguitas karena perintah sebelumnya dapat menerima parameter opsional.
Neil
2

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.

Khusus ASCII
sumber
Adakah alasan khusus mengapa beberapa perintah menerima multidirectional tetapi yang lain memerlukan daftar arahan? (Mungkin ada alasan bagus untuk hal ini yang saya abaikan, tetapi saya coba lakukan ReflectButtterflyOverlap(:¬, Modulo(g, 2));.)
Neil
@Neil Saya tidak berpikir begitu, akan berubah SECEPATNYA
ASCII-hanya
0

Manfaatkan sepenuhnya Sum

Sum memiliki banyak kelebihan yang berguna:

  • Pada daftar string, menyatukan mereka. Namun, jika daftar itu mungkin kosong, ini akan memberikan Tidak Ada, jadi dalam hal ini, gunakan Join(..., "")saja.
  • Pada daftar angka yang tidak kosong, cukup ambil jumlahnya.
  • Pada daftar daftar yang tidak kosong, gabungkan menjadi satu (ratakan ke kedalaman 1).
  • Pada bilangan bulat, ambil jumlah digitnya. (Nilai titik apung dipotong menjadi bilangan bulat. Jika Anda ingin menjumlahkan tempat desimal, masukkan ke string terlebih dahulu.)
  • Pada string yang hanya berisi digit dan opsional satu .karakter, ambil jumlah digit.
  • Pada string yang berisi angka dan pemisah, ambil jumlah angka yang dilemparkan ke int atau float (tetapi perhatikan bahwa -dihitung sebagai pemisah).

Efek samping yang nyaman dari dua aturan terakhir adalah bahwa jika Anda menggunakan Sumkarakter, maka digit 1-9akan dilemparkan ke nilainya dan yang lainnya mengembalikan nol, tidak seperti Cast, yang gagal untuk nilai non-digit.

Neil
sumber
0

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.

Khusus ASCII
sumber
0

Gunakan Filter untuk mengiris karakter pertama dari array atau string

Bahkan jika Anda beruntung, menggunakan Sliceuntuk 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 itu Sliceakan 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.

Neil
sumber