|
|
 |
 |
 |
 |
Scheme Programming Language
|
 |
 |
 |
 |
 |
 |
 |
 |
Counting Values in a List
Hi, I'm just learning scheme as I've heard it's a good language to get a grasp of programming. I've written a simple program, and I've got it returning 4 values where it should return 2. Basically what it does is compare an "answer list" to a list of guesses by the user. So if the user gets all 4 values correct, it returns 1, 1, 1, 1, and if the user gets 2 right, 2 wrong, it returns 1, 1, 0, 0 (or wherever the user guessed incorrectly). What I want it to do is return eg; (4, 0) instead. Anyone got any ideas?
mkin @gmail.com writes: > What I want it to do is return eg; (4, 0) instead. > Anyone got any ideas?
Can you post your code? Cheers, Phil
On Mar 22, 8:23 pm, Phil Jackson <s@place-spam-here.blah> wrote: > mkin @gmail.com writes: > > What I want it to do is return eg; (4, 0) instead. > > Anyone got any ideas? > Can you post your code? > Cheers, > Phil
Well, this is the code that spits out the (1, 1, 1, 1) etc. (define (user-turn guess-list answer-list (user-turn (cond ([equal? (first answer-list) (first guess-list)] 1) ([equal? (first answer-list) (second guess-list)] 0) ([equal? (first answer-list) (third guess-list)] 0) ([equal? (first answer-list) (fourth guess-list)] 0) ) (cond ([equal? (second answer-list) (first guess-list)] 0) ([equal? (second answer-list) (second guess-list)] 1) ([equal? (second answer-list) (third guess-list)] 0) ([equal? (second answer-list) (fourth guess-list)] 0) ) (cond ([equal? (third answer-list) (first guess-list)] 0) ([equal? (third answer-list) (second guess-list)] 0) ([equal? (third answer-list) (third guess-list)] 1) ([equal? (third answer-list) (fourth guess-list)] 0) ) (cond ([equal? (fourth answer-list) (first guess-list)] 0) ([equal? (fourth answer-list) (second guess-list)] 0) ([equal? (fourth answer-list) (third guess-list)] 0) ([equal? (fourth answer-list) (fourth guess-list)] 1) ) )
On Mar 22, 8:40 pm, mkin@gmail.com wrote: > On Mar 22, 8:23 pm, Phil Jackson <s @place-spam-here.blah> wrote: > CODE
Whoops, missing a bracket in there
mkin @gmail.com wrote: > Hi, > I'm just learning scheme as I've heard it's a good language to get a > grasp of programming. I've written a simple program, and I've got it > returning 4 values where it should return 2. > Basically what it does is compare an "answer list" to a list of > guesses by the user. So if the user gets all 4 values correct, it > returns 1, 1, 1, 1, and if the user gets 2 right, 2 wrong, it returns > 1, 1, 0, 0 (or wherever the user guessed incorrectly). > What I want it to do is return eg; (4, 0) instead. > Anyone got any ideas?
If I understand correctly, your program returns a list and you want a different list; e.g. a mapping like this: (0 0 0 0) => (0 4) (0 1 0 0) => (1 3) (0 1 1 0) => (2 2) (1 0 1 1) => (3 1) Do you understand apply? apply + gives you the first element of the result you want. (let ((lst '(0 1 1 1))) (apply + lst)) => 3 Do you understand map? map lets you transform your original list. You might want a transformation like: (0 1 1 1) => (1 0 0 0) (map (lambda (n) (- 1 n)) '(0 1 1 1)) => (1 0 0 0) Now you can get the second element of your desired result: (let ((lst '(0 1 1 1)) (flip (lambda (n) (- 1 n)))) (apply + (map flip lst))) => 1 thus, (define (num_right&wrong lst) (let ((flip (lambda (n) (- 1 n)))) (list (apply + lst) (apply + (map flip lst)))) (num_right&wrong '(0 1 1 1)) => (3 1) demonstrates what you want. There are many other ways to do it. The "schemish" way is to iterate through a list using a tail recursive function: (define (num_right&wrong lst) (letrec ((sum_them (lambda (lst right wrong) (cond ((null? lst) (list right wrong)) ((zero? (car lst)) (sum_them (cdr lst) right (+ wrong 1))) (else (sum_them (cdr lst) (+ right 1) wrong)))))) (sum_them lst 0 0))) (num_right&wrong '(0 1 1 1)) => (3 1) regards, Nate T.
|
 |
 |
 |
 |
|