Trilhas
/
Common Lisp
Common Lisp
/
Exercícios
/
O mapeador magnífico de Lucy
O mapeador magnífico de Lucy

O mapeador magnífico de Lucy

Exercício de aprendizagem

Introdução

Mapeamento

Mapeamento se refere à aplicação de uma função a cada elemento de uma sequência para produzir uma nova sequência.

Isso pode ser feito facilmente em uma lista com a função mapcar. Vamos supor que temos uma função double que multiplica seu argumento por 2:

(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)

Repare que o primeiro argumento é uma função a ser chamada. O #' é uma sintaxe especial de citação para especificar uma função.

double foi chamada primeiro com o primeiro elemento, depois com o segundo, etc. Os resultados foram reunidos em uma lista, que é o valor da expressão.

Filtragem

Filtragem é o processo de criar uma sequência a partir de outra sequência, copiando todos os elementos da sequência original, exceto alguns. A escolha de quais itens incluir na nova sequência pode ser feita por uma função de predicado (uma função que avalia para um valor boolean) ou por igualdade com um objeto específico.

Remover por um predicado

remove-if é uma função que recebe uma função de predicado e uma sequência como argumentos e retorna uma sequência apenas com os elementos para os quais o predicado avaliou para falso. Em outras palavras, ela "remove" todos os elementos da sequência para os quais o predicado avalia para verdadeiro. No entanto, observe que essa função não modifica a sequência original! Em vez disso, ela retorna uma nova sequência sem os elementos em questão. Se o predicado foi verdadeiro para todos os valores, então uma sequência vazia é retornada.

(remove-if #'evenp '(1 2 3 4 5)) ; => (1 3 5)
(remove-if #'oddp '(1 3 5))      ; => ()

Remover um item específico

Se você quiser remover um item específico de uma sequência, pode usar remove, que recebe o item a remover e uma sequência. Todos os valores da sequência que não são iguais ao item a remover são retornados. OBSERVAÇÃO: por padrão, a igualdade é verificada com o eql predicado de igualdade genérico.

(remove 1 '(1 2 1 3 1 4)) ; => (2 3 4)
(remove #\l "hello")      ; => "heo"

Instruções

Lucy, a alienígena do Lisp, gosta de Números, e acha que alguns deles são "magníficos".

Ela pede que você a ajude a escrever funções para deixar os números mais magníficos.

O que Lucy considera magnífico em um número pode mudar, então as funções precisam ser flexíveis.

1. Torne magnífico

Para transformar uma lista de números em uma lista de números mais magníficos, você vai precisar escrever uma função make-magnificent-maybe que recebe uma função para aplicar aos números e uma lista de números. Ela deve resultar em uma lista de números mais magníficos (de acordo com a função fornecida)

(make-magnificent-maybe #'square '(1 2 3)) ; => (1 4 9)
(make-magnificent-maybe #'1+ '(1 2 3))     ; => (2 3 4)

2. Só os melhores

Depois de (esperançosamente) deixar os números mais magníficos, Lucy quer ver apenas os números que são realmente magníficos.

Ela sabe com certeza que 1 nunca é magnífico, então você só precisa remover esse.

Mas fora isso, Lucy às vezes muda de ideia, então mais uma vez ela vai te dar uma função que diz se um número é magnífico ou não.

Você vai precisar escrever uma função only-the-best que recebe uma função e uma lista de números e retorna apenas os melhores números (nem o 1 e nem os números para os quais a função resulta em verdadeiro).

(only-the-best #'evenp '(1 2 3 4 5)) ; => (3 5)
(only-the-best #'oddp '(1 3 5))    ; => ()
Editar via GitHub O link abre em uma nova janela ou aba
Common Lisp Exercism

Tudo pronto para começar O mapeador magnífico de Lucy?

Crie sua conta no Exercism para aprender e dominar Common Lisp com 27 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.