Wskazówki dotyczące gry w golfa w Brachylog

19

Brachylog to język, który ostatnio zyskuje na znaczeniu w grze w golfa kodu (właśnie otrzymał ważną aktualizację ze składnią terser). Podobnie jak Prolog, ma tę zaletę, że często może rozwiązać problem (zwykle za pomocą brutalnej siły) jedynie na podstawie wystarczająco dokładnego opisu problemu, co oznacza, że ​​przy właściwym rodzaju wyzwania jest często porównywalny z najpopularniejsze języki gry w golfa (od czasu do czasu pokonuje Jelly).

Jakie masz wskazówki dotyczące gry w golfa (np. Pisanie najkrótszych możliwych programów) Brachylog? Dotyczy to przede wszystkim porad specyficznych dla Brachylog, a nie porad dotyczących szerokiej gamy języków. (Wskazówki dotyczące gry w golfa w deklaratywnych językach w ogólności mogą być tutaj odpowiednie, w zależności od tego, ile aplikacji będą musiały stosować w językach innych niż Brachylog, chociaż zobacz także Wskazówki dotyczące gry w golfa w Prologu ).

Społeczność
źródło

Odpowiedzi:

4

Wykorzystaj zagnieżdżone predykaty, aby utworzyć nowe zmienne

Brachylog ma wiele specjalnych przypadków składni, dzięki czemu jego dwie zmienne specjalne ?(parametr wejściowy / lewy) i .(parametr wyjściowy / prawy) są bardziej użyteczne. Oznacza to, że jeśli nie potrzebujesz dostępu do predykatu ?i .potrzebujesz zmiennych, często możesz zapisać bajty, tworząc zagnieżdżony predykat, aby użyć jego ? i ..

Jako prosty przykład rozważmy program, który wygląda następująco:

… A … ∧A … B … B …

Jest to dość powszechny kształt dla dłuższego programu; w końcu istnieje wiele luk, które mogą zawierać wszystko. Załóżmy, że nie potrzebujemy ?ani nie ma .w środku trzech luk. Następnie możemy przepisać to w ten sposób:

… { … & … . … } …

Tutaj zagnieżdżony predykat ?pełni rolę Ai .pełni rolę B. Możemy zauważyć, że jest to bajt krótszy niż oryginalny kod; zmiana AABBna {?.}nie ma żadnej zmiany pod względem bajtów, ale pozwoliło nam to uprościć ∧?skrót &.

Pokrewną sztuczką jest zmiana

∧. … ?∧

do

~{ … }

(który jest o jeden bajt krótszy), chociaż zauważ, że prawie zawsze taniej jest zmusić rozmówcę do wymiany argumentów zamiast tego (chyba że predykat jest wywoływany z co najmniej trzech różnych miejsc w programie, co jest rzadkie w Brachylog).


źródło
3

Podziel predykaty długości-2 na metapredykaty

Można to najlepiej wyjaśnić przykładem. Aby usunąć pierwszy i ostatni element listy, ścinamy go i tniemy:

bk

Jeśli chcielibyśmy wykonać tę operację na każdym elemencie listy, możemy użyć operacji mapy:

{bk}ᵐ

Jednak bajt jest krótszy, aby podzielić predykat na dwa i mapować każdą część osobno:

bᵐkᵐ

Tej samej sztuczki można użyć z kilkoma metapredykatami:

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

Zauważ, że dla niektórych metapredykatów, takich jak , nie ma ogólnego sposobu na podzielenie go na dwie części, ale może być jednak możliwe znalezienie rozkładu, który działa dla konkretnego zadania, nad którym pracujesz.


źródło
3

Przesyłanie pustej listy do pustego ciągu

Czasami, pracując z łańcuchami, algorytm, którego używamy, może ujednolicić to, czego chcemy z pustą listą [], gdy wolimy pusty ciąg "".

Możemy przerzucić pustą listę do pustego ciągu za pomocą ,Ẹ, który dołącza pusty ciąg do jego lewej zmiennej (jest to sposób wykorzystania ,implementacji).

Ma to również tę zaletę, że nic nie robi, jeśli zmienna lewa jest łańcuchem. Więc jeśli twój program jest

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

Następnie

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

będzie działać tak, jak chcesz.

Fatalizować
źródło
2

Pojedynczy element działa na liście

Rozważ ten fragment:

ḅ∋≠

Jeśli dane wejściowe są listą lub łańcuchem, dane wyjściowe są zunifikowane z podlistą / podciągiem o długości 1, która nie jest częścią dłuższego ciągu równych elementów. Dzieli listę na bloki równych elementów i znajduje blok, którego elementy są różne. Aby uzyskać same elementy zamiast list singletonowych, zaznacz hdo końca. Użyłem tego konstruktu tutaj o oznalezienie znak, który występuje tylko raz w ciągu wejściowego.

Zgarb
źródło