Criada: 2014-07-27 Modificada: 2015-01-07
Enunciado distribuído na sala.
Exista herança múltipla em Common Lisp. Herança múltipla é a possibilidade de definir classes que tenham mais de uma classe mãe.
Variante com acumulador:
(defun separa (lista) (separa-acc lista () ()) ) (defun separa-acc (lista pos nopos) (cond ((null lista) (list pos nopos)) ((> (car lista) 0) (separa-acc (cdr lista) (cons (car lista) pos) nopos)) (t (separa-acc (cdr lista) pos (cons (car lista) nopos))) ) )
Variante sem acumulador:
(defun separa (lista) (if (null lista) (list () ()) (let* ((res (separa (cdr lista))) (pos (first res)) (nopos (second res))) (if (> (car lista) 0) (list (cons (car lista) pos) nopos) (list pos (cons (car lista) nopos)) ) ) ) )
A solução a seguir é bem direta, usando a técnica de map-reduce,
que tem recebido muita atenção ultimamente. Note que
reduce
não pode ser chamado com lista vazia, por isso
foi necessário o if
, e consequentemente
o let
, para evitar de chamar (pais x)
duas
vezes.
(defun ancestrais (x) (let ((p (pais x))) (if (null p) (list x) (cons x (reduce #'union (mapcar #'ancestrais p))) ) ) )
(defun perfeito (n) (and (> n 1) (= n (somadiv n)) ) ) (defun somadiv (n) (somadiv-ateh (1- n) n) ) (defun somadiv-ateh (k n) (cond ((<= k 0) 0) ((= 0 (mod n k)) (+ k (somadiv-ateh (1- k) n))) (t (somadiv-ateh (1- k) n)) ) )
Na Questão 1, que valia 0,5, a nota de cada aluna(o) foi 0,0 ou 0,5. Quem acertou e justificou apropriadamente ganhou 0,5. Os demais ficaram com 0,0. Ficou com 0,0 também quem disse que Lisp é uma linguagem orientada a objetos. Ficou com 0,0 quem não justificou nem explicou corretamente sua resposta.
Na Questão 2, os itens tiveram os seguintes valores:
Critérios adicionais para a Questão 2:
Exceto pelas Questões 1 e 2, o critério de correção começou por decidir como seria a pontuação: de cima para baixo ou de baixo para cima. Se a resposta estava bem escrita, com sintaxe Lisp correta, resolução do problema pedido (e não de outro) e com comprimento proporcional à complexidade da questão, então a correção procedeu de cima para baixo, ou seja, parte-se do valor integral e vão sendo subtraidas frações de pontos para cada defeito encontrado.
Por outro lado, se a resposta estava mal escrita, com sintaxe errada, resolvendo o problema errado ou incompleta, então a correção procedeu de baixo para cima: parte-se de zero e vão sendo adicionadas frações de pontos a cada indício de conhecimento importante encontrado. Embora em geral a correção de cima para baixo resulte em notas maiores numa questão, é possível ter exceções a esta tendência.
Nas questões de escrita de código Lisp, os seguintes critérios foram universalmente aplicados. Os valores negativos se aplicam à correção de cima para baixo, e os valores positivos se aplicam à correção de baixo para cima.
t
na cláusula default: -0,5A seguir, critérios específicos para cada questão. Novamente, os valores negativos se aplicam à correção de cima para baixo, e os valores positivos se aplicam à correção de baixo para cima.
© 2014 João Meidanis