Scheme 如何划分这些列表?

Scheme 如何划分这些列表?,scheme,racket,Scheme,Racket,输入示例: ((a1 . b) (a1 . c)): 我有一个包含两个元素的列表,这些元素是包含两个元素的列表或成对列表。我想检查第一对/列表的第一个元素是否等于第二对/列表的第一个元素 输出:如果是,我想创建一个包含两个列表的新列表,第一个是列表: 而(b(a1.b(偶数))(a1.b+2(偶数))。。。 另一个列表是相同的,但有奇数的 我如何在计划中实施此功能: (define data (list (cons 1 1) (cons 1 7))) (define (neven n) (

输入示例:

((a1 . b) (a1 . c)): 
我有一个包含两个元素的列表,这些元素是包含两个元素的列表或成对列表。我想检查第一对/列表的第一个元素是否等于第二对/列表的第一个元素

输出:如果是,我想创建一个包含两个列表的新列表,第一个是列表: 而(b(a1.b(偶数))(a1.b+2(偶数))。。。 另一个列表是相同的,但有奇数的

我如何在计划中实施此功能:

(define data (list (cons 1 1) (cons 1 7)))

(define (neven n) (if (even? n) n (+ n 1)))

(define (sublist a mn mx) 
  (cond 
    ((<= mn mx ) (cons (cons a mn) (sublist a (+ mn 2) mx)))
    (else '())))

(define (game-position input)
   (if (= (caar input) (caadr input))
       (list (sublist (caar input) 
                      (neven (cdar input)) 
                      (cdadr input))
             (sublist (caar input) 
                      (+ 1 (neven (cdar input))) 
                      (cdadr input)))
       (error "no match")))

(game-position data)
输入:

((1 . 1) (1 . 7))
输出:

(((1 . 2) (1 . 4) (1 . 6)) ((1 . 3) (1 . 5) (1 . 7)))
我有一个包含两个元素的列表。每个元素也是一个包含两个元素的列表,两个元素都是整数>=0和<8

我必须创建这个:

input ((a1 . b) (a1 . c)) 

output: (if (and (= a1 a2) (odd? b))
          While < b c
             (list (a1 . b+1) (a1 . b+3) (a1 . b+n)...)) 
             (list (a2 . b) (a2 . b+2) (a2 . b+4)...)
输入((a1.b)(a1.c))
输出:(如果(和(=a1 a2)(奇数?b))
而
我已经这么做了,但是我找不到我失败的地方,你能帮我吗

;;; Verify if absissa0 = absissa1

(define (game-position input)
  (if (= (car (car j)) (cdr (cdr j)))
          (col1_col2 j)
          (error "Not valid"))))
;;; verify if absissa0 is even

(define (col1_col2 gstart)
  (if (even? (cdr (car jstart))) 
      (list (pos-start jstart))
      (list (pos-start (list (cons (car (car jstart)) (- (cdr (car jstart)) 1)) (car (cdr jstart))))))


;;; Loop that creates positions of even's and odd's

(define (pos-start j2)
  (while ( < (cdr (car j2)) (- (cdr (cdr j2)) 2))
      ((cons (car (car j2)) (+ (cdr (car j2)) 2)) (pos-start (list (cons (car (car j2)) (+ (cdr (car j2)) 2)) (car (cdr j2)))))
      (odd_2 (list (cons (car (car j2)) (+ (cdr (car j2)) 1)) (car (cdr j2)))))

(define (odd_2 j3)
  (while ( < (cdr (car j3)) (- (car (cdr j3)) 2))
      ((j3) (odd_2 (list (cons (car (car j3)) (+ (cdr (car j3)) 2)) (car (cdr j3)))
         (value)))
;;;验证absissa0是否等于absissa1
(定义(游戏位置输入)
(如果(=(车辆(车辆j))(cdr(cdr j)))
(col1_col2 j)
(错误“无效”))
;;; 验证ABISSA0是否为偶数
(定义(col1\u col2 gstart)
(如果(偶数)(cdr(汽车启动)))
(列表(pos start jstart))
(列表(pos启动)(列表(cons(car(car jstart))((cdr(car jstart))1))(car(cdr jstart)(()()))
创建偶数和奇数位置的循环
(定义(位置开始j2)
(而(<(cdr(汽车j2))((cdr(cdr j2))2))
((cons(car(car j2))(+(cdr(car j2))2))(pos启动(列表(cons(car(car j2))(+(cdr(car j2))2))(car(cdr j2()()))
(奇数_2(列表(cons(car(car j2))(+(cdr(car j2))1))(car(cdr j2()))
(定义(奇数_2 j3)
(而(<(cdr(car j3))((car(cdr j3))2))
((j3)(奇数2)(列表(cons(car(car j3))(+(cdr(car j3))2)(car(cdr j3)))
(价值)

我对方案有点生疏,我已经设法找到了解决您问题的方法, 它使用递归vs while,但我不习惯scheme中的构造:

(define data (list (cons 1 1) (cons 1 7)))

(define (neven n) (if (even? n) n (+ n 1)))

(define (sublist a mn mx) 
  (cond 
    ((<= mn mx ) (cons (cons a mn) (sublist a (+ mn 2) mx)))
    (else '())))

(define (game-position input)
   (if (= (caar input) (caadr input))
       (list (sublist (caar input) 
                      (neven (cdar input)) 
                      (cdadr input))
             (sublist (caar input) 
                      (+ 1 (neven (cdar input))) 
                      (cdadr input)))
       (error "no match")))

(game-position data)
(定义数据(列表(cons11)(cons17)))
(定义(neven n)(如果(偶数?n)n(+n1)))
(定义(子列表a mn mx)
(续)

((我对这个计划有点生疏,我已经设法找到了解决你问题的办法, 它使用递归vs while,但我不习惯scheme中的构造:

(define data (list (cons 1 1) (cons 1 7)))

(define (neven n) (if (even? n) n (+ n 1)))

(define (sublist a mn mx) 
  (cond 
    ((<= mn mx ) (cons (cons a mn) (sublist a (+ mn 2) mx)))
    (else '())))

(define (game-position input)
   (if (= (caar input) (caadr input))
       (list (sublist (caar input) 
                      (neven (cdar input)) 
                      (cdadr input))
             (sublist (caar input) 
                      (+ 1 (neven (cdar input))) 
                      (cdadr input)))
       (error "no match")))

(game-position data)
(定义数据(列表(cons11)(cons17)))
(定义(neven n)(如果(偶数?n)n(+n1)))
(定义(子列表a mn mx)
(续)

(我学习球拍/方案已经有一段时间了 现在,这个网站看起来是一个分享和分享的好地方 向别人学习

我不是100%确定这个问题的规格,而且 我怀疑我的代码实际上解决了这个问题吗 但我认为它的可读性足以被修改 必要时

可读性是我一直在做的事情之一 并感谢他人的反馈/建议

dlm

我的2美分:

(define (process-list? lst)
  (let*([pair-0   (list-ref lst 0)]
        [pair-1   (list-ref lst 1)])
    (and    (=   (car pair-0)  (car pair-1))
            (<   (cdr pair-0)  (cdr pair-1)))))

(define (make-odd/even-sets data) 
  (let*([x         (car (list-ref data 0))]
        [y-start   (cdr (list-ref data 0))]
        [max       (cdr (list-ref data 1))])

    (define (loop y evens odds)
      (if (<= y max)
          (loop (add1 y)
                (if (even? y)   (cons (cons x y) evens)   evens)
                (if (odd?  y)   (cons (cons x y) odds)    odds))
          (list (reverse odds) (reverse evens))))
    (loop  y-start '()  '())))

(define (main data)
  (if (process-list? data)
      (let*([odd/even   (make-odd/even-sets data)])
        (printf "~a~n" (list-ref odd/even 0))
        (printf "~a~n" (list-ref odd/even 1)))
      (printf "Invalid list~n" )))

(main  '((1 . 1) (1 . 7)) )
(define (process-list? lst)
  (let*([pair-0   (list-ref lst 0)]
        [pair-1   (list-ref lst 1)])
    (and    (=   (car pair-0)  (car pair-1))
            (<   (cdr pair-0)  (cdr pair-1)))))

(define (make-odd/even-sets data) 
  (let*([x         (car (list-ref data 0))]
        [y-start   (cdr (list-ref data 0))]
        [max       (cdr (list-ref data 1))])

    (define (loop y evens odds)
      (if (<= y max)
          (loop (add1 y)
                (if (even? y)   (cons (cons x y) evens)   evens)
                (if (odd?  y)   (cons (cons x y) odds)    odds))
          (list (reverse odds) (reverse evens))))
    (loop  y-start '()  '())))

(define (main data)
  (if (process-list? data)
      (let*([odd/even   (make-odd/even-sets data)])
        (printf "~a~n" (list-ref odd/even 0))
        (printf "~a~n" (list-ref odd/even 1)))
      (printf "Invalid list~n" )))

(main  '((1 . 1) (1 . 7)) )
(定义(流程列表?lst)
(让*([对-0(列表参考lst 0)]
[第1对(列表参考1)])
(和(=(车对-0)(车对-1))
(<(cdr对-0)(cdr对-1(())))
(定义(生成奇数/偶数集数据)
(let*([x(车辆(列表参考数据0))]
[y-开始(cdr(列表参考数据0))]
[max(cdr(列表参考数据1))]
(定义(循环y均匀赔率)

(如果(我学习球拍/球拍已有一段时间了 现在,这个网站看起来是一个分享和分享的好地方 向别人学习

我不是100%确定这个问题的规格,而且 我怀疑我的代码实际上解决了这个问题吗 但我认为它的可读性足以被修改 必要时

可读性是我一直在做的事情之一 并感谢他人的反馈/建议

dlm

我的2美分:

(define (process-list? lst)
  (let*([pair-0   (list-ref lst 0)]
        [pair-1   (list-ref lst 1)])
    (and    (=   (car pair-0)  (car pair-1))
            (<   (cdr pair-0)  (cdr pair-1)))))

(define (make-odd/even-sets data) 
  (let*([x         (car (list-ref data 0))]
        [y-start   (cdr (list-ref data 0))]
        [max       (cdr (list-ref data 1))])

    (define (loop y evens odds)
      (if (<= y max)
          (loop (add1 y)
                (if (even? y)   (cons (cons x y) evens)   evens)
                (if (odd?  y)   (cons (cons x y) odds)    odds))
          (list (reverse odds) (reverse evens))))
    (loop  y-start '()  '())))

(define (main data)
  (if (process-list? data)
      (let*([odd/even   (make-odd/even-sets data)])
        (printf "~a~n" (list-ref odd/even 0))
        (printf "~a~n" (list-ref odd/even 1)))
      (printf "Invalid list~n" )))

(main  '((1 . 1) (1 . 7)) )
(define (process-list? lst)
  (let*([pair-0   (list-ref lst 0)]
        [pair-1   (list-ref lst 1)])
    (and    (=   (car pair-0)  (car pair-1))
            (<   (cdr pair-0)  (cdr pair-1)))))

(define (make-odd/even-sets data) 
  (let*([x         (car (list-ref data 0))]
        [y-start   (cdr (list-ref data 0))]
        [max       (cdr (list-ref data 1))])

    (define (loop y evens odds)
      (if (<= y max)
          (loop (add1 y)
                (if (even? y)   (cons (cons x y) evens)   evens)
                (if (odd?  y)   (cons (cons x y) odds)    odds))
          (list (reverse odds) (reverse evens))))
    (loop  y-start '()  '())))

(define (main data)
  (if (process-list? data)
      (let*([odd/even   (make-odd/even-sets data)])
        (printf "~a~n" (list-ref odd/even 0))
        (printf "~a~n" (list-ref odd/even 1)))
      (printf "Invalid list~n" )))

(main  '((1 . 1) (1 . 7)) )
(定义(流程列表?lst)
(让*([对-0(列表参考lst 0)]
[第1对(列表参考1)])
(和(=(车对-0)(车对-1))
(<(cdr对-0)(cdr对-1(())))
(定义(生成奇数/偶数集数据)
(let*([x(车辆(列表参考数据0))]
[y-开始(cdr(列表参考数据0))]
[max(cdr(列表参考数据1))]
(定义(循环y均匀赔率)

(如果(很抱歉之前的帖子。这是我的第一篇帖子。) 我以未注册用户的身份发布。我显然 还没有弄明白如何格式化文本

我已经创建了一个帐户(用户dlm),我正在创建一个 第二次尝试——开始了


我学习球拍/球拍已经有一段时间了 现在,这个网站看起来是一个分享和分享的好地方 向别人学习

我不是100%确定这个问题的规格,而且 我怀疑我的代码实际上解决了这个问题吗 但我认为它的可读性足以被修改 必要时

可读性是我一直在做的事情之一 并感谢他人的反馈/建议

dlm

我的2美分:

(define (process-list? lst)
  (let*([pair-0   (list-ref lst 0)]
        [pair-1   (list-ref lst 1)])
    (and    (=   (car pair-0)  (car pair-1))
            (<   (cdr pair-0)  (cdr pair-1)))))

(define (make-odd/even-sets data) 
  (let*([x         (car (list-ref data 0))]
        [y-start   (cdr (list-ref data 0))]
        [max       (cdr (list-ref data 1))])

    (define (loop y evens odds)
      (if (<= y max)
          (loop (add1 y)
                (if (even? y)   (cons (cons x y) evens)   evens)
                (if (odd?  y)   (cons (cons x y) odds)    odds))
          (list (reverse odds) (reverse evens))))
    (loop  y-start '()  '())))

(define (main data)
  (if (process-list? data)
      (let*([odd/even   (make-odd/even-sets data)])
        (printf "~a~n" (list-ref odd/even 0))
        (printf "~a~n" (list-ref odd/even 1)))
      (printf "Invalid list~n" )))

(main  '((1 . 1) (1 . 7)) )
(define (process-list? lst)
  (let*([pair-0   (list-ref lst 0)]
        [pair-1   (list-ref lst 1)])
    (and    (=   (car pair-0)  (car pair-1))
            (<   (cdr pair-0)  (cdr pair-1)))))

(define (make-odd/even-sets data) 
  (let*([x         (car (list-ref data 0))]
        [y-start   (cdr (list-ref data 0))]
        [max       (cdr (list-ref data 1))])

    (define (loop y evens odds)
      (if (<= y max)
          (loop (add1 y)
                (if (even? y)   (cons (cons x y) evens)   evens)
                (if (odd?  y)   (cons (cons x y) odds)    odds))
          (list (reverse odds) (reverse evens))))
    (loop  y-start '()  '())))

(define (main data)
  (if (process-list? data)
      (let*([odd/even   (make-odd/even-sets data)])
        (printf "~a~n" (list-ref odd/even 0))
        (printf "~a~n" (list-ref odd/even 1)))
      (printf "Invalid list~n" )))

(main  '((1 . 1) (1 . 7)) )
这里的问题可以分为两个不同的部分 问题:1)更改行位置+-1和 2) 更改行位置+-1。两者都适用 将相同的操作应用于系统的不同组件 位置。所以让我们用一个

(代替while循环,让我们看一下 类似于“while list not empty”循环)

使用“映射”将操作应用于数据列表 这很直截了当:

(map  (lambda (val)  (+ val 5))
      '(10 20 30))
如果需要,您可以将其包含在过程范围内 要维护计数器等状态信息,请执行以下操作:

(define (test lst)
  (let*([i   0])
    (map  (lambda (val)  
            (set!  i  (+ i 1))
            (+ val i)) 
          lst)))
(test '(10 20 30))
或传入要在操作中使用的值:

(define (test lst amount)
    (map   (lambda (val)  (+ val amount))
           lst)) 
(test '(10 20 30) 100)

现在把你的想法翻出来考虑一下 可以让它将操作列表映射到 将某些数据而不是数据发送到操作

(define (test val operations-lst)
    (map  (lambda (operation)   (operation val))
          operations-lst))
(test  10  (list sub1 add1))
现在,我们有了开始创建新项目的工具 “相邻”程序:

(define (adjacent p) 

  (define (up/down p)  ;; operations applied to the line componet
    (map   (lambda (operation)  
               (cons    (operation (line-pos p))   (column-pos p)))
           (list add1 sub1)))

  (define (left/right p)  ;; operations applied to the column componet
    (map   (lambda (operation)  
               (cons    (line-pos p)   (operation (column-pos p))))
           (list add1 sub1)))

  (append  (up/down p)  (left/right p))
  )

(adjacent (do-pos 1 1))
这适用于不在边界上的位置 但正如那句老话所说,“有时做起来更容易。” 然后道歉,而不是先问 让我们采取同样的方法,让
; position l e a coluna c.
(define (do-pos l c)
  (if (and (integer? l) (integer? c) (>= l 0) (>= c 0) (<= l 7) (<= c 7))
      (cons l c)
      (error "insert a valid number between 0 and 7")))


; returns l
(define (line-pos p)
    (car p))

; returns c
(define (column-pos p)
    (cdr p))

; Arg is position.
(define (pos? arg) 
  (and (pair? arg) (integer? (line-pos arg)) (integer? (column-pos arg)) (< (car arg) 8) (>= (car arg) 0) (< (cdr arg) 8) (>= (cdr arg) 0)))

; two positions are equal?
(define (pos=? p1 p2)
  (and (= (line-pos p1)(line-pos p2))(= (column-pos p1)(column-pos p2))))

(define (oper* x y)
  (* (- x y) (- x y)))

; Distance between p1 e p2.
(define (distance p1 p2)
  (sqrt (+ (oper* (line-pos p1) (line-pos p2)) (oper* (column-pos p1) (column-pos p2)))))


; Same directions? if same line and same column
(define (same-direction? p1 p2)
  (or (= (line-pos p1) (line-pos p2)) (= (column-pos p1) (column-pos p2))))

; check if to positions are adjacent
(define (adjacent? p1 p2)
  (and (same-direccao? p1 p2) (= (distance p1 p2) 1)))

; from a position, returns all adjacents moves

(define (adjacent p) (cond ((and (= (line-pos p) 0) (= (column-pos p) 0)) (list (faz-pos (+ (line-pos p) 1) (column-pos p)) (do-pos (line-pos p) (+ (column-pos p) 1))))
                         ((and (= (line-pos p) 7) (= (column-pos p) 7)) (list (do-pos (- (line-pos p) 1) (column-pos p)) (do-pos (line-pos p) (- (column-pos p) 1))))
                         ((= (line-pos p) 0) (list (do-pos (+ (line-pos p) 1) (column-pos p)) (do-pos (line-pos p) (+ (column-pos p) 1)) (do-pos (line-pos p) (- (column-pos p) 1))))
                         ((= (column-pos p) 0) (list (do-pos (+ (line-pos p) 1) (column-pos p)) (do-pos (- (line-pos p) 1) (column-pos p)) (do-pos (line-pos p) (+ (column-pos p) 1))))
                         ((= (line-pos p) 7) (list (do-pos (- (line-pos p) 1) (column-pos p)) (do-pos (line-pos p) (+ (column-pos p) 1)) (do-pos (line-pos p) (- (column-pos p) 1))))
                         ((= (column-pos p) 7) (list (do-pos (+ (line-pos p) 1) (column-pos p)) (do-pos (- (line-pos p) 1) (column-pos p)) (do-pos (line-pos p) (- (column-pos p) 1))))
                         (else (list (do-pos (+ (line-pos p) 1) (column-pos p)) (do-pos (- (line-pos p) 1) (column-pos p)) (do-pos (line-pos p) (+ (column-pos p) 1)) (do-pos (line-pos p) (- (column-pos p) 1))))))

; returns a move with p1 and p2

(define (do-game p1 p2)
  (if (and (pos? p1) (pos? p2))
      (list p1 p2)
      (error "Insert two valid positions")))


   ; returns the beguining of j.

(define (b-do-game j)
  (car j))

; returns the end of j.

(define (e-do-hame j)
  (car (cdr j)))

; Arg is a do-game?.
(define (do-game? arg)
  (and (list? arg) (pos? (b-do-game arg)) (pos? (e-do-game arg))))

; do game is null?.
(define (do-game-null? j)
  (pos=? (b-do-game j) (e-do-game j)))

; list with two do-game (pc and pl)
(define (play-pos pc pl)
  (if (and (list? pc) (list? pl))
      (list pc pl)
      (error "Insere two valid moves")))

; returns pc.

(define (cap-pieces pj)
  (b-do-game pj))

; returns pj

(define (free_pieces pj)
  (e-do-game pj))



(define (neven n) 
  (if (even? n) 
      n (+ n 1)))

; create sublists

    (define (sublist a mn mx)
      (cond ((<= mn mx) (cons (do-pos a mn) (sublist a (+ mn 2) mx)))
            (else '())))

(define (sublist2 a mn mx)
  (cond ((<= mx (- mn 2)) (cons (do-pos a (- mn 2)) (sublist2 a (- mn 2) mx)))
        (else '())))

(define (sublist3 a mn mx)
  (cond ((<= mn mx) (cons (do-pos mn a) (sublist3 a (+ mn 2) mx)))
        (else '())))

(define (sublist4 a mn mx)
  (cond ((<= mx (- mn 2)) (cons (do-pos (- mn 2) a) (sublist4 a (- mn 2) mx)))
        (else '())))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


; Returns game-positions
(define (game-positions j)
  (if (not (and (do-game? j) (same-direction? (b-do-game j) (e-do-game j)) (even? (distance (b-do-game j) (e-do-game j)))))
      (list)
      (if (= (line-pos (b-do-game j)) (line-pos (e-do-game j)))
             (f_odd_even? j)
             (f_odd_even2? j))))

; Check is starts with odd or even.

(define (f_odd_even? j) (if (even? (column-pos (b-do-game j)))
                           (b_even j)
                           (b_odd j)))

(define (f_odd_even2? j) (if (even? (line-pos (b-do-jogada j)))
                           (b-even1 j)
                           (b_odd1 j)))


; If starts with odd:

(define (b_odd j)
   (if (< (column-pos (b-do-game j)) (column-pos (e-do-game j)))
       (list (sublist (line-pos (b-do-game j))
                      (neven (column-pos (b-do-game j)))
                      (column-pos (e-do-game j)))

             (sublist (line-pos (b-do-game j)) 
                      (+ 1 (neven (column-pos (b-do-game j)))) 
                      (column-pos (e-do-game j))))

       (list (sublist2 (line-pos (b-do-game j))
                      (+ 1 (column-pos (b-do-game j)))
                      (column-pos (e-do-game j)))

             (sublist2 (line-pos (b-do-game j))
                      (column-pos (b-do-game j))
                      (- 1 (column-pos (e-do-game j)))))))


(define (b_even j)
   (if (< (column-pos (b-do-game j)) (column-pos (e-do-game j)))
       (list (sublist (line-pos (b-do-game j))
                      (+ 2 (neven (column-pos (b-do-game j))))
                      (column-pos (e-do-game j)))

             (sublist (line-pos (b-do-game j)) 
                      (+ 1 (neven (column-pos (b-do-game j)))) 
                      (column-pos (e-do-game j))))

       (list (sublist2 (line-pos (b-do-game j))
                      (column-pos (b-do-game j))
                      (column-pos (e-do-game j)))

             (sublist2 (line-pos (b-do-game j))
                      (+ 1 (column-pos (b-do-game j)))
                      (column-pos (e-do-game j))))))



(define (b_odd1 j)
   (if (< (line-pos (b-do-game j)) (column-pos (e-do-game j)))
       (list (sublist3 (column-pos (b-do-game j))
                      (neven (line-pos (b-do-game j)))
                      (line-pos (e-do-game j)))

             (sublist3 (column-pos (b-do-game j)) 
                      (+ 1 (neven (line-pos (b-do-game j)))) 
                      (line-pos (e-do-game j))))

       (list (sublist4 (column-pos (b-do-game j))
                      (+ 1 (line-pos (b-do-game j)))
                      (line-pos (e-do-game j)))

             (sublist4 (column-pos (b-do-game j)) 
                      (line-pos (b-do-game j))
                      (- 1 (line-pos (e-do-game j)))))))


(define (b_even1 j)
   (if (< (line-pos (b-do-game j)) (line-pos (e-do-game j)))
       (list (sublist3 (column-pos (b-do-game j))
                      (+ 2 (neven (line-pos (b-do-game j))))
                      (line-pos (e-do-game j)))

             (sublist3 (column-pos (b-do-game j)) 
                      (+ 1 (neven (line-pos (b-do-game j)))) 
                      (line-pos (e-do-game j))))

       (list (sublist4 (column-pos (b-do-game j))
                      (line-pos (b-do-game j))
                      (line-pos (e-do-game j)))

             (sublist4 (column-pos (b-do-game j)) 
                      (+ 1 (line-pos (b-do-game j)))
                      (line-pos (e-do-game j))))))