Tips umum apa yang Anda miliki untuk bermain golf di Befunge? Saya mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk Befunge (mis. "Hapus komentar" bukan jawaban). Silakan kirim satu tip per jawaban.
12
Jawaban:
Saat menggunakan multi-line loop, coba gunakan sebanyak mungkin:
vs.
sumber
Perlu memberikan nilai setelah kondisi (misalnya karena jalur lain tergantung pada nilai, tetapi yang ini tidak)? Alih-alih menggunakan
>$
atau$<
, ambillah fakta bahwa Anda mengetahui nilai kebenaran variabel dan gunakan_
sebagai gantinya untuk mengubah arah dan pop stack.Contoh
akan berubah menjadi
sumber
Jangan lupa itu
0
selalu ada di tumpukan. Misalnya, ini berarti bahwa, dengan tumpukan kosong,g
sama dengan00g
danp
setara dengan000p
.sumber
Jika Anda perlu menekan angka yang lebih besar dari 15, gunakan
'
untuk mengambil nilai ASCII dari karakter berikutnya:untuk mendorong 42 daripada:
sumber
67*
berhasil juga'
instruksi.Alih-alih menggunakan
|
, membutuhkan baris lain (seringkali dengan banyak ruang tambahan), coba gunakanj
. Sebagai contoh:akan berhenti jika nomor di atas tumpukan negatif dan teruskan sebaliknya. Jika Anda membutuhkan beberapa karakter, gunakan di
n*j
manan
jumlah karakter yang Anda butuhkan ketika nilai diteruskanj
adalah0
. Contoh:yang akan meniadakan angka negatif.
sumber
j
instruksi.Di Befunge-93, jika hal pertama yang Anda mendorong ke tumpukan adalah string, Anda sering bisa lolos dengan menjatuhkan kutipan pembuka. Sebagai contoh ini:
dapat disederhanakan menjadi ini:
Cobalah online!
Apa yang terjadi adalah penerjemah pertama kali mencoba mengeksekusi karakter dalam string yang tidak dikutip. The
!
Melakukan berbahaya yang tidak , dani
danH
tidak petunjuk valid, jadi mereka diabaikan (meskipun pada beberapa implementasi Anda mungkin mendapatkan peringatan).Ketika
"
ditemui, yang dianggap sebagai awal dari string, tetapi karena tidak ada kutipan penutup, itu membungkus sepanjang jalan di sekitar lapangan bermain sampai"
ditemui kedua kalinya. Apa yang akhirnya didorong ke tumpukan adalah ini:Karena kami hanya peduli pada beberapa karakter terakhir, tidak ada satu pun dari hal-hal lain yang penting. Jadi setelah kutipan, kita akhirnya bisa menjalankan tiga
,
perintah, menuliskan pesan, dan@
perintah, yang keluar.Perhatikan bahwa ini biasanya tidak akan berfungsi di Befunge-98, karena instruksi yang tidak dikenali akan menyebabkan penerjemah untuk mencerminkan alih-alih mengabaikannya.
sumber
",,,@!iH
. Perhatikan bahwa Pyfunge menambahkan ruang ekstra, sementara FBBI tidak.Dalam Befunge-93, sering kali menguntungkan untuk meratakan loop menjadi satu baris, dengan bagian loop kode dieksekusi di kedua arah.
Misalnya, perhatikan kode di bawah ini, yang menghasilkan huruf
a
delapan kali:Ini dapat diratakan menjadi satu baris dengan memotong urutan loop dengan instruksi bridge (
#
):Cobalah online!
Jika Anda hanya melihat karakter non-spasi, Anda mungkin mendapat kesan bahwa ini lebih panjang dari aslinya. Tetapi begitu Anda memperhitungkan umpan baris dan bantalan tambahan yang diperlukan dalam versi dua baris, Anda sebenarnya menghemat empat byte.
Dalam kasus khusus ini, kode tersebut dikompres lebih jauh dengan mencatat bahwa urutan tersebut
:#:
dapat diganti dengan:
.Cobalah online!
Bahkan, setiap kali Anda memiliki instruksi yang sama diulang di kedua sisi
#
perintah, Anda bisa menyederhanakannya menjadi hanya satu instruksi, jadi ini adalah sesuatu yang harus selalu Anda perhatikan ketika meratakan sebuah loop.Untuk memahami bagaimana ini bekerja, dapat membantu untuk menuliskan urutan loop dua kali, sekali dengan semua karakter setelah
#
dihapus (yaitu apa yang terjadi ketika mengeksekusi kiri ke kanan), dan sekali dengan karakter sebelum#
dihapus (yaitu mengeksekusi kanan ke kiri ).Anda dapat dengan jelas melihat sekarang bagaimana ini cocok dengan versi dua baris asli dari kode.
sumber
Keluaran dengan kode keluar, di mana ini merupakan formulir keluaran yang diizinkan. Jika tantangan meminta Anda untuk mencetak satu nomor, Anda dapat menyimpan byte dengan mengakhiri program dengan
q
alih - alih.@
sumber
q
instruksi memiliki fungsi yang berbeda (mode antrian) atau tidak didukung.Di Befunge-93, perintah input karakter (
~
) sering dapat digunakan sebagai jalan pintas untuk -1, karena itu adalah nilai yang dikembalikan pada EOF.Sebagai contoh, kode di bawah ini akan menampilkan -1:
Cobalah online!
Ini tidak direkomendasikan dalam kode produksi, karena ketika dijalankan dalam lingkungan yang interaktif, program akan berhenti dan menunggu input pengguna. Dan jelas jika pengguna memasukkan sesuatu, hasilnya tidak lagi -1.
Yang mengatakan, aturan pada PPCG adalah bahwa suatu program dapat mengasumsikan aliran input kosong , dan itulah yang biasanya dijalankan pada TIO .
Perhatikan juga bahwa Anda tidak perlu dilarang menggunakan trik ini hanya karena program Anda perlu membaca sesuatu dari aliran input. Anda hanya perlu memastikan bahwa Anda memproses input Anda di muka, setelah itu semua penggunaan masa depan
~
harus mengembalikan -1.sumber
Gunakan arah IP ketika berhadapan dengan
_
atau|
, daripada menggunakan karakter tambahan untuk!
.Contoh nyata (dari pos ini ):
Dapat diubah menjadi
sumber
Jangan lupa itu
0k
tidak menjalankan instruksi selanjutnya. Ini berarti bahwa alih-alih melakukan:Anda dapat menyimpan karakter dengan melakukan
sumber
k
instruksi.Jangan lupa tentang
k
operatornya. Alih-alih"!dlroW olleH",,,,,,,,,,,,@
, lakukan"!dlroW olleH"bk,@
. Perhatikan bahwak
tidak operasi pada sel yang berada pada jadi9k,
akan mencetak tidak 9 kali tapi 10; 9 kali dengank
, dan sekali dengan,
.sumber
k
instruksi.Saat memasukkan angka-angka kecil ke tumpukan, Anda mungkin dapat dengan mudah menemukan yang
45*
akan membuat Anda20
, dan67*
akan membuat Anda42
. Namun, jika menyangkut angka yang lebih besar, Anda benar-benar membutuhkan program yang dapat menghitung representasi paling efisien untuk Anda.Opsi termudah untuk ini adalah antarmuka online Mike Schwörer untuk BefunRep . Anda cukup mengetik angka dan itu akan memuntahkan representasi Befunge yang setara. Ini tidak selalu yang paling optimal, tetapi cukup dekat, dan hampir pasti lebih baik dari apa pun yang Anda dapat lakukan dengan tangan.
Sistem online terbatas pada angka dalam kisaran 0 hingga 16777215, jadi jika Anda memerlukan sesuatu yang lebih besar dari itu, Anda ingin mengunduh utilitas BefunRep mandiri dan menjalankan kalkulasi sendiri.
Jika Anda memprogram di Befunge-98, opsi lain untuk dipertimbangkan adalah Fungify . Secara umum ini hampir tidak seoptimal BefunRep, tetapi untuk beberapa angka yang lebih rendah, di mana angka hex dan karakter kutipan tunggal paling efektif, kadang-kadang dapat menghasilkan hasil yang lebih baik.
sumber
'
. Misalnya untuk42
:'*