Lista 2 de Lisp (versao 1)

Problema 1

A informação sobre um aluno é uma lista com RA, nota 1, nota 2 e nota 3. Cada nota representa a nota de uma prova e é um real de 0 a 10, ou NIL se o aluno nao fez a prova. A nota final do aluno é a media das 2 maiores notas, onde NIL corresponde a nota 0.

Escreva a função separa cujo argumento é uma lista de informações com todos os alunos de uma classe, e retorna uma lista com 2 elementos; o primeiro é o RA dos alunos que passaram por ordem de RA, e o segundo é uma lista de pares (RA precisa) por ordem crescente de precisa, onde precisa é quanto o aluno precisa tirar no exame, para ficar com 5.

Nota: problema na medida para programação de alta ordem, com mapcar e apply.

Problema 2

Dado um arquivo "dados.txt" com uma palavra por linha, milhares de linhas. Implemente a função Conta sem argumentos, que imprime todas as palavras que aparecem no arquivo, com a sua frequencia, na ordem decrescente de frequencias (e se frequencias iguais, ordene as palavras lexicamente)

Ex: palavras aa aa bb aa cc bb cc estão no arquivo, uma por linha. A saida deverá ser:

aa 3
bb 2
cc 2

Nota: uma hash-table cai como uma luva neste problema. Mas é preciso pensar na função de teste da hash dependendo do que se guarda como chave, um string ou um simbolo! E essa é a decisão central se voce optar pelo hash: é um hash de que, de simbolos ou de string. Se voce decidir pro simbolo a função symbol-name retorna um string com o nome do simbolo.

Problema 3

Um grafo direcionado aciclico é representado no arquivo "grafo.txt" como
n (no-1 no-1.1 no-1.2 no-1.3 ... no-1.k)
(no-2 no-2.1 no-2.1 ... no-2.m)
...
(no-n ....)
onde n é o numero de vertices do grafo, e cada um dos no- é um inteiro. A linha
(no-2 no-2.1 no-2.1 ... no-2.l)
diz que ha uma aresta de no-2 para no-2.1, outra aresta de no-2 para no-2.2, e assim por diante.

Por exemplo

3
(1 2)
(3 1 2)
representa o grafo de 3 vertices com arestas (1 2) (3 1) e (3 2).

Implemewnte a função grafo, que le o arquivo e retorna uma lista com uma ordenação topologica do grafo lido. Voce pode assumir (não precisa testar) que o grafo será aciclico e portanto terá pelo menos uma ordenação topologica.

No exemplo acima, a função retornaria

(3 1 2)

Nota: seria interessante se este problema fosse exatamente equivalente ao feito em Java. A diferença esta no formato de entrada. No problema em Java a uma linha continha:

no-2 no-2.1 no-2.1 ... no-2.l
e neste cada linha contem:
(no-2 no-2.1 no-2.1 ... no-2.l)
O parenteses faz toda a diferença. O read do lisp pode ler uma linha inteira como uma lista. Se eu tivess deixado no formato original, seria necessario ler a linha toda como string e ler os nos do string. Isso pode ser feito com read-from-string mas há complicações. Se voce tiver tempo, pense como ler os dados no formato original. Se voce nao tiver, veja aqui a minha solução para a leitura no formato original.