Які ваші поради щодо гольф-коду за допомогою Clojure?
Метою цього питання є зібрати список методик, специфічних для Clojure і які можуть бути використані в загальних проблемах з кодовим гольфом.
Які ваші поради щодо гольф-коду за допомогою Clojure?
Метою цього питання є зібрати список методик, специфічних для Clojure і які можуть бути використані в загальних проблемах з кодовим гольфом.
Відповіді:
Використовуйте синтаксис читання для лямбда.
Тож використовуйте
#(+ % %2 %3)
замість
(fn [x y z] (+ x y z))
Ви також можете усунути пробіли частину часу:
#(if (< % 0) (- %) %)
#(if(< % 0)(- %)%)
#(+ % %2 %3)
рівнозначний +
.
Між рядком і будь-чим іншим:
(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)
Між @
(пониження для атомів) і дужками.
@
let
та позбутися місця.
#(+ 1(first%))
=#(+ 1 (first %))
Струни можна розглядати як послідовність символів
наприклад, сортувати символи в рядку за алфавітом:
(sort "hello")
=> (\e \h \l \l \o)
nth ... 0
замістьfirst
Щоб отримати перший елемент колекції, за допомогою (nth ... 0)
over first
save зберігає байт:
(first[2 3 4]): 14 bytes
(nth[2 3 4]0): 13 bytes (saves a byte!)
second
(2 байти)
([2 3 4]1)
повертає елемент в індекс 1. Це має бути корисним, якщо, наприклад, формат введення є гнучким.
Наприклад, якщо вам потрібно використовувати partition
або frequencies
кілька разів, може бути корисним прив’язати їх до однобайтового символу в let
макросі. Тоді знову це може бути не варто, якщо let
інше вам не потрібно , а назва функції порівняно коротке.