[racket] a small programming exercise

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Thu Oct 14 12:48:20 EDT 2010

Because (require racket) provides everything you'd ever want. 


On Oct 14, 2010, at 12:39 PM, Nadeem Abdul Hamid wrote:

>> Thanks for setting my head straight!
> 
> 
> Oh, I wasn't meaning to do that! :)
> 
> Incidentally, why does your solution run even when the language level
> is set to "Intermediate Student"? In fact, even mine runs in ISL while
> I use lambda. I'm running DrRacket, version 5.0.1.7--2010-10-06.
> 
> --- nadeem
> 
> 
> On Thu, Oct 14, 2010 at 12:29 PM, Matthias Felleisen
> <matthias at ccs.neu.edu> wrote:
>> 
>> I ran this stress test for your 5 line solution and mine:
>> 
>>> (define *the-list* (build-list 10000000 (lambda (i) (random (+ i 1)))))
>>> (time (______ *the-list*))
>> 
>> For small benchmarks, your solution may take twice as long as my 8 line ASL solution,
>> but for something of the above size -- there can't be that many lakes in MN -- it takes
>> almost the same time.
>> 
>> In short, don't be afraid of 10 iterations over long lists, and don't bother with
>> hash tables and fancy algorithmics until you know you need it -- by measuring.
>> 
>> I used to believe this but have temporarily forgotten this lesson due to external influences.
>> 
>> -- Matthias
>> 
>> 
>> 
>> 
>> On Oct 14, 2010, at 12:09 PM, Nadeem Abdul Hamid wrote:
>> 
>>> Here's a solution in ISL:
>>> 
>>> ;; benson : [listof positive-number] -> [listof (list number number)]
>>> (define (benson a-lon)
>>>  (let ([digs (map (compose
>>>                    string->number first explode number->string
>>> exact->inexact) a-lon)])
>>>    (build-list 10
>>>                (λ(i) (list i
>>>                            (/ (length (filter (λ(d) (= i d)) digs))
>>>                               (length digs)))))))
>>> 
>>> 
>>> ;; TESTS (matthias' and jay's, modified)
>>> 
>>> (require racket)   ; (only-in ... for/list)
>>> 
>>> (check-expect (filter (lambda (p) (not (zero? (second p))))
>>>                      (benson '(123 124 125 126 23 24 31)))
>>>              (list (list 1 4/7) (list 2 2/7) (list 3 1/7)))
>>> 
>>> (check-expect
>>> (benson (list 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.10
>>>            11 12 13 14 15 16 17 18 19
>>>            21 22 23 24 25 26 27 28
>>>            31 32 33 34 35 36 37
>>>            41 42 43 44 45 46
>>>            51 52 54 54 55
>>>            61 62 63 64
>>>            71 72 73
>>>            81 82
>>>            91))
>>> (for/list ([i (in-range 10)])
>>>   (list i
>>>         (/ (- 10 i)
>>>            (+ 10 9 8 7 6 5 4 3 2 1))))
>>> )
>>> 
>>> 
>>> 
>>> 
>>> On Thu, Oct 14, 2010 at 11:30 AM, Matthias Felleisen
>>> <matthias at ccs.neu.edu> wrote:
>>>> 
>>>> 
>>>> I love this solution but let me supply a solution in ASL, the teaching language:
>>>> 
>>>> 
>>>> ;; ASL
>>>> (require racket) ; (only-in ... hash->list)
>>>> ;; I could have used the key for sort to get around the second lambda
>>>> 
>>>> ;; [Listof String] -> [Listof (cons Digit Nat)]
>>>> ;; compute a frequency count of the leading digit in the number of lon
>>>> ;; assume: the digits are positive
>>>> (define (collect lon)
>>>>  (local ((define loch (map (compose string->list number->string) lon))
>>>>          (define (upd c H) (hash-set H c (+ (hash-ref H c 0) 1)))
>>>>          (define hash (foldl (lambda (x H) (upd (first x) H)) #hash() loch))
>>>>          (define loh# (hash->list hash))
>>>>          (define srtd (sort loh# (lambda (l r) (> (cdr l) (cdr r))))))
>>>>    (map (lambda (x) (cons (string->number (string (car x))) (cdr x))) srtd)))
>>>> 
>>>> (check-expect (collect '(123 124 125 126 23 24 31))
>>>>              (list (cons 1 4) (cons 2 2) (cons 3 1)))
>>>> 
>>>> 
>>>> If actual I/O is required, I'd use batch-io to read CSV files and
>>>> display the list above in a batch action.
>>>> _________________________________________________
>>>>  For list-related administrative tasks:
>>>>  http://lists.racket-lang.org/listinfo/users
>>>> 
>>> 
>>> 



Posted on the users mailing list.