Brachylog'da golf için ipuçları


19

Brachylog , son zamanlarda kod golfünde ön plana çıkmaya başlayan bir dildir (ve yeni bir ters sözdizimiyle büyük bir güncelleme aldı). Prolog gibi, bir problemi (tipik olarak kaba kuvvet yoluyla) sadece bir sorunun neye benzediğinin yeterince doğru bir tanımından, doğru zorluk türünde genellikle karşılaştırılabilir olduğu bir özellikten çözebilme avantajına sahiptir. en iyi golf dilleri (ve zaman zaman Jelly'i yendiği bilinmektedir).

Golf için ne gibi ipuçlarınız var (yani mümkün olan en kısa programları yazmak) Brachylog? Bu, çok çeşitli diller için geçerli tavsiyeler yerine, özellikle Brachylog'a özgü tavsiyeler arar. (Genel olarak bildirim dillerinde golf oynamaya ilişkin ipuçları , Brachylog dışındaki dillere ne kadar başvuru yapacaklarına bağlı olarak, burada potansiyel olarak uygun olabilir, ancak Prolog'da golf için ipuçları da bakın .)

Yanıtlar:


4

Yeni değişkenler oluşturmak için iç içe geçmiş tahminleri kullanın

Brachylog'un iki özel değişkenini ?(giriş / sol parametre) ve .(çıkış / sağ parametre) yapmak için birçok özel sözdizimi vakası vardır . Bu, yükleminize erişmeniz gerekmiyorsa ?ve .ancak değişkenleri kullanmanız gerekiyorsa , ? ve öğelerini kullanmak için iç içe bir yüklem oluşturarak baytları kaydedebileceğiniz anlamına gelir ..

Basit bir örnek olarak, şuna benzeyen bir programı düşünün:

… A … ∧A … B … B …

Bu, daha uzun bir program için oldukça yaygın bir şekildir; sonuçta, bir şey içerebilecek birçok boşluk var. Merkezdeki üç boşluğa ?veya .içine ihtiyacımız olmadığını varsayalım . Sonra şöyle yazabiliriz:

… { … & … . … } …

Burada, iç içe yüklem en ?görevini sürdürmekte Ave onun .görevini sürdürmekte B. Bunun orijinal koddan daha kısa bir bayt olduğunu gözlemleyebiliriz; Değişen AABBiçin {?.}bayt cinsinden herhangi bir değişiklik vardır, ama bu bizi basitleştirmek için izin ∧?kısaltmaya &.

İlgili bir hile değişmektir

∧. … ?∧

için

~{ … }

(bir bayt daha kısadır), ancak arayanın argümanları değiştirmesini sağlamak neredeyse her zaman daha ucuzdur (yüklem, programdaki Brachylog'da nadir olan en az üç farklı yerden çağrılmadığı sürece).


3

Bölünmüş uzunluk-2 metaforik içeride tahmin eder

Bu en iyi örnekle açıklanabilir. Bir listenin ilk ve son öğelerini kaldırmak için başını keser ve bıçaklarız:

bk

Bu işlemi bir listenin her öğesinde gerçekleştirmek istersek, bir harita işlemi kullanabiliriz:

{bk}ᵐ

Bununla birlikte, yüklemi ikiye bölmek ve her parçayı ayrı olarak eşlemek için bir bayt daha kısadır:

bᵐkᵐ

Aynı hile oldukça az sayıda metafor ile kullanılabilir:

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

Bazı metaforlar için, örneğin , iki parçaya bölmenin genel amaçlı bir yolu olmadığını, ancak yine de üzerinde çalıştığınız belirli bir görev için çalışan bir ayrışma bulmak mümkün olabilir.


3

Boş listeyi boş dizeye yayınlama

Bazen, dizelerle çalışırken, kullandığımız algoritma [], boş dizeyi istediğimizde boş listeyle istediğimizi birleştirebilir "".

,ẸBoş dizeyi sol değişkenine ekleyen boş dizeyi kullanarak boş dizeye dökebiliriz (bu ,, uygulanma biçiminin bir istismarıdır ).

Bu, sol değişken bir dize ise hiçbir şey yapmaması avantajına sahiptir. Yani, eğer programınız

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

Sonra

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

istediğiniz şekilde çalışacaktır.


2

Tek eleman bir listede çalışır

Bu snippet'i düşünün:

ḅ∋≠

Giriş bir liste veya dize ise, çıktı, daha uzun eşit değer öğesinin parçası olmayan 1 uzunluğunda bir alt liste / alt dize ile birleştirilir. Listeyi eşit eleman bloklarına ayırır ve elemanları farklı olan bir blok bulur. Tekil listeler yerine öğeleri kendileri almak hiçin sonuna kadar yapıştırın . Bu yapıyı kullanılan buraya ile osadece giriş dizesi kez şişer bir karakteri bulmak için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.