Golftipps in Brachylog

19

Brachylog ist eine Sprache, die in letzter Zeit zunehmend im Code-Golf-Bereich im Vordergrund steht (und gerade ein umfangreiches Update mit einer Terser-Syntax erhalten hat). Wie Prolog hat es den Vorteil, dass es ein Problem oftmals (in der Regel mit brachialer Gewalt) nur anhand einer hinreichend genauen Beschreibung des Aussehens eines Problems lösen kann. Dies bedeutet, dass es bei der richtigen Art von Herausforderung häufig mit der vergleichbar ist Top-Golfsprachen (und von Zeit zu Zeit ist bekannt, dass sie Jelly schlagen).

Welche Tipps haben Sie für das Golfen (dh das Schreiben der kürzest möglichen Programme in) Brachylog? Dabei geht es hauptsächlich um Ratschläge, die speziell für Brachylog gelten, und nicht um Ratschläge, die für eine Vielzahl von Sprachen gelten. (Tipps zum Golfspielen in deklarativen Sprachen im Allgemeinen könnten hier möglicherweise angebracht sein, je nachdem, wie viel Anwendung sie auf andere Sprachen als Brachylog haben. Siehe auch Tipps zum Golfspielen in Prolog .)

Gemeinschaft
quelle

Antworten:

4

Nutzen Sie verschachtelte Prädikate, um neue Variablen zu erstellen

Brachylog verfügt über viele spezielle Syntaxfälle, um seine beiden speziellen Variablen ?(Eingabe / linker Parameter) und .(Ausgabe / rechter Parameter) kürzer zu gestalten. Dies bedeutet, dass Sie, wenn Sie nicht auf das ?und Ihres Prädikats zugreifen müssen ., sondern Variablen verwenden müssen, häufig Bytes speichern können, indem Sie ein verschachteltes Prädikat erstellen, um dessen ? und zu verwenden ..

Betrachten Sie als einfaches Beispiel ein Programm, das so aussieht:

… A … ∧A … B … B …

Dies ist eine ziemlich häufige Form für ein längeres Programm. Schließlich gibt es viele Lücken, die alles enthalten könnten. Angenommen, wir haben keine Notwendigkeit für ?oder .innerhalb der Mitte drei Lücken. Dann könnten wir es so umschreiben:

… { … & … . … } …

Hier erfüllt das verschachtelte Prädikat ?die Rolle von Aund das Prädikat .die Rolle von B. Wir können beobachten, dass dies ein Byte kürzer ist als der ursprüngliche Code; Das Ändern AABBauf {?.}hat keine Änderung in Bezug auf Bytes, aber dies erlaubte es uns ∧?, die Abkürzung zu vereinfachen &.

Ein verwandter Trick ist, sich zu ändern

∧. … ?∧

zu

~{ … }

(Das ist ein Byte kürzer), obwohl es fast immer billiger ist, den Aufrufer zum Austauschen der Argumente zu bewegen (es sei denn, das Prädikat wird an mindestens drei verschiedenen Stellen im Programm aufgerufen, was in Brachylog selten vorkommt).


quelle
3

Teilen Sie Prädikate der Länge 2 in Metapredikate auf

Dies lässt sich am besten anhand eines Beispiels erklären. Um das erste und das letzte Element einer Liste zu entfernen, entköpfen und schneiden wir es:

bk

Wenn wir diese Operation für jedes Element einer Liste ausführen möchten, können wir eine Kartenoperation verwenden:

{bk}ᵐ

Es ist jedoch ein Byte kürzer, um das Prädikat in zwei Teile aufzuteilen und jeden Teil einzeln zuzuordnen:

bᵐkᵐ

Der gleiche Trick kann mit einigen Metapredicates angewendet werden:

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

Beachten Sie, dass es für einige Metapredikate, wie z. B., keine allgemeine Möglichkeit gibt, sie in zwei Teile zu unterteilen. Es ist jedoch möglicherweise möglich, eine Zerlegung zu finden, die für die jeweilige Aufgabe geeignet ist, an der Sie arbeiten.


quelle
3

Die leere Liste in die leere Zeichenfolge umwandeln

Manchmal, wenn wir mit Strings arbeiten, kann der von uns verwendete Algorithmus vereinheitlichen, was wir wollen, mit der leeren Liste [], wenn wir lieber die leere Zeichenkette wollen "".

Wir können die leere Liste mit in die leere Zeichenkette ,Ẹumwandeln, wobei die leere Zeichenkette an die linke Variable angehängt wird (dies ist ein Exploit der Art und Weise, ,wie sie implementiert wird).

Dies hat auch den Vorteil, dass nichts unternommen wird, wenn die linke Variable ein String ist. Also, wenn Ihr Programm ist

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

Dann

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

wird so funktionieren wie du willst.

Tödlich
quelle
2

Einzelne Elemente werden in einer Liste ausgeführt

Betrachten Sie dieses Snippet:

ḅ∋≠

Wenn die Eingabe eine Liste oder eine Zeichenfolge ist, wird die Ausgabe mit einer Unterliste / Unterzeichenfolge der Länge 1 vereinheitlicht, die nicht Teil einer längeren Folge gleicher Elemente ist. Es teilt die Liste in Blöcke gleicher Elemente auf und findet einen Block, dessen Elemente alle unterschiedlich sind. Um die Elemente selbst anstelle von Singleton-Listen zu erhalten, gehen Sie hbis zum Ende. Ich habe dieses Konstrukt hier mit verwendet o, um ein Zeichen zu finden, das nur einmal in der Eingabezeichenfolge vorkommt.

Zgarb
quelle