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:1つの文字列と1つの整数。あなたのコードは、文字列を1つの文字列に連結した文字列を作成します。それはLOOPでもそうです。それは非効率的です。ベクトルが100桁であるとします。あなたのコードは、0,1,2,3,4、... 98,99,100の長さの文字列を作成します。最後のものだけが保持されます。他のすべてはゴミです。私のコードは、MAPの実装が半分まともでない場合、入力ベクトルと同じ長さの文字列を1つだけ作成します。 –

+1

@MartinBuchman:何かをループ内のリストまたはベクトルの最後に連結すると、これが非効率的であることが容易にわかります。一般に、ループ内のベクトルを連結することは効率的ではない。通常、比較的簡単な方法でより効率的なコードを書くことができます。より効率的なコードを書くことも可能ですが、コードが複雑に見える可能性があります。 –

関連する問題