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リーダーマクロの前に@
ASCIIのみ

1
また、時には、a letで何かを再配置して、いくつかのスペースを取り除くことができるかもしれません。
ニコニー

また、匿名関数のパラメーターの前:#(+ 1(first%))=#(+ 1 (first %))
bfontaine

3

文字列は文字のシーケンスとして扱うことができます

たとえば、文字列内の文字をアルファベット順に並べ替えるには:

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

1
文字列は定義上、ほぼすべての言語の文字のシーケンスですが、すべてにこのトリックを適用することはできません:
mellamokb

3
むしろ、「シーケンス」は、特別なトリックを適用できるという意味よりも、Clojureでは特別な意味を持っています
::

2

nth ... 0代わりに使用first

コレクションの最初の要素を取得するには、(nth ... 0)over firstを使用するとバイトが節約されます。

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

同じことがのために行くsecond(2バイト)
ウリエル

1
また、関数としてベクトルを使用できるため([2 3 4]1)、インデックス1の要素を返します。これは、たとえば入力形式が柔軟な場合に便利です。
ニコニール

1

reduceの代わりにapplyを使用します

たとえば、#(apply + %)は1バイト短くなり#(reduce + %)ます。


1

既にforを持っている場合はletを避けてください

例:の#(for[a[(sort %)]...)代わりに#(let[a(sort %)](for ...))

forにも:let構造がありますが、コードゴルフには冗長すぎます。


1

+andの-代わりにincandを使用しますdec

これは、括弧付きの式でinc/ decを使用している場合、1バイトを節約します。

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

1

if等しいかどうかをテストするときに、s ではなくマップを使用します

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

letで長い関数名をシングルバイトシンボルにバインドする

たとえばpartitionfrequencies複数回使用する必要がある場合は、letマクロ内のシングルバイトシンボルにバインドすると便利です。letそうしないと、別の方法が必要ない場合は価値がなくなる可能性があり、関数名は比較的短いです。


0

マップの代わりに使用

たとえば#(for[i %](Math/abs i))map同等のものよりもはるかに短いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.