Kiat-kiat untuk bermain golf di Brachylog

19

Brachylog adalah bahasa yang mulai menonjol dalam kode-golf baru-baru ini (dan baru saja menerima pembaruan utama dengan sintaks terser). Seperti Prolog, prolog memiliki keunggulan yang sering dapat memecahkan masalah (biasanya melalui kekuatan kasar) hanya dari deskripsi yang cukup akurat tentang seperti apa masalah itu, sebuah fitur yang berarti bahwa pada jenis tantangan yang tepat, sering sebanding dengan bahasa golf top (dan telah dikenal mengalahkan Jelly dari waktu ke waktu).

Kiat apa yang Anda miliki untuk bermain golf (yaitu menulis program yang sesingkat mungkin di) Brachylog? Ini sebagian besar mencari saran yang khusus untuk Brachylog pada khususnya, daripada saran yang berlaku untuk berbagai bahasa. (Kiat tentang bermain golf dalam bahasa deklaratif secara umum mungkin cocok di sini, tergantung pada seberapa banyak aplikasi yang harus mereka miliki untuk bahasa selain Brachylog, meskipun lihat juga Kiat untuk bermain golf di Prolog .)

Komunitas
sumber

Jawaban:

4

Memanfaatkan predikat bersarang untuk membuat variabel baru

Brachylog memiliki banyak kasus sintaksis khusus untuk membuat dua variabel khusus, ?(input / parameter kiri) dan .(output / parameter kanan), terser untuk digunakan. Ini berarti bahwa jika Anda tidak perlu mengakses predikat Anda ?dan ., tetapi lakukan perlu variabel digunakan, Anda dapat sering menyimpan byte melalui menciptakan predikat bersarang untuk menggunakan nya ? dan ..

Sebagai contoh sederhana, pertimbangkan program yang terlihat seperti ini:

… A … ∧A … B … B …

Ini adalah bentuk yang cukup umum untuk program yang lebih lama; lagipula, ada banyak celah yang bisa mengandung apa saja. Misalkan kita tidak perlu ?atau .di dalam celah tiga pusat. Lalu kita bisa menulis ulang seperti ini:

… { … & … . … } …

Di sini, predikat bersarang ?adalah melayani peran A, dan .melayani peran B. Kita dapat mengamati bahwa ini adalah byte yang lebih pendek dari kode aslinya; mengubah AABBke {?.}tidak memiliki perubahan dalam hal byte, tetapi ini memungkinkan kami untuk menyederhanakan ∧?singkatan &.

Trik terkait adalah mengubah

∧. … ?∧

untuk

~{ … }

(yang satu byte lebih pendek), meskipun perhatikan bahwa hampir selalu lebih murah untuk membuat penelepon bertukar argumen sebagai gantinya (kecuali predikat dipanggil dari setidaknya tiga tempat berbeda dalam program, yang jarang terjadi di Brachylog).


sumber
3

Membagi dua predikat panjang di dalam metapredicate

Ini paling baik dijelaskan dengan contoh. Untuk menghapus elemen pertama dan terakhir dari daftar, kami memotong dan memotongnya:

bk

Jika kami ingin melakukan operasi ini pada setiap elemen daftar, kami dapat menggunakan operasi peta:

{bk}ᵐ

Namun, ini satu byte lebih pendek untuk membagi predikat menjadi dua, dan memetakan setiap bagian secara terpisah:

bᵐkᵐ

Trik yang sama dapat digunakan dengan beberapa metapredicate:

{bk}ᵐ  →  bᵐkᵐ
{bk}ˢ  →  bˢkˢ
{bk}ᶠ  →  bᶠkˢ
~{bk}  →  ~k~b

Perhatikan bahwa untuk beberapa metapredicate, seperti , tidak ada cara tujuan umum untuk membaginya menjadi dua bagian, tetapi tetap mungkin untuk menemukan dekomposisi yang berfungsi untuk tugas spesifik yang sedang Anda kerjakan.


sumber
3

Casting daftar kosong ke string kosong

Terkadang, ketika bekerja dengan string, algoritma yang kita gunakan mungkin menyatukan apa yang kita inginkan dengan daftar kosong [], ketika kita lebih suka string kosong "".

Kita bisa melemparkan daftar kosong ke string kosong menggunakan ,Ẹ, yang menambahkan string kosong ke variabel kirinya (ini adalah eksploitasi dari cara ,diimplementasikan).

Ini juga memiliki keuntungan bahwa ia tidak melakukan apa pun jika variabel kiri adalah string. Jadi, jika program Anda

{  
   some predicate that should always output a string, 
   but actually outputs [] instead of "" in specific cases
}

Kemudian

{
  some predicate that should always output a string, 
  but actually outputs [] instead of "" in specific cases
},Ẹ

akan bekerja seperti yang Anda inginkan.

Fatalisasi
sumber
2

Elemen tunggal berjalan dalam daftar

Pertimbangkan cuplikan ini:

ḅ∋≠

Jika input adalah daftar atau string, output disatukan dengan sublist / substring dengan panjang 1 yang bukan bagian dari jangka panjang elemen yang sama. Ini membagi daftar menjadi blok elemen yang sama dan menemukan blok yang elemennya berbeda. Untuk mendapatkan elemen itu sendiri, bukan daftar tunggal, tempelkan hsampai akhir. Saya menggunakan konstruksi ini di sini dengan ountuk menemukan karakter yang terjadi hanya sekali dalam string input.

Zgarb
sumber