Quels sont vos conseils pour jouer au golf à l'aide de Clojure?
Le but de cette question est de rassembler une liste de techniques spécifiques à Clojure et pouvant être utilisées dans des problèmes généraux de golf de code.
Les chaînes sont par définition une séquence de caractères dans presque toutes les langues, mais vous ne pouvez pas appliquer cette astuce dans toutes :-)
mellamokb
3
Ou plutôt, "séquence" a une signification particulière dans Clojure que signifie que vous pouvez appliquer des astuces supplémentaires: :-)
mikera
2
Utiliser nth ... 0au lieu defirst
Pour obtenir le premier élément d'une collection, l'utilisation de (nth ... 0)over firstenregistre un octet:
Vous pouvez également utiliser des vecteurs comme fonctions, donc ([2 3 4]1)renvoie l'élément à l'index 1. Cela devrait être avantageux si, par exemple, le format d'entrée est flexible.
NikoNyrh
1
Utilisez Appliquer au lieu de réduire
Par exemple, #(apply + %)un octet est plus court que #(reduce + %).
Utilisez des cartes au lieu de ifs lorsque vous testez l'égalité
;; 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
Liez les noms de fonction longs à let à un symbole à un octet
Par exemple , si vous devez utiliser partitionou frequenciesplusieurs fois, il pourrait être bénéfique pour les lier à un symbole unique octet dans une letmacro. Là encore, cela ne vaut peut-être pas la peine si vous n'avez pas besoin du letcontraire, et le nom de la fonction est relativement court.
Réponses:
Utilisez la syntaxe du lecteur pour les lambdas.
Alors utilisez
au lieu de
Vous pouvez également éliminer les espaces blancs une partie du temps:
la source
#(+ % %2 %3)
est équivalent à+
.Où vous pouvez supprimer les espaces:
Entre une chaîne et autre chose:
Entre parenthèses et toute autre chose:
Entre un nombre et tout autre que les noms intégrés ou variables:
Entre
@
(déréférence pour les atomes) et crochets.la source
@
let
et vous débarrasser de certains espaces.#(+ 1(first%))
=#(+ 1 (first %))
Les chaînes peuvent être traitées comme une séquence de caractères
par exemple pour trier les caractères d'une chaîne par ordre alphabétique:
la source
Utiliser
nth ... 0
au lieu defirst
Pour obtenir le premier élément d'une collection, l'utilisation de
(nth ... 0)
overfirst
enregistre un octet:la source
second
(2 octets)([2 3 4]1)
renvoie l'élément à l'index 1. Cela devrait être avantageux si, par exemple, le format d'entrée est flexible.Utilisez Appliquer au lieu de réduire
Par exemple,
#(apply + %)
un octet est plus court que#(reduce + %)
.la source
Évitez de laisser si vous avez déjà un pour
Par exemple:
#(for[a[(sort %)]...)
au lieu de#(let[a(sort %)](for ...))
.For a aussi une
:let
construction mais elle est trop verbeuse pour le code golf.la source
Utilisez
+
et-
au lieu deinc
etdec
Cela économise 1 octet si vous utilisez
inc
/dec
sur une expression avec des parens:la source
Utilisez des cartes au lieu de
if
s lorsque vous testez l'égalitéla source
Liez les noms de fonction longs à let à un symbole à un octet
Par exemple , si vous devez utiliser
partition
oufrequencies
plusieurs fois, il pourrait être bénéfique pour les lier à un symbole unique octet dans unelet
macro. Là encore, cela ne vaut peut-être pas la peine si vous n'avez pas besoin dulet
contraire, et le nom de la fonction est relativement court.la source
Utiliser pour au lieu de la carte
Par exemple,
#(for[i %](Math/abs i))
est beaucoup plus court que l'map
équivalent.la source