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