Exame de 1ª chamada, 11/1/2002
RESOLUÇÃO
1.1
(define tira-um-de-1-a-n (lambda (n lis) (cond ((= 1 n) (cdr lis)) (else (cons (car lis) (tira-um-de-1-a-n (sub1 n) (cdr lis)))))))1.2
(define tira-um-a-sorte (lambda (lis) (let* ((comp (length lis)) (num (random comp))) (tira-um-de-1-a-n (add1 num) lis))))2.1
(define substitui! (lambda (lis velho novo) (cond ((null? lis)) ((equal? (car lis) velho) (set-car! lis novo)) (else (substitui! (cdr lis) velho novo)))))2.2
(define mais-um-numero! (lambda (aposta num) (cond ((member num aposta) 'ok) ((member 0 aposta) (substitui! aposta 0 num) 'ok) (else (let ((max-val (apply max aposta))) (if (< num max-val) (substitui! aposta max-val num)) 'ok)))))3.2
(define faz-jogo-furos (lambda () (let ((dim 100)) (let* ((cartolina (make-vector dim 'vazio)) (n-cast (round (* .5 dim))) (n-amar (round (* .25 dim))) (n-verd (round (* .13 dim))) (n-azul (round (* .07 dim))) (n-verm (- dim (+ n-cast n-amar n-verd n-azul)))) (poe-codigo! n-cast 'cast cartolina 0) (poe-codigo! n-amar 'amar cartolina n-cast) (poe-codigo! n-verd 'verd cartolina (+ n-cast n-amar)) (poe-codigo! n-azul 'azul cartolina (+ n-cast n-amar n-verd)) (poe-codigo! n-verm 'verm cartolina (+ n-cast n-amar n-verd n-azul)) (baralha! cartolina) cartolina)))) (define poe-codigo! (lambda (n cod vect i-partida) (letrec ((ciclo (lambda (conta) (if (= n conta) 'ok (begin (vector-set! vect (inexact->exact (+ i-partida conta)) cod) (ciclo (add1 conta))))))) (ciclo 0)))) (define baralha! (lambda (vec) (let ((comp-vec (vector-length vec))) (letrec ((ciclo (lambda (indice) (if (= indice comp-vec) 'ok (begin (troca-entre-si! vec indice (random comp-vec)) (ciclo (add1 indice))))))) (ciclo 0))))) (define troca-entre-si! (lambda (vec i j) (let ((temp (vector-ref vec j))) (vector-set! vec j (vector-ref vec i)) (vector-set! vec i temp))))