[racket] arrangements exercise

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Sun Jul 1 19:12:59 EDT 2012

On Jul 1, 2012, at 4:17 PM, Sean Kemplay wrote:

> Looking back, I am wondering if my solution is a bit of a cheat - specifically :
> (define (insert-everwhere/in-one-word s word)
>  (make-words s word word))

It's not a cheat, it's wrong. I did you a favor and worked out a failing test case. See below. 

On Jul 1, 2012, at 6:46 PM, Dave Yrueta wrote:

> Try working through this exercise by systematically applying the design recipe.  That is, take the time to make your data definitions explicit, and begin the definition of each helper function with a contract, purpose statement, and template.  In my opinion, more than any other exercise in HtDP, the solution to this exercise relies on paying very close attention to how the data definitions, function contracts and function templates interact. If you allow the data definitions to shape the function templates, and are rigorous about ensuring the function designs conform to their contracts, the solution should fall into place.  

The above is the best advice the list can give you. -- Matthias

;; World  = [Listof Letter] ;; see chapter IV
;; Letter = Symbol 

;; Letter Word -> [Listof Word]
;; the function says: insert _s_ in all positions in _word_

(check-expect (insert-everwhere/in-one-word 'a '(w o)) 
              '((a w o) (w a o) (w o a)))
(check-expect (insert-everwhere/in-one-word 'a '(w w o)) 
              '((a w w o) (w a w o) (w w a o) (w w o a)))

(define (insert-everwhere/in-one-word s word)
 (make-words s word word))

;; Letter Word Word -> [Listof Word]
;; insert _s_ in all positions in _word2_ using _word1_ as a list of insertion points 
;; intended usage: (make-words letter word word) i.e. word1 = word2 initially 

(check-expect (make-words 'a '(w o) '(w o)) '((a w o) (w a o) (w o a)))
(check-expect (make-words 'a '(w w o) '(w w o)) '((a w w o) (w a w o) (w w a o) (w w o a)))

(define (make-words s word1 word2)
   [(empty? word1) (cons (append word2 (cons s empty)) empty)]
   [else (cons (insert-symbol s (first word1) word2) (make-words s (cdr word1) word2))]))

;; Letter Letter Word -> Word 
;; add _new_ in front of each occurrence of _old_ in _word_ 

(check-expect (insert-symbol 'a 'b '(c d e)) '(c d e)) ;; running in BSL with ..
(check-expect (insert-symbol 'a 'b '(b o b)) '(a b o a b)) 

(define (insert-symbol new old word)
   [(empty? word) empty]
   [(symbol=? (first word) old) (cons new (cons old (insert-symbol new old (rest word))))]
   [else (cons (first word) (insert-symbol new old (rest word)))]))

Posted on the users mailing list.