¿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
@
let
ay 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 ... 0
lugar defirst
Para obtener el primer elemento de una colección, el uso de
(nth ... 0)
overfirst
guarda 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
:let
construcción, pero es demasiado detallado para el golf de código.fuente
Use
+
y en-
lugar deinc
ydec
Esto ahorra 1 byte si está usando
inc
/dec
en una expresión con parens:fuente
Use mapas en lugar de
if
s 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
partition
ofrequencies
varias veces, podría ser beneficioso vincularlos a un símbolo de un solo byte en unalet
macro. Por otra parte, puede que no valga la pena si no necesita lolet
contrario, 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 elmap
equivalente.fuente