2017-05-21 1 views
1

몇 가지 수학적 재미 문제에 대해 정수의 표현으로 숫자 벡터를 사용하고 있습니다. 지금까지 나를 위해 잘 작동합니다. 이제 벡터를 다시 정수로 변환하고 싶습니다. 나는 아웃 - 오브 - 박스에 적합한 아무것도 찾을 다음과 같은 기능을 함께했다하지 않았다 :숫자의 벡터를 정수로 변환하는 방법은 무엇입니까?

(defun vector->integer (vec) 
    "Returns a given vector of digits as an integer." 
    (loop :for digit :across vec 
     :with number-string = "" 
     :do (setf number-string 
      (concatenate 'string number-string (write-to-string digit))) 
     :finally (return (parse-integer number-string)))) 

그것은 기본적으로 내가 원하는 무엇하지만 난 조금 복잡 integerstring로 변환 vector을 발견했다. 더 효율적인 것이 있습니까?

+0

, 당신은 [codereview.stackexchange에 게시한다 .com] (https://codereview.stackexchange.com/). – Renzo

+0

@TeMPOral이 이미 내 질문에 답변 했으므로 _codereview_에 다시 묻지는 않겠지 만 다음 번에는 그것에 대해 생각할 것입니다. –

답변

4

왜 문자열을 연결하는 대신 곱셈을 사용하지 않습니까?

예.

(loop for digit across vec 
     with number = 0 
     do (setf number (+ (* 10 number) digit)) 
     finally (return number)) 

심지어 간단한 :

(reduce (lambda (a b) (+ (* 10 a) b)) vec) 
3

귀하의 코드를 간단하고 효율적으로 작성입니다 :이 질문은 코드 효율성에 관한

(defun vector->integer (vector) 
    (parse-integer (map 'string #'digit-char vector))) 
+0

이것은 실제로 매우 간결하게 코딩되었지만 '벡터'에서 '문자열'에서 '정수'로 변환해야합니다. 이것은 비효율적이지 않습니까? –

+1

@MartinBuchmann : 문자열 하나와 정수 하나. 당신의 코드는 단일 문자열로 문자열을 연결하는 문자열을 생성합니다. 그것은 또한 LOOP에서 그렇게합니다. 비효율적이다. 벡터에 100 자리가 있다고 가정 해 봅시다. 코드는 0, 1, 2, 3, 4, ... 98, 99, 100 길이의 문자열을 만듭니다. 마지막 하나만 유지됩니다. 다른 모든 것들은 쓰레기입니다. 내 코드는 MAP의 구현이 절반 정도만 주어진다면 입력 벡터와 동일한 길이의 문자열 하나만 생성합니다. –

+1

@MartinBuchman : 목록의 끝이나 루프의 벡터에 연결하면 비효율적이라는 것을 쉽게 알 수 있습니다. 일반적으로 루프에서 벡터를 연결하는 것은 효율적이지 않습니다. 일반적으로 비교적 간단한 코드로보다 효율적인 코드를 작성할 수 있습니다. 보다 효율적인 코드를 작성하는 것도 가능하지만 코드가 더 복잡해 보일 수 있습니다. –

관련 문제