¿Cuáles son sus consejos para el golf de código con Clojure?
El objetivo de esta pregunta es recopilar una lista de técnicas que son específicas de Clojure y que se pueden utilizar en problemas generales de código de golf.
También puede usar vectores como funciones, por lo que ([2 3 4]1)devuelve el elemento en el índice 1. Esto debería ser beneficioso si, por ejemplo, el formato de entrada es flexible.
NikoNyrh
1
Use aplicar en lugar de reducir
Por ejemplo, #(apply + %)es un byte más corto que #(reduce + %).
Use mapas en lugar de ifs cuando pruebe la igualdad
;; if n=3 then A else B
(if (= 3 n) A B) ; (if(=3n)AB)
({3 A} n B) ; ({3A}nB) -> -3 chars
;; if n=2 or n=3 then A else B
(if (#{2 3} n) A B) ; (if(#{23}n)AB)
({2 A 3 A} n B) ; ({2A3A}nB) -> -4 chars
Vincula los nombres de funciones largos en let a un símbolo de un solo byte
Por ejemplo, si necesita usarlo partitiono frequenciesvarias veces, podría ser beneficioso vincularlos a un símbolo de un solo byte en una letmacro. Por otra parte, puede que no valga la pena si no necesita lo letcontrario, y el nombre de la función es relativamente corto.
Respuestas:
Use la sintaxis del lector para lambdas.
Entonces usa
en lugar de
También puede eliminar espacios en blanco algunas veces:
fuente
#(+ % %2 %3)es equivalente a+.Donde puede eliminar espacios en blanco:
Entre una cuerda y cualquier otra cosa:
Entre paréntesis y cualquier otra cosa:
Entre un número y todo lo que no sean nombres incorporados o variables:
Entre
@(desreferencia para átomos) y paréntesis.fuente
@letay deshacerse de algunos espacios.#(+ 1(first%))=#(+ 1 (first %))Las cadenas se pueden tratar como una secuencia de caracteres
por ejemplo, para ordenar alfabéticamente los caracteres de una cadena:
fuente
Usar en
nth ... 0lugar defirstPara obtener el primer elemento de una colección, el uso de
(nth ... 0)overfirstguarda un byte:fuente
second(2 bytes)([2 3 4]1)devuelve el elemento en el índice 1. Esto debería ser beneficioso si, por ejemplo, el formato de entrada es flexible.Use aplicar en lugar de reducir
Por ejemplo,
#(apply + %)es un byte más corto que#(reduce + %).fuente
Evite dejar si ya tiene un para
Por ejemplo: en
#(for[a[(sort %)]...)lugar de#(let[a(sort %)](for ...)).Para también tiene una
:letconstrucción, pero es demasiado detallado para el golf de código.fuente
Use
+y en-lugar deincydecEsto ahorra 1 byte si está usando
inc/decen una expresión con parens:fuente
Use mapas en lugar de
ifs cuando pruebe la igualdadfuente
Vincula los nombres de funciones largos en let a un símbolo de un solo byte
Por ejemplo, si necesita usarlo
partitionofrequenciesvarias veces, podría ser beneficioso vincularlos a un símbolo de un solo byte en unaletmacro. Por otra parte, puede que no valga la pena si no necesita loletcontrario, y el nombre de la función es relativamente corto.fuente
Usar para en lugar de mapa
Por ejemplo,
#(for[i %](Math/abs i))es mucho más corto que elmapequivalente.fuente