{"id":266,"date":"2022-06-07T07:03:52","date_gmt":"2022-06-07T06:03:52","guid":{"rendered":"https:\/\/blog.univ-angers.fr\/mathsinfo\/?p=266"},"modified":"2022-06-19T08:02:32","modified_gmt":"2022-06-19T07:02:32","slug":"kata6","status":"publish","type":"post","link":"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/06\/07\/kata6\/","title":{"rendered":"Sixi\u00e8me exercice en Python, JavaScript et APL"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-5.png\"><img loading=\"lazy\" decoding=\"async\" width=\"784\" height=\"435\" src=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-5.png\" alt=\"\" class=\"wp-image-267\" srcset=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-5.png 784w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-5-300x166.png 300w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-5-768x426.png 768w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-5-500x277.png 500w\" sizes=\"auto, (max-width: 784px) 100vw, 784px\" \/><\/a><\/figure>\n\n\n\n<p><span style=\"text-decoration: underline\">R\u00e9sum\u00e9 en fran\u00e7ais<\/span> : Vous devez cr\u00e9er un programme qui \u00e0 partir d&rsquo;une phrase, met tous les mots distincts dans une liste et retourne une chaine donnant les positions des mots de la phrase initiale dans cette liste. On ne tiendra pas compte de la casse.<\/p>\n\n\n\n<p>Voici un autre exemple pour mieux comprendre :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>phrase = 'The number 0 is such a strange number <span style=\"text-decoration: underline\">Strangely<\/span> it has zero meaning'\n\n&gt;&gt; compress(phrase)\n'01234561<span style=\"text-decoration: underline\">7<\/span>891011'<\/code><\/pre>\n\n\n\n<p>En effet, la liste des mots uniques est :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#091;'the', 'number', '0', 'is', 'such', 'a', 'strange', 'strangely', 'it', 'has', 'zero', 'meaning']<\/code><\/pre>\n\n\n\n<p>Il faut donc bien voir que le mot &lsquo;strangely&rsquo; est \u00e0 la 8e place dans la phrase initiale mais \u00e0 la 7e place dans la liste des mots uniques, c&rsquo;est donc 7 qu&rsquo;il faut r\u00e9cup\u00e9rer en non 8.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Version classique avec boucles<\/h2>\n\n\n\n<p>On peut commencer par <em>cr\u00e9er la liste des mots uniques<\/em> trouv\u00e9s dans la phrase et dans un second temps parcourir \u00e0 nouveau <em>tous les mots de la phrase pour trouver leurs positions<\/em> dans cette liste. Premi\u00e8re \u00e9tape :<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">python<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>def compress(phrase):\n    mots = &#091;]                          # Tableau des mots uniques\n    for m in phrase.lower().split():   # On parcourt chaque mot\n        if m not in mots:              # Nouveau mot ?\n            mots.append(m)             # On l'ajoute \u00e0 la liste\n    return mots\n\n&gt;&gt; compress('The number 0 is such a strange number Strangely it has zero meaning')\n&#091;'the', 'number', '0', 'is', 'such', 'a', 'strange', 'strangely', 'it', 'has', 'zero', 'meaning']<\/code><\/pre>\n\n\n\n<p>Remarquez qu&rsquo;en Python, <strong>split<\/strong> peut s&rsquo;utiliser sans param\u00e8tre (par d\u00e9faut ce sera <strong>espace<\/strong>) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; 'ab cd'.split()\n&#091;'ab', 'cd']<\/code><\/pre>\n\n\n\n<p>On peut maintenant chercher les <strong>positions<\/strong> des mots dans la liste des mots uniques en utilisant <strong>index<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; &#091;'the', 'number', '0', 'is'].index('is')  # Position de 'is' ?\n3<\/code><\/pre>\n\n\n\n<p>Ce qui donne cette <strong>version finale<\/strong> <a href=\"https:\/\/tio.run\/##XU@7bsMwDNz9FbdZWowC3Qr0K9otyKDadMTCIgVKRpv8vONHmwK97Z4E87VGledlGWhErykbleJytFDIvzRYMVCvc8YrDrWb9IvM@a7kiavzeyZpLWvidN7ZqIYElp\/qMbOBx1UXrZu3Vf6c35Eu5EwyuHTsGtXZBG3bfSqLO6FUc3uOZaDvNeb\/X8PZN002luoe\/7TvkSBz@iDDE7igzH1E2NaCXB7W20GnK7gihoIbmSJREJZL6\/2y3AE\" target=\"_blank\" rel=\"noreferrer noopener\">\u00e0 tester ici<\/a> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def compress(phrase):\n    decoup = phrase.lower().split()\n    mots = &#091;]\n    for m in decoup:\n        if m not in mots:\n            mots.append(m)\n    return ''.join(&#091; str(mots.index(m)) for m in decoup ])\n\n&gt;&gt; compress('The number 0 is such a strange number Strangely it has zero meaning')\n'012345617891011'<\/code><\/pre>\n\n\n\n<p><strong>str<\/strong> permet de convertir un nombre en chaine.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">javascript<\/h3>\n\n\n\n<p>La premi\u00e8re partie pour rechercher les mots uniques peut \u00eatre faite comme en Python ou en utilisant <strong>reduce<\/strong> (puisque l&rsquo;on part d&rsquo;un tableau vide <strong>[ ]<\/strong> et que l&rsquo;on va ajouter au fur et \u00e0 mesure les mots nouveaux). Ce qui donne :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var compress = phrase =&gt; {\n  decoup = phrase.toLowerCase().split(' ')\n  mots = decoup.reduce((a, m) =&gt; a.includes(m) ? a : a.concat(m), &#091;])\n  return mots\n}\n\n&gt;&gt; compress('The number 0 is such a strange number Strangely it has zero meaning')\n&#091;'the', 'number', '0', 'is', 'such', 'a', 'strange', 'strangely', 'it', 'has', 'zero', 'meaning']<\/code><\/pre>\n\n\n\n<p>Ensuite, pour la seconde partie, il s&rsquo;agit de <strong>transformer<\/strong> (<strong>map<\/strong>) chaque mot en sa position dans la liste des mots uniques. Voici 2 exemples d&rsquo;utilisation de <strong>map<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; &#091;1, 5, 10].map(v =&gt; v * v)     \/\/ On met chaque \u00e9l\u00e9ment au carr\u00e9\n&#091;1, 25, 100]\n\n&gt;&gt; &#091;'abra','cada','bra'].map(m =&gt; m&#091;0].toUpperCase())\n&#091;'A', 'C', 'B']     \/\/ Premi\u00e8re lettre de chaque mot en majuscule<\/code><\/pre>\n\n\n\n<p>D&rsquo;o\u00f9 cette <a href=\"https:\/\/tio.run\/##PY89TwMxDIb3@xXekogSMSMVBtZKDLAhBpMzvVSXOLKT8iV@@5Gjajf7tZ\/H8gGPqEFiqdeZR1qWIwoETkVIFbZQJkEl2N7BzwAwUuBWLrGvvOMPkodeW@e1zLFaA8b11cR15U@EFxpbIGtxA8mtNvQxh7mNpLYH94Bw27PAOWDtyQZeXleLUG2Sz5aExaaVNgau\/i90y0ifj@8dcf7AMVtjHAy\/w9BVyjP5mff2\/I81zxNBbumNBG4gKmgLU7@tVTDvL6OnUzt\/QawwocI3CUMizDHvjXPL8gc\" target=\"_blank\" rel=\"noreferrer noopener\">version finale \u00e0 tester ici<\/a> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var compress = phrase =&gt; {\n  decoup = phrase.toLowerCase().split(' ')\n  mots = decoup.reduce((a, m) =&gt; a.includes(m) ? a : a.concat(m), &#091;])\n  return decoup.map(m =&gt; '' + mots.indexOf(m)).join('') \n}<\/code><\/pre>\n\n\n\n<p>Le <strong>\u00a0\u00bb +<\/strong> permet de convertir un nombre en chaine. Par exemple <strong>\u00a0\u00bb + 2<\/strong> donne <strong>&lsquo;2&rsquo;<\/strong>, on peut aussi utiliser <strong>(2).toString()<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Autres pistes : dictionnaires, ensembles&#8230;<\/h2>\n\n\n\n<p>Nous avons d\u00e9j\u00e0 vu l&rsquo;utilisation de <strong>set<\/strong> pour cr\u00e9er des <strong>ensembles<\/strong> en Python\/JavaScript et APL (<strong>\u222a<\/strong>). La premi\u00e8re partie peut alors se simplifier en :<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">javascript<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>var compress = phrase =&gt; {\n  decoup = phrase.toLowerCase().split(' ')\n  mots = &#091;...new Set(decoup)]     \/\/ Liste des mots uniques\n  return decoup.map(m =&gt; '' + mots.indexOf(m)).join('') \n}\n\n&gt;&gt; compress('The number 0 is such a strange number Strangely it has zero meaning')\n'012345617891011'<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">python<\/h3>\n\n\n\n<p>Nous aurions \u00e9galement pu utiliser un <strong>dictionnaire<\/strong>, voici une \u00e9criture en Python :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; dict.fromkeys('a b B A C b a'.lower().split())\n{'a': None, 'b': None, 'c': None}\n\n&gt;&gt; list(dict.fromkeys('a b B A C b a'.lower().split()))\n&#091;'a', 'b', 'c']<\/code><\/pre>\n\n\n\n<p>Ce qui donne ce <strong>programme final <\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def compress(phrase):\n  decoup = phrase.lower().split()  \n  mots = list(dict.fromkeys(decoup))     # Liste des mots uniques\n  return ''.join(str(mots.index(m)) for m in decoup)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">APL<\/h2>\n\n\n\n<p>Nous avons d\u00e9j\u00e0 vu dans l&rsquo;exercice pr\u00e9c\u00e9dent comment s\u00e9parer les mots en utilisant \u2286 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      {(' '\u2260\u2375) \u2286 \u2395C \u2375} 'LisTe dE MotS'\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2510\n\u2502liste\u2502de\u2502mots\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n\n\n\n<p>Et \u2373 (<strong>iota<\/strong>) permet (en version dyadique, c&rsquo;est-\u00e0-dire avec 2 arguments) de trouver la <strong>position<\/strong> d&rsquo;une valeur dans un vecteur :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      4 8 7 9 \u2373 7    \u235d Quelle est la position du 7 dans le vecteur ?\n3<\/code><\/pre>\n\n\n\n<p>Pour r\u00e9cup\u00e9rer les <strong>mots uniques<\/strong>, on peut utiliser <strong>\u222a<\/strong> ou <strong>key<\/strong> (\u2338) plus g\u00e9n\u00e9ral qui permet de synth\u00e9tiser des informations :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      {\u237a,\u2375}\u2338 'a' 'b' 'b' 'a' 'c' 'b' 'a'     \u235d Lettres et positions\na 1 4 7\nb 2 3 6\nc 5    \n      {\u237a}\u2338 'a' 'b' 'b' 'a' 'c' 'b' 'a'       \u235d Que les lettres\nabc\n\n      \u222a 'a' 'b' 'b' 'a' 'c' 'b' 'a'          \u235d Plus simple avec \u222a\nabc<\/code><\/pre>\n\n\n\n<p>Un exemple pour mieux comprendre l&rsquo;utilisation de \u2373 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      'un' 'deux' 'trois' \u2373 'deux' 'deux' 'trois' 'un' 'un'\n2 2 3 1 1<\/code><\/pre>\n\n\n\n<p><span style=\"text-decoration: underline\">Ce qui signifie<\/span> : quelles sont les positions des mots &lsquo;deux&rsquo; &lsquo;deux&rsquo; &lsquo;trois&rsquo; &lsquo;un&rsquo; &lsquo;un&rsquo; dans le vecteur &lsquo;un&rsquo; &lsquo;deux&rsquo; &lsquo;trois&rsquo; ?<\/p>\n\n\n\n<p>Enfin, en APL, il est possible de simplifier des \u00e9critures du type :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(\u237a f \u2375) g (\u237a h \u2375)<\/code><\/pre>\n\n\n\n<p>C&rsquo;est-\u00e0-dire calculer <strong>\u237a f \u2375<\/strong> o\u00f9 <strong>f<\/strong> est une fonction dyadique, calculer <strong>\u237a h \u2375<\/strong> avec <strong>h<\/strong> \u00e9galement dyadique et enfin appliquer <strong>g<\/strong> aux 2 r\u00e9sultats trouv\u00e9s (<strong>g<\/strong> dyadique \u00e9galement). La version simplifi\u00e9e est :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u237a (f g h) \u2375<\/code><\/pre>\n\n\n\n<p>Exemple avec <strong>f = +<\/strong>, <strong>h = \u2308<\/strong> et <strong>g = \u00d7<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      (2 + 3) \u00d7 (2 \u2308 3)   \u235d 5 \u00d7 3 (= le plus grand entre 2 et 3)\n15\n\n      2 (+ \u00d7 \u2308) 3         \u235d Notation appel\u00e9e \"train\" ou \"fork\"\n15<\/code><\/pre>\n\n\n\n<p>De la m\u00eame fa\u00e7on :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n(f \u2375) g (h \u2375) peut s'\u00e9crire (f g h) \u2375<\/code><\/pre>\n\n\n\n<p>Exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      (\u230a\/ \u00d7 \u2308\/) 3 7 2 9 5\n18<\/code><\/pre>\n\n\n\n<p><span style=\"text-decoration: underline\">Explications<\/span> : On cherche la plus petite des valeurs (<strong>\u230a\/<\/strong>), c&rsquo;est-\u00e0-dire 2 et la plus grande (<strong>\u2308\/<\/strong>) c&rsquo;est-\u00e0-dire 9 puis on les multiplie, ce qui donne 18.<\/p>\n\n\n\n<p><strong>Programme final<\/strong> en APL :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      \u2395IO \u2190 0\n      compress \u2190 {,\/\u2355\u00a8(\u222a \u2373 \u22a2)(' '\u2260\u2375) \u2286 \u2395C \u2375}\n\n      compress 'The number 0 is such a strange number Strangely it has zero meaning'\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502012345617891011\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n\n\n\n<p>Le <strong>,\/<\/strong> sert \u00e0 concat\u00e9ner les termes et <strong>\u2355\u00a8<\/strong> \u00e0 convertir en chaine chaque position num\u00e9rique trouv\u00e9e.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline\">La traduction du programme est donc<\/span> : Prendre le param\u00e8tre (<strong>\u2375<\/strong>), le convertir en minuscules (<strong>\u2395C<\/strong>), s\u00e9parer la phrase en utilisant les espaces <strong>(&lsquo; &lsquo;\u2260\u2375) \u2286<\/strong>, prendre les \u00e9l\u00e9ments uniques (<strong>\u222a<\/strong>) et cherchez les positions (<strong>\u2373<\/strong>) des mots (<strong>\u22a2<\/strong> correspond \u00e0 ce que l&rsquo;on a \u00e0 droite). Transformez toutes les positions en chaines (<strong>\u2355\u00a8<\/strong>) et en faire la concat\u00e9nation (<strong>,\/<\/strong>).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>R\u00e9sum\u00e9 en fran\u00e7ais : Vous devez cr\u00e9er un programme qui \u00e0 partir d&rsquo;une phrase, met tous les mots distincts dans une liste et retourne une chaine donnant les positions des mots de la phrase initiale dans cette liste. On ne &hellip; <a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/06\/07\/kata6\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":4913,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-266","post","type-post","status-publish","format-standard","hentry","category-twitter"],"_links":{"self":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/266","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/types\/post"}],"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=266"}],"version-history":[{"count":22,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/266\/revisions"}],"predecessor-version":[{"id":655,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/266\/revisions\/655"}],"wp:attachment":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/media?parent=266"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/categories?post=266"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/tags?post=266"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}