Parcours
/
Common Lisp
Common Lisp
/
Exercices
/
Le magnifique mapper de Lucy
Le magnifique mapper de Lucy

Le magnifique mapper de Lucy

Exercice d'apprentissage

Introduction

Mappage

Le mappage désigne l'application d'une fonction à chaque élément d'une séquence pour produire une nouvelle séquence.

On peut facilement le faire sur une liste avec la fonction mapcar. Supposons que l'on ait une fonction double qui multiplie son argument par 2 :

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

On remarque que le premier argument est une fonction à appeler. Le #' est une syntaxe de citation spéciale pour désigner une fonction.

La fonction double a d'abord été appelée avec le premier élément, puis avec le deuxième, etc. Les résultats ont été collectés dans une liste, qui est la valeur de l'expression.

Filtrage

Le filtrage est le processus qui consiste à créer une séquence à partir d'une autre en copiant tous les éléments de la séquence d'origine sauf certains. Le choix des éléments à inclure dans la nouvelle séquence peut se faire par une fonction prédicat (une fonction qui renvoie une valeur booléenne), ou par égalité avec un objet précis.

Supprime à l'aide d'un prédicat

remove-if est une fonction qui prend une fonction prédicat et une séquence comme arguments, et renvoie une séquence contenant uniquement les éléments pour lesquels le prédicat a renvoyé une valeur fausse. Autrement dit, elle « supprime » tous les éléments de la séquence pour lesquels le prédicat renvoie vrai. Toutefois, note que cette fonction ne modifie pas la séquence d'origine ! Au lieu de cela, elle renvoie une nouvelle séquence sans les éléments concernés. Si le prédicat était vrai pour toutes les valeurs, une séquence vide est renvoyée.

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

Supprime un élément précis

Si l'on veut supprimer un élément précis d'une séquence, on peut utiliser remove, qui prend l'élément à supprimer et une séquence. Toutes les valeurs de la séquence qui ne sont pas égales à l'élément à supprimer sont renvoyées. REMARQUE : L'égalité est vérifiée par défaut avec le prédicat d'égalité générique eql.

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

Instructions

Lucy, l'extraterrestre du Lisp, aime les Nombres et trouve que certains d'entre eux sont « magnifiques ».

Lucy te demande de l'aider à écrire des fonctions pour rendre les nombres plus magnifiques.

Ce qui rend un nombre magnifique aux yeux de Lucy peut changer, donc les fonctions devront être flexibles.

1. Rends magnifique

Pour transformer un tableau de nombres en un tableau de nombres plus magnifiques, tu devras écrire une fonction make-magnificent-maybe qui prend une fonction à appliquer aux nombres et un tableau de nombres. Elle doit s'évaluer en un tableau de nombres plus magnifiques (d'après la fonction fournie).

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

2. Seulement les meilleurs

Après avoir (avec un peu de chance) rendu les nombres plus magnifiques, Lucy veut simplement voir les nombres qui sont vraiment magnifiques.

Lucy sait parfaitement que 1 n'est jamais magnifique, tu devras donc simplement le retirer.

Mais à part ça, Lucy change parfois d'avis, et te donnera donc à nouveau une fonction qui te dira si un nombre est magnifique ou non.

Tu devras écrire une fonction only-the-best qui prend une fonction et un tableau de nombres et ne renvoie que les meilleurs nombres (ni 1, ni les nombres pour lesquels la fonction renvoie vrai).

(only-the-best #'evenp '(1 2 3 4 5)) ; => (3 5)
(only-the-best #'oddp '(1 3 5))    ; => ()
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Common Lisp Exercism

Prêt à commencer Le magnifique mapper de Lucy ?

Inscris-toi sur Exercism pour apprendre et maîtriser Common Lisp avec 27 concepts92 exercices, et un vrai mentorat humain, le tout gratuitement.