Consejos para jugar golf en Brachylog

19

Brachylog es un lenguaje que está comenzando a aumentar en importancia en el golf de códigos recientemente (y acaba de recibir una actualización importante con una sintaxis terser). Al igual que Prolog, tiene la ventaja de que a menudo puede resolver un problema (generalmente a través de la fuerza bruta) simplemente a partir de una descripción suficientemente precisa de cómo se ve un problema, una característica que significa que en el tipo correcto de desafío, a menudo es comparable al principales idiomas de golf (y se sabe que venció a Jelly de vez en cuando).

¿Qué consejos tiene para jugar al golf (es decir, escribir los programas más cortos posibles) en Brachylog? Esto busca principalmente consejos específicos de Brachylog en particular, en lugar de consejos aplicables a una amplia gama de idiomas. (Las sugerencias sobre el golf en idiomas declarativos en general podrían ser apropiadas aquí, dependiendo de la cantidad de aplicación que tendrán en otros idiomas además de Brachylog, aunque consulte también Sugerencias para jugar golf en Prolog ).

Comunidad
fuente

Respuestas:

4

Explotar predicados anidados para crear nuevas variables

Brachylog tiene muchos casos de sintaxis especiales para hacer que sus dos variables especiales, ?(parámetro de entrada / izquierda) y .(parámetro de salida / derecha), terser para usar. Esto significa que si no necesita acceder a su predicado ?y ., pero necesita usar variables, a menudo puede guardar bytes creando un predicado anidado para usar su ? y ..

Como un ejemplo simple, considere un programa que se vea así:

… A … ∧A … B … B …

Esta es una forma bastante común para un programa más largo; después de todo, hay muchas lagunas que podrían contener cualquier cosa. Supongamos que no tenemos necesidad ?ni .dentro del centro de tres espacios. Entonces podríamos reescribirlo así:

… { … & … . … } …

Aquí, el predicado anidado ?cumple la función de Ay .cumple la función de B. Podemos observar que este es un byte más corto que el código original; cambiar AABBa {?.}no tiene ningún cambio en términos de bytes, pero esto nos permitió simplificar ∧?la abreviatura &.

Un truco relacionado es cambiar

∧. … ?∧

a

~{ … }

(que es un byte más corto), aunque tenga en cuenta que casi siempre es más barato hacer que la persona que llama intercambie los argumentos (a menos que se llame al predicado desde al menos tres lugares diferentes en el programa, lo cual es raro en Brachylog).


fuente
3

Dividir predicados de longitud 2 dentro de metapredicados

Esto se explica mejor con un ejemplo. Para eliminar el primer y el último elemento de una lista, lo decapitamos y lo cuchillo:

bk

Si quisiéramos realizar esta operación en cada elemento de una lista, podemos usar una operación de mapa:

{bk}ᵐ

Sin embargo, es un byte más corto para dividir el predicado en dos y mapear cada parte por separado:

bᵐkᵐ

El mismo truco se puede usar con bastantes metapredicados:

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

Tenga en cuenta que para algunos metapredicados, por ejemplo , no existe una forma de propósito general para dividirlo en dos partes, pero de todos modos es posible encontrar una descomposición que funcione para la tarea específica en la que está trabajando.


fuente
3

Transmitir la lista vacía a la cadena vacía

A veces, cuando trabajamos con cadenas, el algoritmo que utilizamos puede unificar lo que queremos con la lista vacía [], cuando preferimos que la cadena esté vacía "".

Podemos lanzar la lista vacía a la cadena vacía usando ,Ẹ, que agrega la cadena vacía a su variable izquierda (esta es una explotación de la forma en que ,se implementa).

Esto también tiene la ventaja de que no hace nada si la variable izquierda es una cadena. Entonces, si su programa es

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

Luego

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

funcionará de la manera que desee.

Fatalizar
fuente
2

El elemento único se ejecuta en una lista

Considere este fragmento:

ḅ∋≠

Si la entrada es una lista o cadena, la salida se unifica con una sublista / subcadena de longitud 1 que no forma parte de una ejecución más larga de elementos iguales. Divide la lista en bloques de elementos iguales y encuentra un bloque cuyos elementos son todos diferentes. Para obtener los elementos en sí mismos en lugar de listas de un solo tono, avance hhasta el final. He utilizado este constructo aquí con oencontrar un personaje que aparece sólo una vez en la cadena de entrada.

Zgarb
fuente