0

入力がリストのリストである場合、入力からの要素を含むリストを出力して、トランプのデッキのようにシャッフルしたいと考えています。

たとえば、入力が '((1 2 3) (4 5)) の場合、出力は '(1 4 2 5 3) と表示されます。

私の考えは、最初にリスト内の最初のリストから要素を削除してから、リストのそのリストをリストの後ろに移動することです。このようにして、リストの次のリストの最初の要素を追加できます。

これまでの私のコードは次のとおりです。

(define (shuffle ls)
   (if (null? ls) '()
       (cond ((null? car (ls)) (append (cdr (ls)) (list (cdr(car(ls)))))))
             (else (car (car (ls)))
                   (append (cdr (ls)) (list (cdr (car (ls))))
                   (shuffle (cdr (ls)))))))
4

2 に答える 2

1

[ここにあるすべてのコードスニペットでは、最初にSRFI1をロードする必要があります。]

あなたが望んでいるように見えるのは、リストを圧縮することです:

> (zip '(1 2 3) '(4 5))
((1 4) (2 5))

ただし、ご覧のとおり、これは最短リストの最後に到達すると停止します。たぶん、すべての要素が使い果たされた後に停止するカスタムzipを書くことができます:

(define (my-zip l1 l2)
  (cond ((and (null? l1) (null? l2)) '())
        ((null? l1) (cons (car l2) (my-zip l1 (cdr l2))))
        ((null? l2) (cons (car l1) (my-zip (cdr l1) l2)))
        (else (cons* (car l1) (car l2) (my-zip (cdr l1) (cdr l2))))))

やってみよう!

> (my-zip '(1 2 3) '(4 5))
(1 4 2 5 3)
> (my-zip '(1 2 3) '(4 5 6 7))
(1 4 2 5 3 6 7)
于 2012-09-13T20:33:10.537 に答える
0

これも機能します...私はチキンスキームを使用しているので、srfi-1からフィルターを「インポート」する必要があります。

(use srfi-1)
(define *deck* '((1 2 3 4) (5 6 7) (9 10 11 12)))

(define nullcar? 
  (lambda (x) 
    (if (not (null? x)) 
      (null? (car x)))))

(define nullcdr? 
  (lambda (x) 
    (if (not (null? x)) 
      (null? (cdr x)))))

(define notnulls 
  (lambda (x) 
    (filter (lambda (e) 
              (not (null? e))) 
            x)))

(define firsts 
  (lambda (l) 
    (if (not (null? l)) 
      (map (lambda (x) 
             (if (not (null? x)) 
               (car x) 
               '())) 
            l))))

(define shuf 
  (lambda (d) 
    (notnulls 
      (append (firsts d) 
              (if (not (nullcar? d)) 
                (if (not (nullcdr? d))  
                  (shuf (map cdr (notnulls d))) 
                  '()) 
               '())))))

乾杯!

于 2012-09-14T00:15:40.257 に答える