Percursos
/
Clojure
Clojure
/
Exercícios
/
Operações com listas
Operações com listas

Operações com listas

Médio

Instruções

Implementa operações básicas com listas.

Em linguagens funcionais, operações sobre listas como length, map e reduce são muito comuns. Implementa uma série de operações básicas com listas, sem usar as funções já existentes.

O número exato e os nomes das operações a implementar variam de track para track, para evitar conflitos com nomes já existentes, mas as operações gerais que vais implementar incluem:

  • append (dadas duas listas, acrescenta todos os itens da segunda lista ao fim da primeira lista);
  • concatenate (dada uma série de listas, combina todos os itens de todas as listas numa única lista achatada);
  • filter (dado um predicado e uma lista, devolve a lista de todos os itens para os quais predicate(item) é True);
  • length (dada uma lista, devolve o número total de itens que ela contém);
  • map (dada uma função e uma lista, devolve a lista dos resultados de aplicar function(item) a todos os itens);
  • foldl (dada uma função, uma lista e um acumulador inicial, aplica fold (reduce) a cada item no acumulador, a partir da esquerda);
  • foldr (dada uma função, uma lista e um acumulador inicial, aplica fold (reduce) a cada item no acumulador, a partir da direita);
  • reverse (dada uma lista, devolve uma lista com todos os itens originais, mas pela ordem inversa).

Repara que a ordem pela qual os argumentos são passados às funções de fold (foldl, foldr) é importante.

Apêndice

Note

As instruções acima estão sincronizadas com um repositório partilhado, para garantir a consistência entre todas as tracks de linguagens. Este apêndice apresenta esclarecimentos adicionais ou modifica as instruções conforme necessário, para as alinhar melhor com os objetivos da track de Clojure.

Neste exercício da track de Clojure, assume que tanto a entrada como a saída são vetores, como indicam os testes. Como objetivo extra, pensa em como implementar uma abordagem que não use listas nos passos intermédios.

É importante não reutilizar funções incorporadas do Clojure com funcionalidade semelhante, pois fazê-lo reduziria o valor de aprendizagem pretendido do exercício. As principais funções do namespace clojure.core a evitar incluem into, concat, cat, lazy-cat, mapcat, flatten, filter, filterv, remove, count, map, mapv, reduce, transduce, reverse e rseq.

Objetivos opcionais

O objetivo opcional destina-se a quem procura um desafio extra e foi pensado partindo do princípio de que já concluíste o objetivo principal.

Tenta passar os testes concebendo uma abordagem que assume o seguinte:

  • Tanto a entrada como a saída são listas em vez de vetores. Repara que, como habitualmente, não é preciso modificar os testes.
  • Os vetores não podem ser usados nos passos intermédios.

Se decidires publicar isto, certifica-te de que incluis um comentário a indicar que resolve o objetivo opcional de usar listas. Não te esqueças de atualizar as docstrings!

Editar via GitHub A ligação abre numa nova janela ou separador
Clojure Exercism

Estás pronto para começar Operações com listas?

Inscreve-te no Exercism para aprenderes e dominares Clojure com 12 conceitos105 exercícios, e mentoria humana real, tudo grátis.

Mergulha a fundo em Operações com listas!

Desfruta de uma introdução prática à recursão, explora as alternativas imperativas e funcionais às Operações com listas e mergulha a fundo na recursão de cauda e nas funções acumuladoras.