Karena saya telah melihat lebih banyak > <> kiriman yang beredar akhir-akhir ini, saya pikir mungkin ada baiknya untuk memiliki halaman tips.
Harap tetap berpegang pada satu tip per posting, kecuali mereka terkait erat.
Penerjemah daring (ada beberapa bug, tetapi bagus untuk sebagian besar kasus)
o
, dan karena baris baru\n
ASCII 10 dapat Anda lakukanao
.CR
bukannyaLF
dan mendorongd
bukana
.Jawaban:
Memeriksa terhadap 0
Menggunakan
?!
bukan0=?
biasanya menghemat satu byte.Namun, standar
?
saja terkadang lebih baik jika Anda mampu melakukan sedikit restrukturisasimelawan
sumber
Memeriksa EOF
Ketika EOF tercapai,> <> mendorong -1 ke stack, yang dapat diperiksa dengan salah satu dari dua cara:
Untuk keperluan pemeriksaan EOF, keduanya adalah negasi, jadi mana yang lebih menguntungkan tergantung pada struktur program Anda.
sumber
Lompat untuk menghindari mulai baris baru
Memulai baris baru kadang-kadang berarti membuang banyak spasi kosong di baris berikutnya. Dalam situasi seperti itu, melompat bisa bermanfaat.
Contohnya,
dapat dibuat agar sesuai pada satu baris seperti ini:
Sebagai contoh praktis, inilah program Hello World dalam satu baris:
sumber
Menggunakan modulus untuk menyederhanakan input
Ini mungkin tip yang terlalu sederhana, jadi jika ya saya akan menggantinya atau menghapusnya.
Katakanlah Anda ingin mengambil input dari dua karakter, "a" dan "b" dan masing-masing mengembalikan 1, dan 2. Anda mungkin menggunakan kondisional untuk ini, karena ini paling masuk akal, dan saya akan menggunakan formulir yang lebih ringkas untuk contoh khusus ini.
Ini memeriksa untuk melihat apakah input lebih besar dari "a" dan menambahkan 1. Karena "a" akan mengembalikan 0 dan "b" 1, ini akan memberikan 1 dan 2. Ini melakukan pekerjaan dengan cukup baik, tetapi dalam kasus kami input, kita bisa melangkah lebih jauh.
Dalam mod 3, 97, yang "setara" numerik, menjadi 1, dan 98, yang "b", menjadi 2. Untuk dua angka yang berbeda, ada jaminan mod yang memberikan hasil unik untuk keduanya. Untuk lebih dari dua, ada mod yang memberikan hasil yang unik, tetapi saya tidak memiliki kecakapan matematika untuk menemukan yang terkecil dengan cara yang sederhana (misalnya jika Anda memiliki set {100.101.102.103}, mod 104 akan memberikan hasil yang unik untuk setiap nilai di dalamnya tetapi tidak dengan cara yang sangat membantu). Namun, dalam kebanyakan kasus, dengan input dibatasi pada beberapa karakter alfabet, Anda sering dapat menemukan mod yang berfungsi.
Untuk menemukan modulus terkecil yang menghasilkan hasil unik untuk dua angka, a, dan, b, Anda lakukan sebagai berikut. Ambil nilai absolut dari selisih a dan b (
|a - b|
) dan temukan angka terkecil, n, yang tidak membaginya. misalnya untuk 97 dan 98,,|98 - 97| = 1
dan 2 akan menjadi mod terkecil (tetapi untuk program pengujian kami, ini memberikan 1 untuk 97 dan 0 untuk 98, jadi mod 3 lebih baik).sumber
Menggunakan lompatan sebagai persyaratan
Beberapa kali Anda akan berakhir dengan menulis program di> <> yang mengharuskan Anda melakukan hal-hal yang berbeda setelah menerima input yang berbeda. Biasanya, Anda akan menggunakan conditional (
?
) dan pengubah arah untuk menguraikan ini. Dalam beberapa kasus, itu berfungsi dengan baik (terutama ketika ada lebih sedikit jenis input untuk ditangani), tetapi kadang-kadang Anda berakhir dengan sesuatu yang tampak seperti ini. (Abaikan fakta bahwa kode ini dapat dikurangi menggunakan beberapa trik lain, itu hanya untuk demonstrasi)Meskipun ini baik-baik saja, ia memiliki beberapa spasi putih (yang secara pribadi saya tidak pernah suka melihatnya) dan memiliki banyak pengulangan (
=?v
dan.00n
). Alih-alih itu, Anda bisa menggunakan lompatan dan garis yang berbeda sebagai persyaratan Anda. Ini sebuah contoh:Ini mencukur 10 byte. Inilah yang terjadi:
i:
Kami menduplikasi input sekali sehingga kami dapat mengevaluasinya dua kali"a")$"b")+
Ini bisa menjadi tipnya sendiri, tetapi yang saya lakukan di sini adalah memeriksa untuk melihat apakah input lebih besar dari karakter "a" dan kemudian jika itu lebih besar daripada karakter "b" dan menambahkan hasilnya. Untuk "a," ini akan menghasilkan 0, untuk "b," 1, dan untuk "c," 2.1+0$.
Ini adalah dimana keajaiban terjadi; kita mengambil hasil dari penyederhanaan sebelumnya dan menambahkan 1 (memberi 1 untuk "a", 2 untuk "b", 3 untuk "c"), lalu tekan 0 dan tukar nilainya. Ketika kita mencapai lompatan, ini akan bergerak ke garis yang sesuai dengan nilai yang telah kita tetapkan untuk karakter-karakter tersebut (misalnya baris 1 untuk "a"). NB Baris 0 adalah bagian atas program.sumber
Menulis kode yang dapat menjalankan dua cara
Trampolin (
!
) sangat berguna ketika Anda ingin kode Anda dijalankan maju dan mundur (atau naik turun). Skenario ini agak tidak mungkin, tetapi untuk palindrome atau tantangan serupa tip ini bisa berguna.Berikut ini sebuah contoh: Saya ingin menjalankan beberapa kode sekali, kemudian loop melalui tumpukan membuang nilai sampai saya mencapai 0, dan kemudian turun. Pointer memasuki loop ini dari
>
. Anda dapat menggunakan lompatan untuk mencapai ini, misalnya?!v80.>ao
(katakanlah saya ingin mencetak baris baru terlebih dahulu)tetapi jika kode yang ingin kita jalankan satu kali (kode yang melewati
>
) membuat garis lebih panjang dari 16 karakter, kita tidak bisa lagi menggunakan lompatan dalam tiga karakter. Namun, ini adalah contoh di mana sepele untuk menjalankan maju dan mundur ...?!v!?<>ao>
Maju ke depan, kita mencetak baris baru dan kemudian menekan
?!v
yang membuang nilai jika bukan 0, maka karena trampolin kita lewati berikutnya?
dan pergi ke belakang. Hal yang sama terjadi dan loop berlanjut hingga kita menekan 0.Ini adalah contoh khusus yang aneh, tetapi ada beberapa (mungkin tidak banyak) aplikasi.
sumber