Dans cette vidéo sur APL, j’explique comment travailler sur chacun des éléments d’une liste. Nous avons vu de DOSUBS ou DOLIST permettent d’arriver au même résultat. Voyons sur cet exemple que cela fonctionne également avec des chaines de caractères.
Exemple 4 – R.A.T.P
⊃¨ 'RENTRE' 'AVEC' 'TES' 'PIEDS' RATP
Ce qui signifie prendre le premier élément ⊃ de chaque terme du vecteur. Donc bien voir que :
⊃ 'RENTRE' R ⊃ 'RENTRE' 'AVEC' 'TES' 'PIEDS' RENTRE
En RPL, le premier élément d’une liste peut être récupéré par HEAD. Ce qui donne :
2: {"RENTRE" "AVEC" "TES" "PIEDS"} 1: « 1 « HEAD » DOLIST » EVAL 1: {"R" "A" "T" "P"}
Pour avoir la concaténation et obtenir “RATP”, sachez que le ∑LIST fonctionne aussi avec les listes de chaines de caractères…
2: {"RENTRE" "AVEC" "TES" "PIEDS"} 1: « 1 « HEAD » DOLIST ∑LIST » EVAL 1: "RATP"
Exemple 5 – Brin d’ADN ?
Toujours tiré d’une de mes vidéos sur APL, on se demande si une chaine de caractères est un brin d’ADN, c’est-à-dire qu’il n’y a que les lettres A, C, T ou G. Le ET logique se note ∧ en APL.
ADN ← {∧/ ⍵ ∊ 'ACTG'} ⍝ Réduction + appartenance ADN 'ACCTTGCCA' Output : 1 ⍝ C'est bien un brin ADN ADN 'ACCTTXCCA' Output : 0 ⍝ Ce n'est pas un brin ADN
Commençons par voir comment séparer les lettres d’une chaine de caractères en RPL. Une des solutions proposées par Norman Brenner est celle-ci :
« → s « « s j j SUB » 'j' 1 s SIZE 1 SEQ » » 'SP. STO
Ce qui signifie : on crée la suite (SEQ) pour j allant de 1 jusqu’à la taille de la chaine où chaque terme est égal à la portion de la chaine comprise entre j et j, donc le jième caractère.
1: "ACCTA" VAR SP. 1: {"A" "C" "C" "T" "A"}
On doit maintenant parcourir chacun des caractères de la liste et regarder s’ils sont tous dans “ACTG”. Pour cela on va utiliser POS qui renvoie soit la position de la lettre dans la chaine soit zéro.
Dans un second temps on effectue une réduction par un ET sur l’ensemble des résultats, c’est-à-dire que l’on aura 0 si une des lettres n’était pas dans “ACTG”. Cela revient à faire le produit des éléments. Pour éviter d’avoir un nombre (produit des positions des lettres), on va regarder le signe du résultat. Ce qui donne :
« SP. 1 « "ACTG" SWAP POS » DOLIST ΠLIST SIGN » 'ADN STO "ACCTTGCCA" VAR ADN 1. # C'est bien un brin ADN "ACCTTXCCA" ADN 0. # Ce n'est pas un brin ADN
Exemple 6 – Prix des sushis
Nouvel exemple de mes vidéos, sachant qu’un sushi coûte 2 EUR, combien coûte cette chaine : ” S SS SSS S S” ?
Il faut compter le nombre de “S” et multiplier le résultat par 2.
SU ← {2 × +/ ⍵='S'} SU ' S SS SSS S S' Output: 16
Vous ne devriez avoir aucun mal à lire cette version en RPL :
« SP. 1 « "S" == » DOSUBS ∑LIST 2 × » » 'SU STO " S SS SSS S S" VAR SU 16.
ou encore avec MAP :
« SP. « "S" == » MAP ∑LIST 2 × » » 'SU STO " S SS SSS S S" VAR SU 16.