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)
eval
perintah, saya belum pernah melihat bahasa seperti itu sebelumnya.Jawaban:
Gunakan
*
untuk outputKarena Anda dapat menampilkan dengan meninggalkan string di tumpukan , mungkin berguna untuk mengakumulasi string dengan menggunakan
*
daripada mengeluarkan denganS
. Katakanlah tantangan Anda adalah "ambil string dan tambahkan spasi", cara untuk melakukannya dengan output adalah: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.
sumber
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.sumber
^!!!!^
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.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.
sumber
(!)
dan(~!)
untuk boolean, tetapi cara Anda tampaknya lebih baik.Penurunan "Kotor"
Cara fungsional-murni untuk mengurangi angka Gereja adalah dengan menggunakan fungsi pendahulu kalkulus lambda:
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 beberapan
,:ⁿ!!()()*ⁿ
(di manacⁿ
yangc
diulangn
kali) 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.
sumber
(()~(:))~:(^!!())*~(*)~^**
masih lebih pendek 3 byte.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: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: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.sumber
(*)~a*^
, yang menurut saya sedikit lebih komposer. Intinya~a*^
adalahdip
perintah dari Joy.