Des exercices corrigés en APL

AIRE D’UN DISQUE

Écrire une fonction aire qui calcule l’aire d’un disque en fonction du rayon.
Formule : Aire=π*rayon*rayon

      aire ← {⍵ × ○1}

      aire 2
6.283185307

⍝ La notation ○1 correspond à Pi
⍝ Version 2
      aire ← (○1 × ⊢)
      
      aire 2
6.283185307

CONTAMINATION

Une IA (Intelligence Artificielle) a contaminé votre texte et tous les caractères vont muter ! Exemples :

'abc' contamination 'z' donne 'zzz'
'_3ebzgh4' contamination '&' donne '&&&&&&&&'

      contamination ← {(⍴⍺) ⍴ ⍵}

      'abc' contamination 'z'
zzz
      '_3ebzgh4' contamination '&'
&&&&&&&&

⍝ La notation ⍴ signifie "taille de", par exemple ⍴ 'abc' vaut 3
⍝ Mais sert aussi pour redimensionner un objet :
      3 ⍴ '*'
***
      2 3 ⍴ '*'
***
***

CARTE DE CREDIT

Écrire une fonction qui permet de masquer les chiffres d’un numéro de carte de crédit sauf les 4 derniers. Exemples :

masquer '123456789' donne #####6789
masquer '4789' donne 4789

      masquer ← {(4 ↓ (⍴⍵) ⍴ '#'),¯4 ↑ ⍵}

      masquer '123456789'
#####6789
      masquer '789'
 789
      masquer '4789'
4789

⍝ ↓ pour oublier des éléments et ↑ pour les prendre :
      3 ↑ 'bonjour'
bon
      ¯4 ↑ 'bonjour'
jour
      3 ↓ 'bonjour'
jour

EXERCICE : QUE VA-T-IL S'AFFICHER ?

      'du' {⍵,⍺} 'tor'

      'elnopr'[2 1 5 1 6 1 3 4 1 2]
     
      'surgir'{(3↑⍺),¯5↑⍵}'entreprise'

      'surgir' {3↑⍺,¯5↑⍵}'entreprise'

      '^*' {((⍴⍺)×⍴⍵)⍴⍺} 'sapin'
      
      3 {⎕A[⍺ + ⎕A ⍳ ⍵]} 'BQLFIBABPKBFDBP'

MAJEUR OU MINEUR

      majMin ← {⍵ ≥ 18 : 'Majeur' ⋄ 'Mineur'}

      majMin 19
Majeur
      majMin 9
Mineur

PARC D'ATTRACTION

Un parc d’attraction est accessible aux enfants de 13 ans et plus. Il est également accessible aux enfants de moins de 13 ans s’ils sont accompagnés par un adulte. Écrire une fonction parc qui admet 2 paramètres, l’âge du visiteur et s’il est accompagné ou non d’un adulte (0 ou 1). En sortie on obtient 'Bonne journée' ou 'Entrée interdite'

14 parc 1 donne 'Bonne journée'

4 parc 0 donne 'Entrée interdite'

      parc ← {⍺ ≥ 13 ∨ ⍵ : 'Bonne journée' ⋄ 'Entrée interdite'}

      14 parc 1
Bonne journée
      14 parc 0
Bonne journée
      4 parc 0
Entrée interdite
      4 parc 1
Bonne journée

NOM D'UN GROUPE

Un ami veut trouver un nouveau nom pour son groupe de musique. Il aime les groupes qui utilisent la formule : 'The' + un nom avec la première lettre en majuscule.

groupe 'knife' donne 'The knife'

Cependant, lorsqu'un nom commence et se termine avec la même lettre, il aime répéter le nom deux fois en les reliant et sans le « The » devant.

groupe 'alaska' donne 'alaskalaska'

Pouvez-vous écrire une fonction qui prend en paramètre un mot et renvoie le nom du groupe ?

      groupe ← {,/(⊃'The ' (¯1↓⍵) [1+⊃⍵ = ¯1↑⍵]) ⍵}

      groupe 'knife'
 The knife 
      groupe 'alaska'
 alaskalaska 

INITIALES

      initiales ← {(⊃¨(1,' ' = ⍵) ⊂ ⍵) ∘., '.'}
      initiales 'Jean Dujardin'
 J.  D. 

LA FERME

     ferme ← 'LVVLCVCCCMCCPVMM'
     compte ← {+/ ⍺ ∊ ⍵}

// Nombre de Vaches dans la ferme
      ferme compte 'V'
4

// Nombre de pattes des animaux
      pattes ← {'224'['CP' ⍳ ⍵]}

      pattes 'V'
4
      pattes 'P'
2

JASON

      kill ← {1 ↑¨ (⊃ ,/ ⍺ > 1 ↓¨ ⍵) / ⍵}

      5 kill liste
┌─────────┬───────┐
│┌───────┐│┌─────┐│
││Tiffany│││Tyler││
│└───────┘│└─────┘│
└─────────┴───────┘

VIRUS

      virus ← {'*' ∊ ⍵ : (⍴⍵) ⍴ '*' ⋄ ⍵}¨

      zones ← 'aabc*' 'dde' '*' 'aff' 'ed*'
      virus zones
┌─────┬───┬─┬───┬───┐
│*****│dde│*│aff│***│
└─────┴───┴─┴───┴───┘

MISSION SECRETE

      code ← {⌽¨(' ' ≠ ⍵) ⊆ ⍵}

      ph ← 'NOISSIM ETERCES RUOP SUOV'
      code ph
┌───────┬───────┬────┬────┐
│MISSION│SECRETE│POUR│VOUS│
└───────┴───────┴────┴────┘

FAUX BINAIRE

      binaire ← {5 < ⍎¨ ⍵}

      binaire '8124687574'
1 0 0 0 1 1 1 0 1 0

LEGUMES

      legumes ← 'AIL' 'ARTICHAUT' 'ASPERGE' 'AUBERGINE' 'AVOCAT' ...

      ⍴ legumes
63

{('O' ∊¨ ⍵) / ⍵} legumes

┌──────┬───────┬───────┬─────────┐
│AVOCAT│BROCOLI│CAROTTE│...      │
└──────┴───────┴───────┴─────────┘
 
       {(⊃,/ ('C' = 1 ↑¨ ⍵) ∧ 10 ≤ ⍴¨ ⍵) / ⍵} legumes
┌──────────┬──────────┐
│CHAMPIGNON│CITROUILLE│
└──────────┴──────────┘
 
       {(⊃,/ 'E' = ¯1 ↑¨ ⍵) / ⍵} legumes
┌───────┬─────────┬─────┬─────────┐
│ASPERGE│AUBERGINE│BETTE│...      │
└───────┴─────────┴─────┴─────────┘

MOT LE PLUS COURT

Écrire une fonction mini qui admet une liste de mots en paramètre et renvoie le mot ayant le moins de lettres (on supposera qu’il n’y en a qu’un).

      mots ← 'bonjour' 'salut' 'bye' 'coucou'
      mini ← {⍵[⊃ ⍋ ⍴¨ ⍵]}
      mini mots
┌───┐
│bye│
└───┘

BRIN ADN

      adn ← {∧/ ⍵ ∊ 'ACTG': 'Brin ADN' ⋄ 'Pas ADN'}

      brin1 ← 'ACCCCTGTGTGXAC'
      brin2 ← 'ACCCCTGTGTGAC'
      
      adn brin1
Pas ADN
      adn brin2
Brin ADN

DISTANCE SECURITE

      route ← '==000==0==00=000==00=0000===00=====000===00=000====0=0====00===='

      vehicules ← {('=' ≠ ⍵) ⊆ ⍵}
      vehicules route
┌───┬─┬──┬───┬──┬────┬──┬───┬──┬───┬─┬─┬──┐
│000│0│00│000│00│0000│00│000│00│000│0│0│00│
└───┴─┴──┴───┴──┴────┴──┴───┴──┴───┴─┴─┴──┘
      nb_vehicules ← ⍴∘vehicules

      nb_vehicules route
13

      nb_voitures ← {+/ 3 > ⍴¨ vehicules ⍵}
      
      nb_voitures route
┌─┐
│8│
└─┘
      distances ← {('0' ≠ ⍵) ⊆ ⍵}
      
      distances route
┌──┬──┬──┬─┬──┬─┬───┬─────┬───┬─┬────┬─┬────┬────┐
│==│==│==│=│==│=│===│=====│===│=│====│=│====│====│
└──┴──┴──┴─┴──┴─┴───┴─────┴───┴─┴────┴─┴────┴────┘
      danger ← {+/ 1 = ⍴¨ distances ⍵}
      
      danger route
┌─┐
│4│
└─┘

      simple ← {'cv'[1 + 3 > ⍴¨ vehicules ⍵]}
      
      simple route
cvvcvcvcvcvvv

COMPARER DES VITESSES

      )copy dfns.dws cmpx
      HMS ← 3 44 29
      cmpx '(3600×HMS[1]) + (60×HMS[2]) + HMS[3]' '+/ 3600 60 1 × HMS' '3600 60 1 +.× HMS' '60⊥HMS'
  (3600×HMS[1]) + (60×HMS[2]) + HMS[3] → 1.1E¯6 |   0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
  +/ 3600 60 1 × HMS                   → 3.9E¯7 | -66% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕          
  3600 60 1 +.× HMS                    → 3.3E¯7 | -71% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕            
  60⊥HMS                               → 1.1E¯7 | -91% ⎕⎕⎕⎕