2016-12-24 12 views
-1

私は非常に新しいlispです。多分それはばかげた質問です。しかし、私は与えられたパターンに従って2つのリスト(s1、s2)をマージしたいと思います - ブール値のリストS3(t nil ....)。 trueの場合はS2から要素を使用し、falseの場合は要素をそのまま使用します。したがって、最後は s1(1 2 3 2 2 4)とs2(8 9 5 6 8 9)およびS3(nil tt nil t)=>(1 8 3 9 5 4)のようになります。Lispマージパターン

どうもありがとうございました! R.

答えて

3

Lispは言語ファミリです。あなたはCommon Lispのを意味している場合、ここでの可能な2ラインのソリューションです:

CL-USER> (defun merge-3 (s1 s2 s3) 
      (loop for x in s1 if (pop s3) collect (pop s2) else collect x)) 
MERGE-3 
CL-USER> (merge-3 '(1 2 3 2 2 4) '(8 9 5 6 8 9) '(nil t nil t t nil)) 
(1 8 3 9 5 4) 
-2
(defun select-lists (s1 s2 s3) 
    (mapcar (lambda (s1e s2e s3e) 
      (if s3e s2e s1e)) 
      s1 s2 s3)) 
+0

のソリューションについて、いくつかのコメントを追加してくださいなぜ、それが問題に –

+0

@Odedraを解決する方法:私はそれが良い例だと思いますコードははっきりしているのでコメントは必要ありません。つまり、 '' mapcar'はある関数をいくつかのリストに写像し、その結果をリストとして返す 'ということです。誰もが知っている。そして、マッピングされている関数は明らかにはっきりしています。 – tfb

+0

あなたの関数はOPの問題を解決しないことに注意してください。 '(select-lists '(1 2 3 2 2 4)'(8 9 5 6 8 9) '(nil t nil tt nil))'は '(1 9 3 6 8 4)'を返します。 3 9 5 4) '。 – Renzo