{"id":117,"date":"2022-03-15T10:29:24","date_gmt":"2022-03-15T09:29:24","guid":{"rendered":"https:\/\/blog.univ-angers.fr\/mathsinfo\/?page_id=117"},"modified":"2023-06-01T12:28:38","modified_gmt":"2023-06-01T11:28:38","slug":"apl-et-rpl-extraire","status":"publish","type":"page","link":"https:\/\/blog.univ-angers.fr\/mathsinfo\/apl-et-rpl-extraire\/","title":{"rendered":"et RPL : Extraire"},"content":{"rendered":"<h2>Extraction d&rsquo;\u00e9l\u00e9ments<\/h2>\n<p>En APL, il est facile d&rsquo;extraire les \u00e9l\u00e9ments d&rsquo;un vecteur&nbsp;en utilisant une liste de positions :<\/p>\n<pre>3 7 8 9 10 14 [2 4 1 1 2]\n7 9 3 3 7     \u235d Les 2e, 4e, 1er... \u00e9l\u00e9ments<\/pre>\n<p>Voyons comment obtenir un r\u00e9sultat \u00e9quivalent en RPL, commen\u00e7ons en r\u00e9cup\u00e9rant un seul \u00e9l\u00e9ment :<\/p>\n<pre>2: {3 7 8 9 10 14}\n1: 2\n<strong>PRG<\/strong> LIST ELEM GET\n\n1: 7.  # On a r\u00e9cup\u00e9r\u00e9 le 2e \u00e9l\u00e9ment de la liste<\/pre>\n<p>On doit donc transformer (MAP ou DOLIST) la liste des positions en leurs valeurs correspondantes dans l&rsquo;autre liste. Notons&nbsp;<strong>GL.<\/strong>&nbsp;(GETL dans le document d&rsquo;origine) cette fonction :<\/p>\n<pre>\u00ab \u2192 v \u00ab \u00ab v SWAP GET \u00bb MAP \u00bb \u00bb\n'GL. <strong>STO<\/strong>\n\nou encore :\n\n\u00ab \u2192 v \u00ab 1 \u00ab v SWAP GET \u00bb DOLIST \u00bb \u00bb<\/pre>\n<p>V\u00e9rifions :<\/p>\n<pre>2: {2 4 1 1 2}\n1: {3 7 8 9 10 14}\n<strong>VAR<\/strong> GL.\n\n1: {7. 9. 3. 3. 7.}<\/pre>\n<p>Cr\u00e9ons s\u00e9par\u00e9ment une version analogue nomm\u00e9e&nbsp;<strong>GLT.<\/strong>&nbsp;pour les chaines de caract\u00e8res :<\/p>\n<pre>\u00ab SP. \u2192 v \u00ab \u00ab v SWAP GET \u00bb MAP \u2211LIST \u00bb \u00bb\n'GLT. <strong>STO<\/strong><\/pre>\n<p>Rappelons que \u2211LIST permet de concat\u00e9ner les caract\u00e8res et que&nbsp;<strong>SP.&nbsp;<\/strong>(Split) est la fonction que l&rsquo;on a cr\u00e9\u00e9e dans le chapitre sur les caract\u00e8res permettant de transformer une chaine en liste :<\/p>\n<pre>\u00ab \u2192 s \u00ab \u00ab s j j SUB \u00bb 'j' 1 s SIZE 1 SEQ \u00bb \u00bb\n'SP. <strong>STO<\/strong><\/pre>\n<p>V\u00e9rifions que tout fonctionne :<\/p>\n<pre>2: {6 1 2 9 3 8 9 5 1 2}\n1: \"PLEURAIT \"        # Avec une espace finale\n<strong>VAR<\/strong> GLT.\n\n1: \"APL ET RPL\"<\/pre>\n<p>Et en version APL :<\/p>\n<pre>'PLEURAIT '[6 1 2 9 3 8 9 5 1 2]\nAPL ET RPL<\/pre>\n<p>On peut alors se cr\u00e9er une fonction&nbsp;Get&nbsp;List&nbsp;G\u00e9n\u00e9rale&nbsp;<strong>GLG.<\/strong>, fonctionnant \u00e0 la fois pour les listes et pour les chaines de caract\u00e8res, pour cela il suffit de regarder le type de l&rsquo;\u00e9l\u00e9ment au niveau 1, sachant que les chaines sont du type 2. Le programme ci-dessous duplique le niveau 1 (qui peut \u00eatre une liste ou une chaine), si son type est 2 alors on ex\u00e9cute&nbsp;<strong>GLT.<\/strong>&nbsp;sinon on ex\u00e9cute&nbsp;<strong>GL.<\/strong><\/p>\n<pre>\u00ab DUP TYPE 2 == \u00ab GLT. \u00bb \u00ab GL. \u00bb IFTE \u00bb\n'GLG. <strong>STO<\/strong><\/pre>\n<p>V\u00e9rifions :<\/p>\n<pre>2: { 3 3 1 2 3 3 }\n1: { 3 1 4 1 5 9 }\n<strong>VAR<\/strong> GLG.\n\n1: {4. 4. 3. 1. 4. 4.}\n\n2: { 7 4 8 10 9 1 10 2 4 8 }\n1: \"TROPICALE \"\n<strong>VAR<\/strong> GLG.\n\n1: \"APL ET RPL\"<\/pre>\n<h2>R\u00e9cup\u00e9rer les positions<\/h2>\n<p>C&rsquo;est l&rsquo;op\u00e9ration inverse de GET, voyons d\u00e9j\u00e0 son fonctionnement en APL (symbole IOTA \u2373) :<\/p>\n<pre>'TROPICALE ' \u2373 'APL ET RPL'\n7 4 8 10 9 1 10 2 4 8<\/pre>\n<p>En fran\u00e7ais&nbsp;: Dans la chaine &lsquo;TROPICALE&rsquo;, quelles sont les positions des lettres &lsquo;A&rsquo;, &lsquo;P&rsquo;, &lsquo;L&rsquo;, &lsquo; &lsquo;, &lsquo;E&rsquo;, &lsquo;T&rsquo;&#8230;<\/p>\n<p>Lorsqu&rsquo;une lettre n&rsquo;est pas trouv\u00e9e, APL renvoie comme valeur la longueur de la chaine de gauche + 1. Alors qu&rsquo;en RPL, si l&rsquo;\u00e9l\u00e9ment n&rsquo;est pas trouv\u00e9, c&rsquo;est la valeur 0 qui est renvoy\u00e9e :<\/p>\n<pre>2: { 1 2 3 }\n1: 7\n<strong>PRG<\/strong> LIST ELEM POS\n\n1: 0\n\nEn APL :\n\n1 2 3 \u2373 7\n4            \u235d = longueur de la liste + 1<\/pre>\n<p>Finalement, il suffit de changer GET par POS dans nos programmes pr\u00e9c\u00e9dents :<\/p>\n<pre>\u00ab \u2192 v \u00ab \u00ab v SWAP POS \u00bb MAP \u00bb \u00bb\n'PO. <strong>STO<\/strong>          # Version pour les listes\n\u00ab \u2192 v \u00ab SP. \u00ab v SWAP POS \u00bb MAP \u00bb \u00bb\n'POT. <strong>STO<\/strong>         # Version pour les chaines\n\n\u00ab DUP TYPE 2 == \u00ab POT. \u00bb \u00ab PO. \u00bb IFTE \u00bb\n'POG. <strong>STO<\/strong>         # Version g\u00e9n\u00e9rale<\/pre>\n<p>V\u00e9rifions :<\/p>\n<pre>2: \"APL ET RPL\"\n1: \"TROPICALE \"\n<strong>VAR<\/strong> POG.\n\n1: { 7. 4. 8. 10. 9. 1. 10. 2. 4. 8. }\n# \"A\" \u00e0 la 7e position dans \"TROPICALE \", etc. \n\n2: { 3 1 4 1 5 9 }\n1: { 1 4 1 4 2 1 3 5 }\n<strong>VAR<\/strong> POG.\n\n1: { 7. 1. 2. 1. 8. 0. }\n# Le 3 est \u00e0 la 7e position, le 9 n'y est pas<\/pre>\n<p>Remarquez qu&rsquo;en APL et RPL, POS renvoie la premi\u00e8re position trouv\u00e9e, par exemple&nbsp;4 4 4 \u2373 4 donne 1 (et non pas 2 ou 3).<\/p>\n<h2>Exercice &#8211; Nombre de voyelles<\/h2>\n<p>En vous inspirant des programmes pr\u00e9c\u00e9dents, cr\u00e9ez une fonction&nbsp;<strong>VOY<\/strong>&nbsp;comptant le nombre de voyelles A, E, I, O, U dans une chaine de caract\u00e8res.<\/p>\n<pre>1: \"TROPICALE\"\n<strong>VAR<\/strong> VOY\n\n1: 4       # Il y a 4 voyelles<\/pre>\n<p><span style=\"text-decoration: underline\">Corrig\u00e9<\/span>&nbsp;: On va chercher \u00e0 quelles positions se trouvent les lettres du mot \u00ab\u00a0TROPICALE\u00a0\u00bb dans la chaine \u00ab\u00a0AEIOU\u00a0\u00bb. Nous aurons alors une liste avec des 0 (lettres non trouv\u00e9es) ou un nombre strictement positif indiquant la position. En appliquant la fonction SIGN, les valeurs positives se transformeront en 1 (0 reste 0) et il suffira de faire une r\u00e9duction par la somme (\u2211LIST). Ce qui donne :<\/p>\n<pre>\u00ab \"AEIOU\" POG. SIGN \u2211LIST \u00bb\n'VOY <strong>STO<\/strong><\/pre>\n<p>En version \u00ab\u00a0d\u00e9velopp\u00e9e\u00a0\u00bb, on aurait :<\/p>\n<pre>\u00ab \u2192 v \u00ab {\"A\" \"E\" \"I\" \"O\" \"U\" }\n \u00ab v SWAP POS SIGN \u00bb MAP\n \u2211LIST \u00bb\n\u00bb\n'VOY <strong>STO<\/strong><\/pre>\n<p>En APL, on utilisera&nbsp; le symbole d&rsquo;appartenance \u220a pour obtenir 0 ou 1 plut\u00f4t que la position :<\/p>\n<pre>+\/ 'TROPICALE' \u220a 'AEIOU'\nOutput : 4<\/pre>\n<h2>Exercice &#8211; Conversion en chiffres romains<\/h2>\n<p>Je reprends <a title=\"Silicium\" href=\"http:\/\/www.silicium.org\/forum\/viewtopic.php?f=46&amp;t=39213\" target=\"_blank\" rel=\"noopener\">l&rsquo;exercice propos\u00e9 par caloubugs<\/a> sur le forum Silicium.org, \u00e0 savoir transformer un nombre en chiffres romains.<\/p>\n<p>Pour cela, vous devrez transposer en RPL cette solution en APL :<\/p>\n<pre>ROM \u2190 {\n +\/ (\u00af1 + 2 \u00d7 z \u2265 1\u2193z,0) \u00d7 \n z \u2190 (1 5 10 50 100 500 1000)['IVXLCDM' \u2373 \u2375]\n}\n\nROM 'MDCCCLXXVI'\nOutput: 1876<\/pre>\n<p><span style=\"text-decoration: underline\">Quelques explications<\/span> :<\/p>\n<ul>\n<li>&lsquo;IVXLCDM&rsquo; \u2373 \u2375&nbsp; donne les positions des lettres de \u2375 (un &lsquo;X&rsquo; donne 3, un &lsquo;M&rsquo; donne 7 etc.<\/li>\n<li>(1 5 10 50 100 500 1000)[&#8230;] pour la r\u00e9cup\u00e9ration des valeurs<\/li>\n<li>1\u2193z,0 permet de supprimer la t\u00eate de la liste et ajout 0 en fin<\/li>\n<li>z \u2265&nbsp; On cherche les endroits o\u00f9 il faudra soustraire<\/li>\n<li>\u00af1 + 2 \u00d7 Les 0 deviennent -1 et les 1 des 1<\/li>\n<\/ul>\n<p><span style=\"text-decoration: underline\">Corrig\u00e9<\/span> :<\/p>\n<p>&lsquo;IVXLCDM&rsquo; \u2373 \u2375 va se traduire par <strong>POT.<\/strong> :<\/p>\n<pre>2: 'MDCCCLXXVI'\n1: 'IVXLCDM'\n<strong>VAR<\/strong> POT.\n\n1: {7. 6. 5. 5. 5. 4. 3. 2. 1.}<\/pre>\n<p>La r\u00e9cup\u00e9ration des valeurs par <strong>GLT.<\/strong> :<\/p>\n<pre>2: {7. 6. 5. 5. 5. 4. 3. 2. 1.}\n1: {1 5 10 50 100 500 1000}\n<strong>VAR<\/strong> GLT.\n\n1: {1000 500 100 100 100 50 10 5 1}<\/pre>\n<p>Pour 1\u2193z,0 on utilise TAIL et 0 + ajoutera un z\u00e9ro \u00e0 la fin de la liste.<\/p>\n<pre>1: {1000 500 100 100 100 50 10 5 1}\n<strong>PRG<\/strong> LIST ELEM TAIL\n0 +\n\n1: {500 100 100 100 50 10 5 1 0}<\/pre>\n<p>On cr\u00e9e le vecteur logique avec \u2265 puis il suffira de le multiplier par 2 et soustraire 1.<br>\nOn termine en faisant la somme des produits des 2 listes : \u00d7 \u2211LIST. On ajoute un 0 \u00e0 la liste car&nbsp;\u2211LIST ne fonctionne pas avec une liste contenant un seul \u00e9l\u00e9ment.<\/p>\n<p><span style=\"text-decoration: underline\">Programme final<\/span> :<\/p>\n<pre>\u00ab \"IVXLCDM\" POT. { 1 5 10 50 100 500 1000 } GLT.\n DUP DUP TAIL 0 + \u2265 2 \u00d7 1 - \u00d7 0 + \u2211LIST\n\u00bb\n'ROM <strong>STO<\/strong><\/pre>\n<p>V\u00e9rifions :<\/p>\n<pre>1: \"MMMCMXCIX\"\n<strong>VAR<\/strong> ROM\n\n1: 3999\n\n1: \"MMCCCXLV\"\n<strong>VAR<\/strong> ROM\n\n1: 2345<\/pre>\n<h2>Exercice &#8211; Union<\/h2>\n<p>En APL, il existe une fonction qui permet de r\u00e9cup\u00e9rer les \u00e9l\u00e9ments de fa\u00e7on unique :<\/p>\n<pre>\u222a 1 2 3 2 1 2 2 3\n1 2 3<\/pre>\n<p>Malheureusement il n&rsquo;existe pas de fonction union sur les HP-48\/49\/50g (M\u00eame s&rsquo;il existe des biblioth\u00e8ques toutes pr\u00eates comme GoferList dont le code source n&rsquo;est h\u00e9las pas donn\u00e9). Remarquons cependant que l&rsquo;union<br>\npeut \u00eatre vue comme une r\u00e9duction :<\/p>\n<pre>{\u237a \u220a \u2375: \u2375 \u22c4 \u237a,\u2375} \/ 1 2 3 2 1 2 2 3\n1 2 3<\/pre>\n<p>L&rsquo;accolade utilise une notation assez classique :<\/p>\n<p style=\"text-align: center\"><strong>{ test : valeur_si_vrai \u22c4 valeur_si_faux }<\/strong><\/p>\n<ul>\n<li>Au premier tour, APL prend les 2 derniers \u00e9l\u00e9ments du vecteur (\u237a = 2 et \u2375 = 3) et fait le test 2 \u220a 3.<\/li>\n<li>Comme celui-ci est faux, on obtient la concat\u00e9nation de 2 et 3 (\u237a,\u2375) c&rsquo;est-\u00e0-dire le vecteur 2 3<\/li>\n<li>Au 2e tour, APL prend le \u237a = 2 (le 3e en partant de la droite) puis fait le test 2 \u220a 2 3<\/li>\n<li>Comme le test est vrai, on obtient \u2375 c&rsquo;est-\u00e0-dire le vecteur pr\u00e9c\u00e9dent.<\/li>\n<li>Donc \u00e0 chaque \u00e9tape, si le nouvel \u00e9l\u00e9ment \u237a appartient d\u00e9j\u00e0 \u00e0 la liste pr\u00e9c\u00e9dente \u2375, on garde \u2375 sinon on ajoute \u237a (au d\u00e9but du vecteur)<\/li>\n<\/ul>\n<p><span style=\"text-decoration: underline\">Voici une traduction possible en RPL<\/span>&nbsp;(Inspir\u00e9 de Gilles59)&nbsp;:<\/p>\n<pre>\u00ab {{}} SWAP + \n \u00ab DUP2 POS { DROP } { + } IFTE \u00bb STREAM\n\u00bb\n'UN. STO\n\n1: {1 2 3 2 1 2 2 3}\n<strong>VAR<\/strong> UN.\n1: {1 2 3}<\/pre>\n<p><span style=\"text-decoration: underline\">Explications<\/span> :<\/p>\n<ul>\n<li>On veut cr\u00e9er une liste et ajouter les valeurs au fur et \u00e0 mesure, l&rsquo;id\u00e9e est de partir de la liste vide {} que l&rsquo;on ins\u00e8re en t\u00eate de celle fournie par l&rsquo;utilisateur. Ainsi {1 2 3 2 1 2 2 3} va devenir<br>\n{{} 1 2 3 2 1 2 2 3}.<\/li>\n<li>Au premier tour, on a&nbsp; {} au niveau 2 et la valeur 1 au niveau 1. On duplique ces 2 valeurs d&rsquo;o\u00f9 4 \u00e9l\u00e9ments dans la pile : {} 1 {} 1<\/li>\n<li>On cherche la position de 1 dans {}, comme il n&rsquo;y est pas, RPL renvoie 0.<\/li>\n<li>On fait un If Then Else (IFTE) qui a \u00e9galement la structure :<br>\n<strong>Test \/ Op\u00e9ration_si_vraie \/ Op\u00e9ration_si_faux<\/strong>. Dans notre cas, il applique \u00ab\u00a0+\u00a0\u00bb et donc ajoute le 1 \u00e0 la liste {}, ce qui donne {1}.<\/li>\n<li>Au second tour, on regarde si 2 existe dans {1}, comme ce n&rsquo;est pas le cas on l&rsquo;ajoute {1 2}, idem avec le 3 ce qui donne {1 2 3}<\/li>\n<li>Au 4e tour, on teste si 2 existe dans {1 2 3} ce qui est le cas, on supprime (DROP) l&rsquo;\u00e9l\u00e9ment du niveau 1 et on r\u00e9cup\u00e8re la liste pr\u00e9c\u00e9dente.<\/li>\n<\/ul>\n<p><span style=\"text-decoration: underline\">Remarque<\/span> : Comme on l&rsquo;a dit, APL travaille de la droite vers la gauche, on aura donc :<\/p>\n<pre>{\u237a \u220a \u2375: \u2375 \u22c4 \u237a,\u2375} \/ 4 5 4\n5 4<\/pre>\n<p>Alors qu&rsquo;en RPL :<\/p>\n<pre>{ 4 5 4 }\n<strong>VAR<\/strong> UN.\n{ 4 5 }<\/pre>\n\n\n<p><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/apl-et-rpl-scan\/\">Lire la suite&#8230;<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Extraction d&rsquo;\u00e9l\u00e9ments En APL, il est facile d&rsquo;extraire les \u00e9l\u00e9ments d&rsquo;un vecteur&nbsp;en utilisant une liste de positions : 3 7 8 9 10 14 [2 4 1 1 2] 7 9 3 3 7 \u235d Les 2e, 4e, 1er&#8230; \u00e9l\u00e9ments &hellip; <a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/apl-et-rpl-extraire\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":4913,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-117","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages\/117","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/users\/4913"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/comments?post=117"}],"version-history":[{"count":1,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages\/117\/revisions"}],"predecessor-version":[{"id":1611,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/pages\/117\/revisions\/1611"}],"wp:attachment":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/media?parent=117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}