Tips untuk bermain golf di Befunge

12

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.

Justin
sumber
Saya tidak yakin apakah ini harus diubah menjadi Befunge secara umum, tetapi Befunge 93 jauh lebih tidak ideal untuk bermain golf daripada 98.
Justin
6
Kami memiliki topik Befunge 93 baru-baru ini , tetapi saya pikir akan lebih baik untuk menggeneralisasi topik ini sebagai gantinya. Apakah itu baik-baik saja? (dan mungkin tandai kiat mana yang baik untuk versi mana, dengan cara yang sama dengan kiat Python mengatakan apakah itu Python 2 / Python 3 spesifik)
Sp3000

Jawaban:

9

Saat menggunakan multi-line loop, coba gunakan sebanyak mungkin:

>1234....v
^        <

vs.

>1234v
^....<
Justin
sumber
7

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

'* : v           >$ .. @          Prints number in binary followed by the original
                                  decimal number.
     > :2%\2/ :!#^_ \.

akan berubah menjadi

'* : v           _  .. @          Since we know that the topmost value on the stack
                                  will be 0, we combine `>$` into `_`.
     > :2%\2/ :!#^_ \.
FireFly
sumber
6

Jangan lupa itu 0selalu ada di tumpukan. Misalnya, ini berarti bahwa, dengan tumpukan kosong, gsama dengan 00gdan psetara dengan 000p.

Justin
sumber
5

Jika Anda perlu menekan angka yang lebih besar dari 15, gunakan 'untuk mengambil nilai ASCII dari karakter berikutnya:

'*

untuk mendorong 42 daripada:

4a*2+
Justin
sumber
Atau, 67*berhasil juga
Gagang Pintu
4
@ Doorknob Mungkin saya harus memilih bilangan prima untuk menyampaikan maksud saya dengan lebih jelas, tetapi 42 adalah bilangan yang sangat bagus.
Justin
2
Perhatikan bahwa tip ini hanya berlaku untuk Befunge-96 dan yang lebih baru. Befunge-93 tidak mendukung 'instruksi.
James Holderness
4

Alih-alih menggunakan |, membutuhkan baris lain (seringkali dengan banyak ruang tambahan), coba gunakan j. Sebagai contoh:

01-`j@more code here

akan berhenti jika nomor di atas tumpukan negatif dan teruskan sebaliknya. Jika Anda membutuhkan beberapa karakter, gunakan di n*jmana njumlah karakter yang Anda butuhkan ketika nilai diteruskan jadalah 0. Contoh:

01-`4*j01-*more code

yang akan meniadakan angka negatif.

Justin
sumber
Perhatikan bahwa tip ini hanya berlaku untuk Befunge-96 dan yang lebih baru. Befunge-93 tidak mendukung jinstruksi.
James Holderness
4

Di Befunge-93, jika hal pertama yang Anda mendorong ke tumpukan adalah string, Anda sering bisa lolos dengan menjatuhkan kutipan pembuka. Sebagai contoh ini:

"!iH",,,@

dapat disederhanakan menjadi ini:

!iH",,,@

Cobalah online!

Apa yang terjadi adalah penerjemah pertama kali mencoba mengeksekusi karakter dalam string yang tidak dikutip. The !Melakukan berbahaya yang tidak , dan idan Htidak 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:

,,,@  ···72 spaces···  !iH

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.

James Holderness
sumber
Di Befunge-98 Anda bisa meletakkan string yang diperlukan di akhir baris, seperti itu; ",,,@!iH. Perhatikan bahwa Pyfunge menambahkan ruang ekstra, sementara FBBI tidak.
Jo King
@JoKing Saya tidak ingin menyarankan itu, karena, seperti yang Anda tunjukkan, perilakunya berbeda dari satu penerjemah ke penerjemah berikutnya. Dan bahkan ketika tampaknya berfungsi, itu tidak konsisten (perhatikan ruang ekstra dalam FBBI dalam kasus ini ), jadi sangat mungkin bug yang mungkin akhirnya diperbaiki pada beberapa titik.
James Holderness
Hmm ... Saya pikir ruang sebenarnya mungkin menjadi bagian dari spesifikasi. Saya ingat pernah membaca di suatu tempat bahwa banyak ruang akan dilewati dan dihitung sebagai satu ruang. Contoh di PyFunge dan FBBI. FBBI tampaknya membalut setiap baris dengan panjang garis terpanjang sementara PyFunge menambahkan ruang ekstra secara implisit.
Jo King
Anda benar - spek mengatakan bahwa beberapa spasi dalam string harus diperlakukan sebagai ruang tunggal. Bahkan aturan itu secara khusus diusulkan untuk menangani masalah membungkus string di lapangan bermain tanpa batas (sehingga PyFunge jelas AFAIC benar). Tetapi deskripsi spesifikasi tentang algoritma pembungkus agak terbuka untuk interpretasi, jadi saya bisa mengerti mengapa beberapa implementasi mungkin melakukan hal-hal yang berbeda. Tetapi intinya adalah ini adalah masalah yang cukup rumit, dan saya pikir akan lebih baik dibahas sebagai tip terpisah khusus untuk Befunge-97/98.
James Holderness
4

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 adelapan kali:

"a"9>1-:#v_@
    ^\,:\<

Ini dapat diratakan menjadi satu baris dengan memotong urutan loop dengan instruksi bridge ( #):

"a"9>1#\-#,:#:>#\_@

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 :.

"a"9>1#\-#,:>#\_@

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 ).

"a"9>1#\-#,:>#\_@
    >1  -  :>  _      ; executing left to right
    >  \  ,:  \_      ; executing right to left

Anda dapat dengan jelas melihat sekarang bagaimana ini cocok dengan versi dua baris asli dari kode.

James Holderness
sumber
3

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 qalih - alih.@

pppery
sumber
2
Perhatikan bahwa tip ini hanya berlaku untuk Befunge-98 dan yang lebih baru. Dalam versi Befunge sebelumnya qinstruksi memiliki fungsi yang berbeda (mode antrian) atau tidak didukung.
James Holderness
3

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.

James Holderness
sumber
2

Gunakan arah IP ketika berhadapan dengan _atau |, daripada menggunakan karakter tambahan untuk !.

Contoh nyata (dari pos ini ):

#v~
,>:!#@_

Dapat diubah menjadi

#v~
:<,_@#
Justin
sumber
2

Jangan lupa itu 0ktidak menjalankan instruksi selanjutnya. Ini berarti bahwa alih-alih melakukan:

;some boolean test;!jv;code if false;
       ;code if true;<

Anda dapat menyimpan karakter dengan melakukan

;some boolean test;kv;code if false;
      ;code if true;<
Justin
sumber
Perhatikan bahwa tip ini hanya berlaku untuk Befunge-98 dan yang lebih baru. Versi Befunge sebelumnya tidak mendukung kinstruksi.
James Holderness
1

Jangan lupa tentang koperatornya. Alih-alih "!dlroW olleH",,,,,,,,,,,,@, lakukan "!dlroW olleH"bk,@. Perhatikan bahwa ktidak operasi pada sel yang berada pada jadi 9k,akan mencetak tidak 9 kali tapi 10; 9 kali dengan k, dan sekali dengan ,.

Justin
sumber
1
Perhatikan bahwa tip ini hanya berlaku untuk Befunge-98 dan yang lebih baru. Versi Befunge sebelumnya tidak mendukung kinstruksi.
James Holderness
1

Saat memasukkan angka-angka kecil ke tumpukan, Anda mungkin dapat dengan mudah menemukan yang 45*akan membuat Anda 20, dan 67*akan membuat Anda 42. 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.

James Holderness
sumber
Saat mendorong angka kecil di Befunge 98, Anda akan menggunakannya '. Misalnya untuk 42:'*
Justin
@ Justin Saya telah menyebutkannya di paragraf terakhir, tetapi inti dari tip ini adalah Anda tidak perlu tahu banyak trik ini untuk menghasilkan angka jika Anda hanya menggunakan alat untuk melakukannya untuk Anda.
James Holderness