{"id":489,"date":"2022-06-13T06:38:48","date_gmt":"2022-06-13T05:38:48","guid":{"rendered":"https:\/\/blog.univ-angers.fr\/mathsinfo\/?p=489"},"modified":"2022-06-19T08:03:27","modified_gmt":"2022-06-19T07:03:27","slug":"kata12","status":"publish","type":"post","link":"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/06\/13\/kata12\/","title":{"rendered":"Douzi\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-18.png\"><img loading=\"lazy\" decoding=\"async\" width=\"704\" height=\"788\" src=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-18.png\" alt=\"\" class=\"wp-image-552\" srcset=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-18.png 704w, https:\/\/blog.univ-angers.fr\/mathsinfo\/files\/2022\/06\/image-18-268x300.png 268w\" sizes=\"auto, (max-width: 704px) 100vw, 704px\" \/><\/a><\/figure>\n\n\n\n<p><span style=\"text-decoration: underline\">R\u00e9sum\u00e9 en fran\u00e7ais<\/span> : On vous donne une chaine de caract\u00e8res compos\u00e9e de \u00ab\u00a0chiffres\u00a0\u00bb (&lsquo;0&rsquo; \u00e0 &lsquo;9&rsquo;). Vous devez \u00e9crire une fonction qui renvoie une chaine o\u00f9 chaque chiffre est r\u00e9p\u00e9t\u00e9 le nombre de fois correspondant \u00e0 sa valeur. Par exemple avec la chaine \u00ab\u00a0312\u00a0\u00bb, on doit r\u00e9p\u00e9ter 3 fois le \u00ab\u00a03\u00a0\u00bb, 1 fois le \u00ab\u00a01\u00a0\u00bb et 2 fois le \u00ab\u00a02\u00a0\u00bb, ce qui donne la chaine \u00ab\u00a0333122\u00a0\u00bb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Version classique<\/h2>\n\n\n\n<p><span style=\"text-decoration: underline\">Premi\u00e8re id\u00e9e<\/span>, utiliser <strong>2 boucles<\/strong>. La <strong>premi\u00e8re<\/strong> pour <strong>r\u00e9cup\u00e9rer<\/strong> un \u00e0 un les caract\u00e8res de la chaine et la <strong>seconde<\/strong> pour <strong>dupliquer<\/strong> le bon nombre de fois chacun de ces caract\u00e8res.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">python<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>def explose(s):\n  sortie = ''                      # initialisation du r\u00e9sultat final\n  for c in s:                      # on parcourt la chaine\n    for n in range(int(c)):        # on ajoute le bon nombre de fois...\n      sortie += c                  # ...le caract\u00e8re\n  return sortie                    # retour du r\u00e9sultat\n\n&gt;&gt;  explose(\"312\")\n'333122'\n&gt;&gt; explose(\"302\")\n'33322'\n&gt;&gt; explose(\"102269\")\n'12222666666999999999'<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Une seule boucle + r\u00e9p\u00e9ter<\/h2>\n\n\n\n<p>En Python, JavaScript ou APL, il est simple de r\u00e9p\u00e9ter un caract\u00e8re :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><span style=\"text-decoration: underline\">Python<\/span>\n\n&gt;&gt; 'a' * 5\n'aaaaa'\n\n<span style=\"text-decoration: underline\">JavaScript<\/span>\n\n&gt;&gt; 'a'.repeat(5)\n'aaaaa'\n\n<span style=\"text-decoration: underline\">APL<\/span>\n\n       5 \u2374 'a'\naaaaa<\/code><\/pre>\n\n\n\n<p>On peut \u00e9galement <strong>r\u00e9p\u00e9ter<\/strong> un caract\u00e8re <strong>0 fois<\/strong>, dans ce cas on obtient la <strong>chaine vide<\/strong>. D&rsquo;o\u00f9 cette <strong>seconde version<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><span style=\"text-decoration: underline\">Python<\/span>\n\ndef explose(s):\n  sortie = ''\n  for c in s:\n    sortie += c * int(c)        # on r\u00e9p\u00e8te le caract\u00e8re\n  return sortie\n\n<span style=\"text-decoration: underline\">JavaScript<\/span>\n\nconst explose = s =&gt; {\n    sortie = '';\n    for (c of s) sortie += c.repeat(+c);     \/\/ Voir dessous pour +c\n    return sortie\n}\n\n&gt;&gt; + '5'             \/\/ Transformer une chaine en nombre\n5\n\n&gt;&gt; Number('5')       \/\/ M\u00eame chose que Number\n5<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Autres \u00e9critures : join, map, reduce<\/h2>\n\n\n\n<p>Nous devons <strong>transformer<\/strong> (<strong>map<\/strong>) chaque caract\u00e8re en sa r\u00e9p\u00e9tition, ce qui donne un tableau de taille celle de la chaine initiale :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><span style=\"text-decoration: underline\">Python<\/span>\n\n&gt;&gt; &#091;c * int(c) for c in \"312\"]         # Transformer 3 \"chiffres\"\n&#091;'333', '1', '22']                     # Tableau \u00e0 3 \u00e9l\u00e9ments\n\n<span style=\"text-decoration: underline\">JavaScript<\/span>\n\n&gt;&gt; &#091;...\"312\"].map(c =&gt; c.repeat(+c))   \/\/ map = transformation\n&#091;'333', '1', '22']\n\n<span style=\"text-decoration: underline\">APL<\/span>\n\n     3 1 2 \u2374\u00a8 '312'      \u235d le \u00a8 signifie \"pour chaque\"\n\u250c\u2500\u2500\u2500\u252c\u2500\u252c\u2500\u2500\u2510\n\u2502333\u25021\u250222\u2502\n\u2514\u2500\u2500\u2500\u2534\u2500\u2534\u2500\u2500\u2518<\/code><\/pre>\n\n\n\n<p>Il suffit ensuite de <strong>joindre<\/strong> les diff\u00e9rents \u00e9l\u00e9ments, d&rsquo;o\u00f9 cette <strong>troisi\u00e8me version<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><span style=\"text-decoration: underline\">Python<\/span>\n\ndef explose(s):\n  return ''.join(c * int(c) for c in s)\n\n&gt;&gt; explose(\"44012\")\n'44444444122'\n\n<span style=\"text-decoration: underline\">JavaScript v1<\/span>\n\nconst explose = s =&gt; &#091;...s].map(c =&gt; c.repeat(+c)).join('')\n\n&gt;&gt; explose('55011')\n'555555555511'\n\nJavaScript est tol\u00e9rant sur les m\u00e9langes de types :\n\n&gt;&gt; 'a'.repeat('3')     \/\/ utilisation de '3' au lieu de 3\n'aaa'\n&gt;&gt; 3 * '4'             \/\/ multiplication d'un nombre par un caract\u00e8re\n12\n\n<span style=\"text-decoration: underline\">JavaScript v<\/span>2\n\n&gt;&gt; const explose = s =&gt; &#091;...s].map(c =&gt; c.repeat(c)).join``<\/code><\/pre>\n\n\n\n<p>On peut \u00e9galement utiliser <strong>reduce<\/strong>, c&rsquo;est-\u00e0-dire partir d&rsquo;une chaine vide et au fur et \u00e0 mesure ajouter les caract\u00e8res r\u00e9p\u00e9t\u00e9s, voici une version en JavaScript :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const explose = s =&gt; &#091;...s].reduce((a, c) =&gt; a + c.repeat(c), '')\n\n&gt;&gt; explose(\"44012\")\n'44444444122'<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">APL<\/h2>\n\n\n\n<p>Nous avons d\u00e9j\u00e0 vu comment transformer une chaine en vecteur :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      s \u2190 '312'\n\n      \u234e\u00a8s          \u235d On obtient un vecteur de 3 caract\u00e8res\n3 1 2<\/code><\/pre>\n\n\n\n<p>Remarquons que nous devons dupliquer les caract\u00e8res et ensuite les concat\u00e9ner :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      (3 \u2374 '3') (1 \u2374 '1') (2 \u2374 '2')      \u235d On duplique les caract\u00e8res  \n\u250c\u2500\u2500\u2500\u252c\u2500\u252c\u2500\u2500\u2510\n\u2502333\u25021\u250222\u2502\n\u2514\u2500\u2500\u2500\u2534\u2500\u2534\u2500\u2500\u2518\n     ,\/ (3 \u2374 '3') (1 \u2374 '1') (2 \u2374 '2')    \u235d Concat\u00e9nation\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502333122\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n\n\n\n<p>C&rsquo;est exactement ce que fait un <strong>produit interne<\/strong> <strong>f.g<\/strong>, \u00e0 savoir : <br><br><strong>x<sub>1<\/sub> x<sub>2<\/sub> x<sub>3<\/sub>  f.g  y<sub>1<\/sub> y<sub>2<\/sub> y<sub>3<\/sub><\/strong> signifie r\u00e9duction <strong>f\/<\/strong> appliqu\u00e9e \u00e0 <strong>(x<sub>1<\/sub> g y<sub>1<\/sub>) (x<sub>2<\/sub> g y<sub>2<\/sub>) (x<sub>3<\/sub> g y<sub>3<\/sub>) <\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      3 1 2 ,.\u2374 '312'       \u235d On duplique puis concat\u00e8ne\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502333122\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n      {(\u234e\u00a8\u2375) ,.\u2374 \u2375} '312'   \u235d Cr\u00e9ons notre fonction\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502333122\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n      (\u234e\u00a8,.\u2374\u22a2) '31402'      \u235d M\u00eame version sans utiliser \u2375\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u25023331444422\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n\u235d Version finale en APL\n\n      explose \u2190 \u234e\u00a8 ,.\u2374 \u22a2\n\n      explose '314159'\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u250233314444155555999999999\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n      explose \u2190 \u220a \u234e\u00a8 ,.\u2374 \u22a2\n\n      explose '314159'\n33314444155555999999999<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Expressions r\u00e9guli\u00e8res<\/h2>\n\n\n\n<p>Une <strong>autre id\u00e9e<\/strong> est de ce dire que chaque \u00ab\u00a0chiffre\u00a0\u00bb doit \u00eatre <strong>remplac\u00e9<\/strong> par sa duplication. Voyons comment on effectue des remplacements en Python et JavaScript :<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">javascript<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; 'bonjour'.replace('o','*')     \/\/ Un seul 'o' sera remplac\u00e9 par '*'\n'b*njour'\n\n&gt;&gt; 'bonjour'.replace(\/o\/g,'*')    \/\/ Tous les 'o' sont remplac\u00e9s\n'b*nj*ur'                         \/\/ 'g' pour global\n\n&gt;&gt; \"3a1b22\".replace(\/\\d\/g, '*')   \/\/ Remplacer les chiffres (digits)\n'*a*b**'\n\n&gt;&gt; '4032'.replace(\/.\/g, v =&gt; 9 - v)  \/\/ '.' = caract\u00e8re quelconque\n'5967'       \/\/ Les chiffres sont remplac\u00e9s par 9 - valeur\n\n\/\/ Mettre toutes les voyelles en majuscules\n\n&gt;&gt; \"okjaicompris\".replace(\/a|e|i|o|u\/g, c =&gt; c.toUpperCase())\n'OkjAIcOmprIs'<\/code><\/pre>\n\n\n\n<p>D&rsquo;o\u00f9 cette version finale en JavaScript :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const explose = s =&gt; s.replace(\/.\/g, v =&gt; v.repeat(v))<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">python<\/h3>\n\n\n\n<p>Python a la m\u00e9thode <strong>replace<\/strong> pour des remplacements simples. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; 'bonjour'.replace('o','*')     # Tous les 'o' sont remplac\u00e9s\n'b*nj*ur'<\/code><\/pre>\n\n\n\n<p>D&rsquo;o\u00f9 l&rsquo;id\u00e9e de remplacer chacun des caract\u00e8res de &lsquo;0&rsquo; \u00e0 &lsquo;9&rsquo; par leur duplication :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def explose(s):\n    for i in range(10):\n        s = s.replace(str(i), str(i) * i)\n    return s\n\n&gt;&gt; explose('314159')\n'33314444155555999999999'<\/code><\/pre>\n\n\n\n<p>Pour utiliser des <strong>expressions r\u00e9guli\u00e8res<\/strong> (Regex), nous devons importer la biblioth\u00e8que <strong>re<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; import re\n&gt;&gt; re.sub(r'\\d','*','3a1b22')     # Remplacer les chiffres par '*'\n'*a*b**'<\/code><\/pre>\n\n\n\n<p>On peut \u00e9galement effectuer des <strong>transformations<\/strong>, pour cela on :<br>&#8211; <strong>recherche<\/strong> les \u00e9l\u00e9ments \u00e0 modifier \u00e0 l&rsquo;aide d&rsquo;une <strong>expression r\u00e9guli\u00e8re<\/strong><br>&#8211; <strong>r\u00e9cup\u00e8re<\/strong> la chaine correspondante (<strong>group<\/strong> ou <strong>[0]<\/strong>) <br>&#8211; effectue la <strong>transformation<\/strong> (<strong>lambda x : &#8230;<\/strong>)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Mettre toutes les voyelles en majuscules\n\n&gt;&gt; re.sub(r'a|e|i|o|u', lambda x: x.group().upper(), 'okjaicompris')\n'OkjAIcOmprIs'\n\n# Ecriture \u00e9quivalente en utilisant &#091;0]\n\n&gt;&gt; re.sub(r'a|e|i|o|u', lambda x: x&#091;0].upper(), 'okjaicompris')\n'OkjAIcOmprIs'\n\n# Transformer chaque chiffre en 9 - chiffre :\n\n&gt;&gt; re.sub(r'.',lambda x: str(9 - int(x&#091;0])), '4032')\n'5967'<\/code><\/pre>\n\n\n\n<p>Ce qui nous donne cette version finale en Python :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import re\n\ndef explose(s):\n  return re.sub(r'.',lambda v: v&#091;0] * int(v&#091;0]), s)<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>R\u00e9sum\u00e9 en fran\u00e7ais : On vous donne une chaine de caract\u00e8res compos\u00e9e de \u00ab\u00a0chiffres\u00a0\u00bb (&lsquo;0&rsquo; \u00e0 &lsquo;9&rsquo;). Vous devez \u00e9crire une fonction qui renvoie une chaine o\u00f9 chaque chiffre est r\u00e9p\u00e9t\u00e9 le nombre de fois correspondant \u00e0 sa valeur. Par &hellip; <a href=\"https:\/\/blog.univ-angers.fr\/mathsinfo\/2022\/06\/13\/kata12\/\">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-489","post","type-post","status-publish","format-standard","hentry","category-twitter"],"_links":{"self":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/489","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=489"}],"version-history":[{"count":44,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/489\/revisions"}],"predecessor-version":[{"id":661,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/posts\/489\/revisions\/661"}],"wp:attachment":[{"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/media?parent=489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/categories?post=489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.univ-angers.fr\/mathsinfo\/wp-json\/wp\/v2\/tags?post=489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}