Kiat untuk bermain golf di Underload


11

Underload adalah tarpit semi-fungsional semi-fungsional yang dibuat oleh ais523 . Saya baru-baru ini mencoba bermain golf di dalamnya, karena itu adalah bahasa yang sangat elegan.

Kiat apa yang Anda miliki untuk bermain golf di Underload? (Satu tip per jawaban)


Saya suka bahwa satu-satunya bentuk aliran kontrol adalah sebuah evalperintah, saya belum pernah melihat bahasa seperti itu sebelumnya.
ETHproduk

Jawaban:


3

Gunakan *untuk output

Karena Anda dapat menampilkan dengan meninggalkan string di tumpukan , mungkin berguna untuk mengakumulasi string dengan menggunakan *daripada mengeluarkan dengan S. Katakanlah tantangan Anda adalah "ambil string dan tambahkan spasi", cara untuk melakukannya dengan output adalah:

S( )S

Cara melakukannya dengan *, di sisi lain adalah satu byte lebih pendek:

( )*

Masalahnya adalah bahwa jika output Anda memiliki banyak akumulasi, mungkin biaya byte untuk berurusan dengan elemen output pada stack.


2

Gunakan kamus fungsi yang digunakan berulang kali

Jika Anda perlu sering menggunakan sepotong kode, masuk akal untuk menyimpan kode itu di tumpukan dan menduplikasinya setiap saat. Sejauh ini, itu hanya pemrograman Underload normal. Sayangnya, menjaga nilai di tumpukan untuk waktu yang lama sulit dan cenderung menyebabkan kode Anda menjadi bertele-tele, dan itu benar bahkan jika nilainya adalah fungsi daripada data. Ini menjadi jauh lebih buruk jika Anda memiliki beberapa fungsi yang perlu digunakan kembali berulang kali.

Dalam jenis program yang lebih besar yang mungkin mendapat manfaat dari beberapa fungsi yang digunakan kembali, solusi yang dapat Anda gunakan adalah alih-alih membuat satu fungsi besar yang dapat memenuhi tujuan mereka tergantung pada cara namanya (baik berdasarkan apa yang ada di bawahnya di stack, atau melalui menggunakan lagi memanggil urutan dari sekedar ^; fungsi ditulis dengan hati-hati dapat membedakan ^^dari ^:^dari ^*^dari ^~^, memberikan Anda empat yang berbeda, urutan cukup singkat). Anda juga dapat menyimpan hal-hal berguna lainnya, seperti string yang Anda gunakan beberapa kali, dalam "kamus" ini. Perhatikan bahwa jika Anda menggunakan kamus banyak, mungkin masuk akal untuk membuatnya menjadi semacam quine, mendorong salinan dirinya sendiri kembali ke tumpukan, sehingga Anda tidak perlu menyalinnya secara manual dengan: untuk dapat menggunakannya tanpa kehilangan kemampuan untuk menggunakannya di masa depan.


Saya akan menjadi gila jauh sebelum saya mendapatkan program apa pun yang cukup besar di Underload sehingga ini menjadi masalah: P
Esolanging Fruit

Saya pernah menulis beberapa contoh di halaman esolangs tentang bagaimana membuat kamus dengan ^!!!!^pencarian gaya pilihan saya (yang saya juga gunakan dalam beberapa contoh lain pada halaman, terutama di bagian minimisasi.) Meskipun itu mungkin tidak memberikan pencarian terpendek.
Ørjan Johansen

2

Pilih format data khusus untuk operasi yang dibutuhkan masalah

Sebagai contoh sederhana, implementasi booleans yang paling umum terlihat adalah !()false (yaitu integer 0), dan string nol untuk true (yaitu integer 1), tetapi jika Anda memiliki masalah yang sangat didasarkan pada XOR logis, itu mungkin membuat lebih banyak akal untuk menggunakan string nol untuk false, dan ~untuk true (format data ini dapat dikonversi menjadi format boolean lainnya menggunakan (false)~(true)~^!, dan memungkinkan implementasi yang sangat singkat *untuk XOR.

Dimungkinkan untuk mengambil prinsip umum ini lebih jauh dan menggunakan fungsi-fungsi yang diperlukan oleh program Anda nanti sebagai bagian dari nilai data Anda; yang menyimpan harus menyimpan fungsi dan data secara terpisah di tumpukan. Ini dapat membuat aliran kontrol agak membingungkan, tetapi ketika bermain golf, perawatan seringkali harus mengambil kursi belakang, dan itu tidak seperti Underload yang bisa digunakan.


Saya dulu menggunakan (!)dan (~!)untuk boolean, tetapi cara Anda tampaknya lebih baik.
Buah Esolanging

2

Penurunan "Kotor"

Cara fungsional-murni untuk mengurangi angka Gereja adalah dengan menggunakan fungsi pendahulu kalkulus lambda:

\n.n(\p.\z.z($(pT))(pT))(\z.z0[whatever you define the predecessor of 0 to be])

Di mana 0 = \ x. \ Yy, T = \ x. \ Yx, dan $ adalah penggantinya.

Ditulis ulang dalam Underload, ini adalah 28 byte:

(!())~(!())~(!:(:)~*(*)*~)~^!

Ini baik-baik saja, tetapi kita dapat mengeksploitasi beberapa properti berguna Underload, yaitu itu :!dan ()*lakukan adalah tanpa operasi. Ini berarti bahwa, untuk beberapa n, :ⁿ!!()()*ⁿ(di mana cⁿyang cdiulang nkali) menghasilkan n-1. Misalnya melakukan ini untuk angka 3 Gereja menghasilkan ini:

:::!!()()***

Menghapus pasang no-op, kita dapatkan:

:*

Yaitu 2.

Jadi ini adalah operasi pendahulu yang baru dan lebih pendek:

:(:)~^(!!()())*~(*)~^*

Ini lebih pendek 7 byte.


Itu rusak pada n = 0 sekalipun. Jika Anda membutuhkannya untuk bekerja, (()~(:))~:(^!!())*~(*)~^** masih lebih pendek 3 byte.
Ørjan Johansen

@ ØrjanJohansen Secara umum, Anda akan memiliki kasus khusus untuk n = 0, karena dengan angka Underload mengurangi 0 tidak masuk akal.
Buah Esolanging

1

Masukkan Nilai Stack yang Tidak Diinginkan ke dalam Ruang Program

Underload sebenarnya memiliki dua tumpukan — tumpukan string, dan tumpukan perintah yang menyusun kode sumber. Instruksi Underload ^memungkinkan kita memindahkan string dari tumpukan sebelumnya ke tumpukan kedua. Dengan melakukan ini, kita dapat menyimpan banyak manipulasi tumpukan yang tidak perlu.

Sebagai contoh, katakanlah kita memiliki (a)(b)(c)di tumpukan utama dan kami ingin menggabungkan dua elemen bawah, mengabaikan (c), untuk mendapatkan (ab)(c). Cara naif untuk melakukan ini adalah memutar tumpukan untuk mendapatkan (c)(a)(b)dan kemudian setuju dan bertukar kembali:

a~a~*~a*^*~

Ini buruk. Menggunakan a~a~*~a*^untuk memutar tumpukan seperti ini sangat mahal, dan harus dihindari jika memungkinkan. Dengan menempatkan (c)ke dalam ruang program sebagai gantinya, ini dapat dibuat empat byte lebih pendek:

a(*)~*^

Idenya adalah untuk mengambil instruksi yang ingin Anda jalankan dan kemudian menambahkan instruksi untuk mendorong (c)kembali di akhir, dan kemudian mengevaluasi hasilnya. Ini berarti bahwa kita tidak perlu khawatir (c)sampai itu didorong kembali setelah kita selesai.


1
Anda juga dapat menuliskannya sebagai (*)~a*^, yang menurut saya sedikit lebih komposer. Intinya ~a*^adalah dipperintah dari Joy.
Ørjan Johansen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.