2011-11-29 6 views
10

저는 Clojure와 함수형 프로그래밍을 처음 접해 보았습니다. 나는 기능적인 방식으로 이것을 처리하는 방법을 잃어 버렸습니다.Clojure에서리스트 -리스트 행렬을 회전하십시오.

나는 다음의 행렬이 있습니다

나는 이런 식으로 뭔가로 변환 할
(def matrix [[\a \b \c] 
      [\d \e \f] 
      [\g \h \i]]) 

(시계 반대 방향으로 회전) : 나는 나에게 요소를 제공이 비트를 해킹 한

((\a \d \g) 
(\b \e \h) 
(\c \f \i)) 

을 올바른 순서로 이 방법으로 문자열로 데이터를 수집 할 수 있다면 파티션으로 분할 할 수 있습니다. 그러나 나는 doseq 잘못된 경로입니다 확신 : 나는 중첩 된지도 호출 다뤄했지만 그와 함께 붙어 점점 계속

(doseq [i [0 1 2]] 
    (doseq [row matrix] 
    (println (get (vec row) i)))) 

. Clojure에서 문자열을 작성하거나 더 나은 방법으로 이것을 처리하는 올바른 방법은 무엇입니까?

답변

30

달성하려는 목표는 transpose입니다. 내가 권하고 싶습니다

(apply map list matrix) 
; => ((\a \d \g) (\b \e \h) (\c \f \i)) 

그것은 무엇을할까요?

(apply map list '((\a \b \c) (\d \e \f) (\g \h \i))) 

세 개의리스트의 각각의 첫 번째 원소를 얻어

(map list '(\a \b \c) '(\d \e \f) '(\g \h \i)) 

동등하다 그들리스트를 호출하고, 두 번째 요소를 얻어 그들을리스트를 호출 ...는 시퀀스를 반환 이 방법으로 생성 된 모든 목록.

applymap의 두 가지 예가 ClojureDocs에서 찾을 수 있습니다.

원본과 동일한 출력을 생성
(def transposed-matrix (apply map list matrix)) 
;=> ((\a \d \g) (\b \e \h) (\c \f \i)) 

(doseq [row transposed-matrix] 
    (doall (map println row))) 

(matrix의 열을 인쇄) :

+0

을 가리키는 위해 멋진 들으 보인다! 감사 – JustGage

9

는 rosettacode에서 직접 matrix transposition 솔루션을 촬영 : 그것은 좋은 것은 아니지만

(map vector [\a \b \c] [\d \e \f] [\g \h \i])

이 임의의 행렬 크기로 잘 작동합니다

(vec (apply map vector matrix))

무슨 일이 고려에 가고 보려면 중요한 숫자는 Clojure의 자바 기반 행렬 조작 라이브러리를 사용하는 것이 좋습니다.

+0

rosettacode이 인상적 – jm0

2

여기에 하나의 방법입니다.

5

core.matrix을 사용하면 이러한 종류의 행렬 조작을 매우 쉽게 할 수 있습니다. 특히, 당신이 원하는 것을 정확히 않습니다 이미 transpose 기능이있다 :

예 :

(use 'clojure.core.matrix) 

(def matrix [[\a \b \c] 
      [\d \e \f] 
      [\g \h \i]]) 

(transpose matrix) 
=> [[\a \d \g] 
    [\b \e \h] 
    [\c \f \i]] 
관련 문제