Em 5 de agosto de 2010 11:45, Stephen Eilert <[email protected]> escreveu:

>
> On Aug 5, 11:27 am, Alejandro Moraga <[email protected]> wrote:
> > Estar nesse grupo realmente é desnecessário e perca de tempo.
>
> Realmente. Só faz sentido entrar em um grupo quando se possui um
> conhecimento mínimo de interpretação de textos.
>
> Vamos parar de chorar e tentar resolver o problema proposto em Lisp?
>

Já que você pediu com jeitinho ;)

(defun problemao-solver (listas &optional (recuo 0))
  (when listas
    (let* ((lista1 (first listas))
           (elemento1 (first lista1)))
      (loop repeat recuo do (format t "  "))
      (format t "~A~%" elemento1)
      (let ((listas-sem-elemento1
             (remove elemento1 listas :key #'car :test #'string=))
            (listas-com-elemento1
             (mapcar #'cdr (remove elemento1 listas :key #'car
                                   :test #'string/=))))
        (problemao-solver (remove nil listas-com-elemento1) (1+ recuo))
        (problemao-solver listas-sem-elemento1 recuo)))))


Parece que funciona:

cl-user> (problemao-solver
          '(("Empresa de Teste" "Diretoria de teste" "UN de teste" "UR de
teste")
            ("Empresa de Teste" "Diretoria de teste" "UN de teste" "UR de
teste"  "teste")
            ("Empresa de Teste" "Diretoria de teste" "UN de teste" "UR de
teste 2")
            ("Empresa de Teste")
            ("Empresa de Teste" "Diretoria de teste")
            ("Empresa de Teste" "Diretoria de teste" "UN de teste")
            ("Empresa de Teste" "Diretoria de teste" "UN de teste" "UR de
teste 2" "teste 2")))
Empresa de Teste
  Diretoria de teste
    UN de teste
      UR de teste
        teste
      UR de teste 2
        teste 2
nil
cl-user>


É, Alex Queiroz, parece que Lisp é realmente baixo nível :P

Eu não me preocupei com a eficiência: poderia ser feito um loop para coletar
as LISTAS-COM-ELEMENTO-1 e as LISTAS-SEM-ELEMENTO-1 ao mesmo tempo, tem
também o argumento opcional e esse algoritmo aloca memória sem medo (o
último remove poderia ser substituído por delete por exemplo). Mas é rápido
o bastante e resolve o problema sem problemas :)

E, como eu disse, não precisa nem remover as listas repetidas pelo algoritmo
anterior.

-- 
You received this message because you are subscribed to the Google Groups 
"Lisp-br" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/lisp-br?hl=en.

Responder a