[racket] [htdp] Help with Exercise 12.4.2

From: Sam Griff (sgriff89 at gmail.com)
Date: Tue Jul 6 14:00:16 EDT 2010

Hello. Like many others working through HtDP I have hit the wall at
this exercise. I'm not sure what I have so far is in line with the
"proper" way to do this exercise and would appreciate any
help/suggestions. Here is the code I have so far:

;; A list of words is either
;; 1. empty
;; 2. (cons w low)
;;    where w is a word and low is a list of words

;; arrangements : word  ->  list-of-words
;; to create a list of all rearrangements of the letters in a-word
(define (arrangements a-word)
    [(empty? a-word) (cons empty empty)]
    [else (insert-everywhere/in-all-words (first a-word)
            (arrangements (rest a-word)))]))

;; Contract:
;; insert-everywhere/in-single-word : symbol word -> list-of-words
;; Purpose:
;; to insert a symbol everywhere in a single word
;; Examples:
;; (insert-everywhere/in-single-word 'a empty) should produce (list 'a)
;; (insert-everywhere/in-single-word 'b (list 'a)) should produce
(list (list 'a 'b) (list 'b 'a))
;; (insert-everywhere/in-single-word 'c (list 'a 'b)) should produce
(list (list 'c 'a 'b) (list 'a 'c 'b) (list 'a 'b 'c))
;; Template:
;; (define (insert-everywhere/in-single-word s w)
;;   (cond
;;     [(empty? w) ...]
;;     [else ... (first w) ... (insert-everywhere/in-single-word s w) ...]))
(define (insert-everywhere/in-single-word s w)
    [(empty? w) (list s)]
    [else  (list (list s (first w)) (cons (first w)
(insert-everywhere/in-single-word s (rest w))))]))

;; insert-everywhere/in-all-words : symbol list-of-words -> list-of-words
;; to insert a symbol everywhere in a list of words
(define (insert-everywhere/in-all-words s low)
    [(empty? low) empty]
    [else (append (insert-everywhere/in-single-word s (first low))
(insert-everywhere/in-all-words s (rest low)))]))

;; Tests:
(define testword1 (list 'a))
(define testword2 (list 'a 'b))
(check-expect (insert-everywhere/in-single-word 'a empty) (list 'a))
(check-expect (insert-everywhere/in-single-word 'b testword1) (list
(list 'b 'a) (list 'a 'b)))
(check-expect (insert-everywhere/in-single-word 'c testword2) (list
(list 'c 'a 'b) (list 'a 'c 'b) (list 'a 'b 'c)))



Posted on the users mailing list.