et RPL : Caractères

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.

Lire la suite…