[plt-scheme] HtDP newbie question, 12.4.2

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Thu Mar 27 14:20:24 EDT 2008

On Mar 27, 2008, at 2:12 PM, Cooke Kelsey wrote:

> Here's the answers to your questions:
>
> Q: What do you mean with (rest ..) ?  This doesn't look like my table.
>
>  A: Your table says, "(insert-everywhere/in-all-words s (rest  
> low)," which means I would rewrite the whole function in the column?

I want to know what the result of (insert-everywhere/in-all-words s  
(rest low)) would be when low = ...
(Looking more closely, your second row says you did the right thing.)


>  [This isn't quite right! 'AT is NOT the representation of the  
> English word "at".]
>
>   A: I was trying to use shorthand from Intermezzo 2:
> '(a b c)  This short-hand is an abbreviation for  (list 'a 'b 'c)

Then what is '(AT)? Hint: you used ' improperly, and that is common  
for beginners. I recommend you stick to (list 'a 'b 'c) and (list  
(list 'a) (list 't)) and so on.


>  Q: Why not take one step from row 1, which uses a list with one  
> word. What would be the next case?
>
> A: Um, two words.  I have no idea why I did that.

Make up a simpler example. Simple examples are good.


> Q: The second leap went wrong. Why? Is it possible that you  
> JUMPED?  Why don't you turn the above examples into examples for  
> this function. And *please* do provide a contract, a purpose  
> statement.
>
> A: OK, this is where my big problem is.  I'm not sure what you mean  
> by JUMPED.  Can you be more specific?  I realize this is some kind  
> of clue but I am too slow to get it.

JUMPED means you wrote the helper function w/o contract, purpose  
statement, template, examples.



>  Here's a full design recipe:
>
> ; Purpose: to insert a symbol between every letter of a single word
> ; Contract: symbol word --> list of words
> ; Example: (define (insert-in-single-word X AT).  Result should be  
> (XAT AXT ATX)

(0) The example is _conceptually_ correct (meaning at the information  
level).

(1) At this point it becomes critical to spell out the (list ...)  
stuff, i.e., to turn the example into full-fledged Scheme data. Small  
step.
(2) I propose you make a second example again.


> ; Template:
> ;   (define (insert-in-single-word s word)
> ;     (cond
> ;       [(empty? (rest word)) empty]
> ;       [else (append (list (first word) s (rest word)) (insert-in- 
> single-word s (rest word)))]))

This is NOT a template.

And before you complete the template build a table just like the one  
above for the recursive case.

-- Matthias




>
> Thanks very much.
>
> Matthias Felleisen <matthias at ccs.neu.edu> wrote:
>
> On Mar 27, 2008, at 1:20 PM, Cooke Kelsey wrote:
>> Dear Dr. Felleisen,
>> thanks so much for responding!  Your suggestions really helped me  
>> to think about the problem.
>>
>> Here's a table of examples, as you suggested:
>>
>> ;;Examples
>> ; s | low              |(first..)|(rest..)    | result
>
> Q: What do you mean with (rest ..) ?  This doesn't look like my table.
>
>
>> ;-------------------------------------------------------------------- 
>> ------------------------------------
>> ; X | '(AT)            |'(AT)    |empty       | '((XAT) (AXT) (ATX))
>
>
> [This isn't quite right! 'AT is NOT the representation of the  
> English word "at".]
>
>
>> ; X | '((AB) (CD) (EF))|'(AB)    |'((CD) (EF))| '((XAB) (AXB)  
>> (ABX) (XCD) (CXD) (CDX) (XEF) (EXF) (EFX))
>
> This second row looks hyper-complicated.
>
> Q: Why not take one step from row 1, which uses a list with one  
> word. What would be the next case?
>
>
>
>
>> Here's an attempt to "go from the first columns to the last":
>>
>> ; Definitions:
>> (define (insert-everywhere/in-all-words s low)
>>   (cond
>>     [(empty? (rest low)) empty]
>>     [else (append (insert-in-single-word s (first low)) (insert- 
>> everywhere/in-all-words s (rest low)))]))
>
> Good the first leap went fine.
>
>
>>  (define (insert-in-single-word s word)
>>   (cond
>>     [(empty? (rest word)) empty]
>>     [else (append (list (first word) s (rest word)) (insert-in- 
>> single-word s (rest word)))]))
>
> The second leap went wrong. Why?
>
> Is it possible that you JUMPED?  Why don't you turn the above  
> examples into examples for this function. And *please* do provide a  
> contract, a purpose statement.
>
> -- Matthias
>
>
>
>>
>> Unfortunately, the list of words gets shorter and shorter (sATX,  
>> sTX, sX).  I tried to think of a way to add a recursive "prefix"  
>> that gets longer, but each time the function cycles the first  
>> letters seem to disappear into the void...
>>
>> Matthias Felleisen <matthias at ccs.neu.edu> wrote:
>>
>> On Mar 25, 2008, at 1:48 PM, Cooke Kelsey wrote:
>>>
>>> I am trying to learn HtDP by myself, and like Dave Yrueta I am  
>>> stumped by 12.4.2.
>>
>> [Oops I forgot to reply to his last message.]
>>
>>
>>> ; Purpose: to insert a symbol between every letter of every word,  
>>> e.g. X, AT-->XAT, AXT, ATX.
>>
>> Please reformulate the example in terms of symbols and lists.
>>
>>
>>>  ;Function Template:
>>> (define (insert-everywhere/in-all-words s low)
>>>   (cond
>>>     [(empty? (rest low))...]
>>>     [else ...(first low)...insert-everywhere/in-all-words s (rest  
>>> low)]))
>>> Note:
>>> It is suggested to use "append", which is easy one or two times--- 
>>> (append x word) or (append (append (first word) x) (rest  
>>> word))----but I can't see how to use this recursively for an  
>>> arbitrary number of letters and words.
>>
>> So far so good. Let's try what HtDP/2e will introduce:
>>
>> Please make a table of the following shape:
>>
>>  s   |   low  |   (first low)  |  (insert-everywhere/in-all-words  
>> s (rest low) | expected result for (insert-... s low)
>> --------------------------------------------------------------------- 
>> -----------------------------------
>>  X   |   AT   |     ?             |  use the purpose statement to  
>> determine this |   (list `XAT' `AXT' `ATX')
>>
>>
>> As I said, you need to reformulate this in terms of symbols and  
>> lists. If it doesn't jump out at you how to go from the four  
>> columns to the last one, then make a couple of more examples. I am  
>> pretty sure it will. Here is the rule of thumb:
>>
>>  --> you know of a built-in function/primitive that does the work
>>  --> you don't. in this case, you make a wish: a purpose statement  
>> and a contract for a helper function that does it for you.
>>
>> You may also have to combine a primitives with functions.
>>
>> Please report back -- Matthias
>>
>>
>>
>>
>>
>>
>>
>>>
>>> The fact that the "hint" refers to the keyword list, which the  
>>> book hasn't covered yet, makes me wonder if it's even possible to  
>>> answer this problem, given what we know so far...
>>>
>>> Thanks very much,
>>>
>>> Cooke
>>>
>>> Looking for last minute shopping deals? Find them fast with  
>>> Yahoo! Search.
>>> _________________________________________________
>>>   For list-related administrative tasks:
>>>   http://list.cs.brown.edu/mailman/listinfo/plt-scheme
>>
>>
>>
>> Looking for last minute shopping deals? Find them fast with Yahoo!  
>> Search.
>
>
>
> Never miss a thing. Make Yahoo your homepage.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20080327/9a3e5e69/attachment.html>

Posted on the users mailing list.