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
또한 때로는 물건을 다시 정렬 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 first를 사용하여 바이트 를 저장합니다.

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

동일 second(2 바이트)
Uriel

1
또한 벡터를 함수로 사용할 수 있으므로 ([2 3 4]1)인덱스 1에서 요소를 반환합니다. 예를 들어 입력 형식이 가변적 인 경우 유익합니다.
NikoNyrh

1

축소 대신 적용을 사용하십시오.

예를 들어 #(apply + %)보다 1 바이트가 짧습니다 #(reduce + %).


1

이미 가지고 있다면 피하십시오

예를 들어 : #(for[a[(sort %)]...)대신 #(let[a(sort %)](for ...)).

for에도 :let구문이 있지만 코드 골프에는 너무 장황합니다.


1

사용 +하고 -대신 inc하고dec

parens가있는 표현식에서 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

긴 함수 이름을 1 바이트 기호에 바인드

예를 들어 , 여러 번 사용해야 partition하거나 frequencies여러 번 사용해야 하는 경우 let매크로 에서 단일 바이트 기호에 바인딩하는 것이 좋습니다 . 그런 다음 let달리 필요하지 않으면 가치가 없을 수도 있으며 함수 이름이 상대적으로 짧습니다.


0

지도 대신 사용

예를 들어 동등한 #(for[i %](Math/abs i))것보다 훨씬 짧습니다 map.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.