Поради щодо гольфу в Clojure


16

Які ваші поради щодо гольф-коду за допомогою Clojure?

Метою цього питання є зібрати список методик, специфічних для Clojure і які можуть бути використані в загальних проблемах з кодовим гольфом.


Хм .. чи не повинні ці типи повідомлень бути метами (припустимо, я не впевнений, мета існувала ще 5 років тому)
Альберт Реншоу

Відповіді:


6

Використовуйте синтаксис читання для лямбда.
Тож використовуйте

#(+ % %2 %3)

замість

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

Ви також можете усунути пробіли частину часу:

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

до речі #(+ % %2 %3)рівнозначний +.
bfontaine

4

Де можна видалити пробіл:

  • Між рядком і будь-чим іншим:

    (println(+"Hello, World!"1))
    
  • Між дужками та чим іншим:

    (for[x(range 5)](* x x))
    
  • Між номером і всім іншим, ніж вбудовані або назви змінних:

    Allowed:
    (+ 1"Example")
    (map{1"-1"2"-2"}[1 2 3])
    
    Not allowed:
    (+1 2)
    
  • Між @(пониження для атомів) і дужками.


Також перед макрокомандою Deref Reader@
лише для ASCII

1
Також іноді ви можете перевпорядкувати речі letта позбутися місця.
NikoNyrh

Також перед параметрами в анонімних функціях: #(+ 1(first%))=#(+ 1 (first %))
bfontaine

3

Струни можна розглядати як послідовність символів

наприклад, сортувати символи в рядку за алфавітом:

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

1
Струни за визначенням - це послідовність знаків майже кожної мови, але ви не можете застосувати цей трюк у всіх :-)
mellamokb

3
А точніше, "послідовність" має особливе значення в Clojure, ніж означає, що ви можете застосовувати додаткові хитрощі: :-)
mikera

2

Використовуйте nth ... 0 замістьfirst

Щоб отримати перший елемент колекції, за допомогою (nth ... 0)over firstsave зберігає байт:

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

те саме стосується second(2 байти)
Уріель

1
Також ви можете використовувати вектори як функції, тому ([2 3 4]1)повертає елемент в індекс 1. Це має бути корисним, якщо, наприклад, формат введення є гнучким.
NikoNyrh

1

Використовуйте застосувати замість зменшення

Наприклад #(apply + %), один байт коротший, ніж #(reduce + %).


1

Не допускайте, якщо у вас вже є

Наприклад: #(for[a[(sort %)]...)замість #(let[a(sort %)](for ...)).

Для також є :letконструкція, але це занадто багатослівний код для гольфу.


1

Використовуйте +і -замість incіdec

Це економить 1 байт, якщо ви використовуєте inc/ decна виразі з паронами:

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

1

Використовуйте карти замість ifs при тестуванні на рівність

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

Прив’яжіть довгі імена функцій дозволено до однобайтового символу

Наприклад, якщо вам потрібно використовувати partitionабо frequenciesкілька разів, може бути корисним прив’язати їх до однобайтового символу в letмакросі. Тоді знову це може бути не варто, якщо letінше вам не потрібно , а назва функції порівняно коротке.


0

Використовувати замість карти

Наприклад #(for[i %](Math/abs i)), набагато коротше, ніж mapеквівалент.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.