Consigli per giocare a golf a Clojure


16

Quali sono i tuoi consigli per giocare a golf con il codice usando Clojure?

Lo scopo di questa domanda è quello di raccogliere un elenco di tecniche specifiche per Clojure e che possono essere utilizzate in problemi generali di golf con codice.


Hmm .. questi tipi di post non dovrebbero essere in meta (ammesso che non sono sicuro che meta esistesse 5+ anni fa)
Albert Renshaw

Risposte:


6

Usa la sintassi del lettore per lambdas.
Quindi usa

#(+ % %2 %3)

invece di

(fn [x y z] (+ x y z))

Puoi anche eliminare gli spazi bianchi alcune volte:

#(if (< % 0) (- %) %)
#(if(< % 0)(- %)%)

a proposito #(+ % %2 %3)è equivalente a +.
bfontaine,

4

Dove puoi rimuovere gli spazi bianchi:

  • Tra una stringa e qualsiasi altra cosa:

    (println(+"Hello, World!"1))
    
  • Tra parentesi e quant'altro:

    (for[x(range 5)](* x x))
    
  • Tra un numero e tutto tranne i builtin o i nomi delle variabili:

    Allowed:
    (+ 1"Example")
    (map{1"-1"2"-2"}[1 2 3])
    
    Not allowed:
    (+1 2)
    
  • Tra @(dereference for atoms) e parentesi.


Anche prima della macro del lettore deref@
solo ASCII il

1
Inoltre, a volte potresti essere in grado di riorganizzare le cose in un lete liberarti di alcuni spazi.
NikoNyrh,

Anche prima di parametri in funzioni anonime: #(+ 1(first%))=#(+ 1 (first %))
bfontaine

3

Le stringhe possono essere trattate come una sequenza di caratteri

ad es. per ordinare i caratteri in una stringa in ordine alfabetico:

(sort "hello")
=> (\e \h \l \l \o)

1
Le stringhe sono per definizione una sequenza di caratteri in quasi tutte le lingue, ma non puoi applicare questo trucco in tutte le
lingue

3
O meglio, "sequenza" ha un significato speciale in Clojure piuttosto che significa che puoi applicare trucchi extra: :-)
mikera,

2

Usa nth ... 0invece difirst

Per ottenere il primo elemento di una raccolta, usare (nth ... 0)over firstsalva un byte:

(first[2 3 4]): 14 bytes
(nth[2 3 4]0): 13 bytes (saves a byte!)

lo stesso vale per second(2 byte)
Uriel

1
Inoltre è possibile utilizzare i vettori come funzioni, quindi ([2 3 4]1)restituisce l'elemento all'indice 1. Ciò dovrebbe essere utile se, ad esempio, il formato di input è flessibile.
NikoNyrh,

1

Usa applica invece di ridurre

Ad esempio #(apply + %)è un byte più corto di #(reduce + %).


1

Evita di lasciare se hai già un for

Ad esempio: #(for[a[(sort %)]...)anziché #(let[a(sort %)](for ...)).

Per ha anche un :letcostrutto ma è troppo prolisso per il codice golf.


1

Usa +e -invece di incedec

Ciò consente di risparmiare 1 byte se si utilizza inc/ decsu un'espressione con parentesi:

(inc(first[1 3 5]))
(+(first[1 3 5])1)

1

Usa le mappe invece di ifs quando esegui il test per l'uguaglianza

;; 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

1

Associa nomi di funzioni lunghe a let a un simbolo a byte singolo

Ad esempio, se è necessario utilizzarlo partitiono frequenciespiù volte, potrebbe essere utile associarli a un simbolo a byte singolo in una letmacro. Inoltre, potrebbe non valerne la pena se non è necessario il letcontrario e il nome della funzione è relativamente breve.


0

Utilizzare per invece di mappa

Ad esempio #(for[i %](Math/abs i))è molto più breve mapdell'equivalente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.